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だけを後から追加はできない(というか、しにくいというか、避けたい)ってことですね。