AWS Lambda 関数を AWS CloudFormation でプッシュベースのイベントソースにサブスクライブする方法を教えてください。

最終更新日: 2019 年 4 月 19 日

AWS Lambda 関数を AWS CloudFormation スタックの Amazon Simple Storage Service (Amazon S3) イベント通知または Amazon Simple Notification Service (Amazon SNS) トピックにサブスクライブすることができません。AWS::Lambda::EventSourceMapping リソースを使用すると、「イベントソースを認識できません。kinesis または dynamodb ストリームにする必要があります」というエラーが表示されます。

簡単な説明

AWS::Lambda::EventSourceMapping リソースは、Amazon DynamoDB イベントストリームや Amazon Kinesis などのプルベースのイベントソース用に設計されています。Amazon S3 イベント通知や Amazon SNS メッセージなどのプッシュベースのイベントソースでは、イベントソースが Lambda 関数を呼び出す必要があります。プッシュイベントソースが Lambda 関数を呼び出すには、その関数のリソースポリシーがサポートされているイベントソースを承認している必要があります。

解決方法

AWS CloudFormation テンプレートで、AWS::Lambda::Permission リソースを使用してリソースベースのポリシーを追加します。たとえば、次のコード例のリソースベースのポリシーでは、Amazon SNS トピックから Lambda 関数を呼び出すことができます。

"LambdaResourcePolicy": {
  "Type": "AWS::Lambda::Permission",
  "Properties": {
    "FunctionName" : { "Ref" : "MyFunction" },
    "Principal": "sns.amazonaws.com",
    "Action": "lambda:InvokeFunction",
    "SourceArn" : { "Ref" : "MySNSTopic" }
  }
}

上記の例では、Lambda 関数を Amazon S3 バケットにサブスクライブする通知設定ステートメントが必要です。Amazon SNS トピックのイベントソースの場合は、必要なアクセス許可を持つトピックポリシーを定義する必要があります。