Menu

Lambdaの失敗時送信先にSNSを選択する場合のCloudFormationテンプレート

2023年5月8日に公開(2023年5月8日に更新)

概要

実現したいこと

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トピックのサブスクリプションを設定する。

ファイルをアップロードする。

エラーの通知を受け取る

参考

©2023 Maya Hanada