概要
実現したいこと
Lambdaの失敗時の送信先にSNSを選択してエラー通知をする構成をCloudFormationテンプレートに記述してスタックの作成を行いたい。
構成図
S3バケットへのアップロードをトリガーにして、Lambdaを実行する。失敗時に送信先としてSNSトピックを選択する。
テンプレートの記述方法
ポイント
「AWS::Lambda::EventInvokeConfig」の設定を追加する。
LambdaErrorNotification:
Type: AWS::Lambda::EventInvokeConfig
Properties:
DestinationConfig:
OnFailure:
Destination: !Ref SnsTopicForError
FunctionName: !Ref LambdaSample
Qualifier: $LATEST
テンプレート全体
AWSTemplateFormatVersion: 2010-09-09
Description: Build AWS Batch environment
Resources:
### SNS作成 ###
SnsTopicForError:
Type: AWS::SNS::Topic
Properties:
Tags:
- Key: "Environment"
Value: "test"
TopicName: testTopic
### ラムダ作成 ###
LambdaSample:
Type: AWS::Lambda::Function
Properties:
Code:
ZipFile: |
import json
def lambda_handler(event, context):
# ゼロ除算エラーを発生させる
a = 100 / 0
return {
'statusCode': 200,
'body': json.dumps('test')
}
Description: test lambda
FunctionName: "test_lambda_function"
Handler: index.lambda_handler
Role: !GetAtt LambdaExecutionRole.Arn
Runtime: python3.9
Timeout: 30
LambdaExecutionRole:
Type: AWS::IAM::Role
Properties:
RoleName: "testRole"
AssumeRolePolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Principal:
Service:
- lambda.amazonaws.com
Action:
- sts:AssumeRole
Path: "/"
Policies:
- PolicyName: "testLambdaLogPolicy"
PolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Action:
- logs:*
Resource: arn:aws:logs:*:*:*
- PolicyName: "testLambdaSnsPolicy"
PolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Action:
- sns:Publish
Resource: !Ref SnsTopicForError
# リソースベースポリシーを作成する
LambdaInvokePermission:
Type: AWS::Lambda::Permission
Properties:
Action: 'lambda:InvokeFunction'
FunctionName: !GetAtt LambdaSample.Arn
Principal: s3.amazonaws.com
SourceArn: "arn:aws:s3:::test-sourcebucket-1234"
# Lambdaの送信先の設定
LambdaErrorNotification:
Type: AWS::Lambda::EventInvokeConfig
Properties:
DestinationConfig:
OnFailure:
Destination: !Ref SnsTopicForError
FunctionName: !Ref LambdaSample
Qualifier: $LATEST
### S3バケットの作成とトリガーの作成 ###
S3Bucket:
Type: AWS::S3::Bucket
Properties:
BucketName: "test-sourcebucket-1234"
NotificationConfiguration:
LambdaConfigurations:
- Event: s3:ObjectCreated:*
Function: !GetAtt LambdaSample.Arn
動作検証
CloudFormationのテンプレート読み込み後
トリガーとしてS3が認識されていて、送信先がSNSに設定されている。
送信先の条件が「失敗時」となっている
エラーを発生させて通知を行う
SNSトピックのサブスクリプションを設定する。
ファイルをアップロードする。
エラーの通知を受け取る