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

时间:2015-02-27 17:12:12

标签: amazon-web-services amazon-cloudformation aws-lambda

我正在尝试通过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

有没有人知道这意味着什么?我知道上面的示例已被修改,所以不使用我的实际 ARN,但在我的实际代码中,我直接从GUI复制了ARN。

另外,有趣的是我能够通过AWS控制台创建通知,因此我只是假设AWS CloudFormation尚不支持此功能(尽管我不太清楚我在阅读文档时没有想到)

2 个答案:

答案 0 :(得分:24)

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

S3 NotificationConfiguration定义过去只包含TopicConfigurations,但已更新为包含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"}]]
        }
    }
}

答案 1 :(得分:2)

来自the docs

  

Amazon S3报告指定事件的Amazon SNS主题。

看来虽然S3 supports sending events to Lambda,但CloudFormation尚未赶上。它期望您提供Lambda函数ARN的SNS ARN。

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