はじめに
今回は、テキストファイル(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を起動するといった構成はよくあると思うので備忘録としてまとめました。
コードをいじれば、アップロードしたファイルを読み込んで…みたいなこともできるかと思います。
誰かの参考になれば幸いです!