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" }
}
}
},
来源:https://stackoverflow.com/questions/32465505/cant-create-a-sns-event-source-on-a-lambda-function-using-cloudformation