production.log

株式会社リブセンスでエンジニアをやっている星直史のブログです。

【ServerlessFramework】S3のオブジェクト格納をトリガーにLambdaを動かす方法

概要

S3に何かしらのオブジェクトを配置したことをトリガーにLambdaを動かす設定について紹介します。 runtimeはnode.jsです。

lambdaの処理を書く

lambdaにはトリガーが正常に動いていることだけを確認すれば良いので、 console.log("hello")とだけ書いておきます。 ファイル名はhandler.jsにしておきます。

'use strict';

module.exports.hello = (event, context, callback) => {
  console.log(JSON.stringify(event, undefined, 1));
  console.log("hello");
  const response = { 
    statusCode: 200,
    body: "{\"msg\": \"success\"}"
  };  
  callback(null, response);
};

serverless.ymlの設定

functions:
  hello:
    handler: handler.hello
    events:
      - s3:
          bucket: "uploads"
          event: s3:ObjectCreated:*
          rules:
            - prefix: original-files/
    memorySize: 128 
#resources: # もしリサイズ処理をするなら、リサイズ後のデータを格納するバケットが必要
#  Resources:
#    UploadBucket:
#      Type: AWS::S3::Bucket
#      Properties:
#        BucketName: "lambda-result"

functions.hello.events.s3ブロックは、トリガーを検知するS3バケットの設定 & 生成時に実行されます。 そのため、serverlessを使用しないでAWSマネジメントコンソールから手動で作ったバケットを後からserverlessで操作しようとすると、下記のエラーに見舞われます。

  Serverless Error ---------------------------------------
     An error occurred while provisioning your stack: S3BucketBucketName
     - bucket-name already exists.

LambdaのTriggerだけを後から追加はできない(というか、しにくいというか、避けたい)ってことですね。