简体   繁体   中英

Can't create a SNS Event source on a Lambda function using CloudFormation

This is the Cloudformation template code related to my problem:

"SNSTopic": {
  "Type": "AWS::SNS::Topic",
  "Properties": {
    "TopicName": "JumpboxPresenceTopic",
    "DisplayName": "Jumpbox Presence Topic",
    "Subscription": [
      {
        "Endpoint": {
          "Fn::GetAtt": [
            "Lambda",
            "Arn"
          ]
        },
        "Protocol": "lambda"
      }
    ]
  }
},
"Lambda": {
  "Type": "AWS::Lambda::Function",
  "Properties": [...]

I can see the topic in the SNS dashboard: 在此输入图像描述

But it does not display in the lambda function Event Sources panel: 在此输入图像描述

The weird thing about this, is that if I create a new subscription from the SNS dashboard for that same lambda function, no new subscription is created since it would be an exact duplicate. However, now if I check the Event Sources panel in the Lambda dashboard , I can see a new entry for the SNS: JumpboxPresenceTopic : 在此输入图像描述

I feel like it's an issue on Amazon's side but I could be wrong. Is there something wrong with my approach or is it a limitation of AWS ?

You must grant SNS permission to invoke Lambda first. Here is a example from AWS. Please change it from S3 to SNS and don't forget to set SourceArn as the SNS Topic ARN.

http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-permission.html

Adding the proper function name and sourcearn in permissions helped solving the issue

"MySNSTopic": {
            "Type": "AWS::SNS::Topic",
            "Properties": {
                "TopicName": "MyTopic",
                "DisplayName": "My Test Topic",
                "Subscription": [
                {
                    "Endpoint": { "Fn::GetAtt" : ["Lambda", "Arn"] },
                    "Protocol": "lambda"
                }
                ]
            }
    },
    "PermissionForEventsToInvokeLambda": {
          "Type": "AWS::Lambda::Permission",
          "Properties": {
            "FunctionName": { "Fn::GetAtt" : ["Lambda", "Arn"] },
            "Action": "lambda:InvokeFunction",
            "Principal": "sns.amazonaws.com",
            "SourceArn": { "Ref": "MySNSTopic" }
          }
      }
   },

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM