Уведомление о ведомости AWS Lambda S3 через CloudFormation

Я пытаюсь создать уведомление Lambda через CloudFormation, но получаю сообщение об ошибке неправильного формата 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, но в моем фактическом коде я скопировал ARN непосредственно из графического интерфейса.

Интересно, что мне удалось создать уведомление через консоль AWS, и поэтому я просто предполагаю, что AWS CloudFormation еще не поддерживает эту функцию (хотя это не совсем понятно, я не думаю, когда читаю документацию).

Ответ 1

Из документы:

Тема Amazon SNS, на которую Amazon S3 сообщает о указанных событиях.

Похоже, что S3 поддерживает отправку событий в Lambda, CloudFormation еще не догнал. Он ожидает SNS ARN, где вы предоставляете функцию Lambda ARN.

В настоящее время, похоже, вам нужно вручную связать уведомление о событиях.

Ответ 2

Похоже, AWS теперь выпустила поддержку для уведомления лямбда-функций непосредственно в CloudFormation.

Определение S3 NotificationConfiguration, которое использовалось только для включения TopicConfigurations, но было обновлено, чтобы включить LambdaConfigurations.

После добавления NoficationConfiguration убедитесь, что вы включили ресурс Lambda:: Permission, чтобы S3 разрешал выполнять вашу лямбда-функцию. Вот пример разрешения, которое можно использовать в качестве шаблона:

"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"}]]
        }
    }
}