通过 CloudFormation 的 AWS Lambda S3 存储桶通知

AWS Lambda S3 Bucket Notification via CloudFormation

我正在尝试通过 CloudFormation 创建 Lambda 通知,但收到关于 ARN 格式不正确的错误。

要么是我的 CloudFormation 有误,要么是它还不支持 Lambda 预览。

{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Parameters": {
    "LambdaArn": {
      "Type": "String",
      "Default": "arn:aws:lambda:{some-region}:{some-account-id}:function:{some-fn-name}"
    }
  },
  "Resources": {
    "EventArchive": {
      "Type": "AWS::S3::Bucket",
      "Properties": {
        "NotificationConfiguration": {
          "TopicConfigurations": [
            {
              "Event": "s3:ObjectCreated:Put",
              "Topic": {
                "Ref": "LambdaArn"
              }
            }
          ]
        }
      }
    }
  }
}

但是当我向上推送这个 CloudFormation 时,我收到消息:

The ARN is not well formed

有人知道这是什么意思吗?我知道上面的示例已经过修改,因此不使用我的 actual ARN,但在我的实际代码中,我直接从 GUI 复制了 ARN。

此外,有趣的是,我能够通过 AWS 控制台创建通知,所以我只是假设 AWS CloudFormation 尚不支持此功能(尽管这不是很清楚,但我在阅读文档)。

来自the docs

The Amazon SNS topic to which Amazon S3 reports the specified events.

看来虽然S3 supports sending events to Lambda,但CloudFormation还没有跟上。它需要一个 SNS ARN,您在其中提供 Lambda 函数 ARN。

目前,您似乎必须手动连接事件通知。

看来 AWS 现在已经发布了对直接在 CloudFormation 中通知 lambda 函数的支持。

S3NotificationConfiguration definition used to only include TopicConfigurations but has been updated to include LambdaConfigurations也是如此。

添加 NoficationConfiguration 后,确保包含 Lambda::Permission 资源,以便允许 S3 执行您的 lambda 函数。这是一个可以用作模板的示例权限:

"PhotoBucketExecuteProcessorPermission": {
    "Type" : "AWS::Lambda::Permission",
    "Properties" : {
        "Action":"lambda:invokeFunction",
        "FunctionName": { "Fn::GetAtt": [ "PhotoProcessor", "Arn" ]},
        "Principal": "s3.amazonaws.com",
        "SourceAccount": {"Ref" : "AWS::AccountId" },
        "SourceArn": {
            "Fn::Join": [":", [
                "arn","aws","s3","", ""
                 ,{"Ref" : "PhotoBucketName"}]]
        }
    }
}