やーまんぶろぐ

気が向いた時にだけ書くブログ

AWS Lambdaを使ってS3にアップロードされた画像を自動でLINE登録用画像に変換してみる

以前、Node.jsで画像変換のスクリプトを作成しました。
yamano3201.hatenablog.jp

今回は、AWS Lambdaを使ってS3にアップロードされた画像をLINE登録用画像に変換してみることにしました。

いくつか注意するところがあったので、まとめておきます。

コード

Create a Lamda functionボタンを押すと、Select blueprintというサンプルコードが選択できます。
ここではs3-get-objectのサンプルコードを元に作成しています。
※ 元にしているだけなので、作成時はSelect blueprintをスキップしていただいて構いません。

s3.getObjectが成功したら、画像変換を実行してS3にputするコードになっています。

ZIP化してアップロードする

npmを使用する場合はZIP化してアップロードする必要があります。
今回はgmを使用したので、その手順をのせておきます。

mkdir node_modules
npm install gm
# 上のコードをindex.jsファイルとして作成
zip -r myfunc.zip index.js node_modules

ここで作成されたmyfunc.zipファイルをアップロードしました。

S3にアクセスできるロールを作成(事前作業)

Lambda function handler and roleでS3にアクセスできる権限のあるロールを選択しなければなりません。
初回であれば選択するものがないので事前に作成する必要があります。

下に作成手順をのせておきます。

  1. IAMへ移動
  2. ロールを選択
  3. 新しいロールの作成 ボタンを押す
  4. ロール名を「S3ExecutionRole(任意)」
  5. ロールタイプ「AWS Lambda」を選択
  6. ポリシーのアタッチで「AmazonS3FullAccess」を選択

作成したS3ExcutionRoleをLambdaのConfiguration -> Roleで選択すればOKです。

Timeoutを長くする

デフォルト3秒なので、「Task timed out after 3.00 seconds」というエラーが発生していました。
ここでは1分にしておきました。

下に設定の手順をのせておきます。

  1. 作成したfunctionを選択
  2. Configurationタブを選択
  3. Advanced settingsのTimeoutの値を1minに変更

S3のバケットを作成してPUTを許可する(事前作業)

バケットを作成して、CORS 設定を編集してPUTを許可する必要があります。

今回は下の設定に修正しました。

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
    <CORSRule>
        <AllowedOrigin>*</AllowedOrigin>
        <AllowedMethod>GET</AllowedMethod>
        <AllowedMethod>PUT</AllowedMethod>
        <AllowedHeader>*</AllowedHeader>
    </CORSRule>
</CORSConfiguration>

作成したS3バケットを指定する

手順のせておきます。

  1. 作成したfunctionを選択
  2. Event sources タブを選択
  3. Add event sourceを押す
  4. Event source typeに「S3」を選択
  5. Buketに上で作成したバケットを選択
  6. Event typeに「Object Created(All)」を選択
  7. Suffixに「.JPG」を選択

※ Suffixは大文字、小文字を区別しているので注意

S3 のバケットにファイルが置かれるテスト

Lambdaはテストがつらかったですね。。
コード修正して、ZIP化してアップロードして、Testのボタンを押して、Log outputでログを見る。。

今回はつらかったけど上に書いたやり方でテストしました。

テストの手順ものせておきます。

  1. 作成したfunctionを選択
  2. Actionsボタンを押して、「Configure test event」を選択
  3. Sample event templateから「S3 PUT」を選択

そのまま実行すると、下のようなエラーが出ます。

{
  "errorMessage": "Error getting object HappyFace.jpg from bucket sourcebucket. Make sure they exist and your bucket is in the same region as this function."
}

nameを「sourcebucket」からさきほど作成したバケットの名前に変更、
keyを「HappyFace.jpg」から事前に置いておいたファイル名に変更して実行しましょう。

最後に

もう少しなんかやった気もするけど、覚えている範囲で書きました。

下のリンクみたいに、スマホからS3にアップロードできるようにしたいなー

http://stockcode.info/アプリ/monacaで写真を撮影してサーバーにアップロードする/

気が向いたら、また書きます。