はじめに

今回は、テキストファイル(txt)をS3にPUTしたら、それをトリガにLambdaが起動するような構成を作成します。

リソースは公式のドキュメントを参考にCloudFormationで作成しました。

参考:チュートリアル: Amazon S3 トリガーを使⽤して Lambda 関数を呼び出す

テンプレート

Lambdaはシンプルに、 lambda invoked! と出⼒するだけなので、インラインで記載しています。

バケット名は任意の値に書き換えてください。

template.yaml

AWSTemplateFormatVersion: 2010-09-09

Parameters:
  S3BucketName:
    Type: String
    Default: XXXX

Resources:
  # ---------------
  # S3 bucket
  # ---------------
  S3Bucket:
    Type: "AWS::S3::Bucket"
    Properties:
      BucketName: !Ref S3BucketName
      NotificationConfiguration:
        LambdaConfigurations:
          - Event: "s3:ObjectCreated:Put"
            Filter:
              S3Key:
                Rules:
                  - Name: suffix
                    Value: txt
            Function: !GetAtt
              - Lambda
              - Arn

  # ---------------
  # Lambda
  # ---------------
  LambdaRole:
    Type: "AWS::IAM::Role"
    Properties:
      RoleName: "my-s3-function-role"
      AssumeRolePolicyDocument:
        Version: "2012-10-17"
        Statement:
          - Effect: Allow
            Principal:
              Service:
                - lambda.amazonaws.com
            Action:
              - "sts:AssumeRole"
      ManagedPolicyArns: 
        - "arn:aws:iam::aws:policy/AmazonS3FullAccess"
        - "arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole"

  Lambda:
    Type: "AWS::Lambda::Function"
    Properties:
      Code:
        ZipFile: |
          def lambda_handler(event, context):
            print('lambda invoked!')
      FunctionName: "trigger_lambda"
      Handler: index.lambda_handler
      Role: !GetAtt LambdaRole.Arn
      Runtime: "python3.8"

  LambdaPermission:
    Type: "AWS::Lambda::Permission"
    Properties:
      Action: "lambda:InvokeFunction"
      FunctionName: !GetAtt 
        - Lambda
        - Arn
      Principal: "s3.amazonaws.com"
      SourceArn: !Join 
        - ""
        - - "arn:aws:s3:::"
          - !Ref S3BucketName

テンプレート補⾜

S3Bucket

公式:AWS::S3::Bucket
このバケットにPUTされたらLambdaを起動したいのでNotificationConfigurationで設定しています。
フィルターでtxtを指定します。これによりsuffixがtxt以外だと無視されます。

LambdaRole

公式:AWS::IAM::Role
公式のチュートリアルに沿ってロールを作成しました。

Lambda

公式:AWS::Lambda::Function
作成したロールをつけています。
今回、Runtimeは python3.8 としました。

LambdaPermission

公式:AWS::Lambda::Permission
S3がLambdaを呼び出せるように許可を付与します。

動作確認

リソースが作成されたら、バケットに適当なファイルをアップロードしてみます。

まずはcsvファイルを⼊れてみます。
イベントフィルターでtxtを指定しているのでLambdaは起動しないはずです。

CloudWatchで⾒てみると、呼び出されていません。

次にtxtファイルをアップロードしてみます。

ちゃんと呼ばれてますね?

まとめ

S3のイベントでLambdaを起動するといった構成はよくあると思うので備忘録としてまとめました。
コードをいじれば、アップロードしたファイルを読み込んで…みたいなこともできるかと思います。
誰かの参考になれば幸いです!