AWS Lambda和SNS:跨区域调用Lambda

10

我已经在几个区域部署了一个Lambda函数。我想发布一个消息到SNS,来调用这些函数。

使用aws-cli,我创建了主题,并给Lambda授予了与SNS通信的权限,并创建了订阅。订阅似乎成功创建了,并且我可以在AWS控制台中看到它。但是,它不起作用。Lambda函数没有被调用。


你在Lambda函数设置中将订阅添加为事件源了吗? - Assaf Lavie
谢谢您的问题@AssafLavie。我没有专门做过这个,但我不认为在从SNS或S3调用时需要这样做。 - Shane H
澄清一下,我可以通过创建一个在不同区域中只有一个订阅者的SNS主题来复制这个更简单的示例。在那种情况下,我向主题发布一条消息,但函数从未被调用。这似乎与权限有关,但我看不到任何特定于跨区域的内容。 - Shane H
1个回答

12

这是基于CloudFormation的示例。您需要为Lambda函数添加对SNS的调用权限:

{
    "Type" : "AWS::Lambda::Permission",
    "Properties" : {
        "FunctionName" : { "Fn::GetAtt" : [ "YourLambda", "Arn" ] },
        "Action" : "lambda:InvokeFunction",
        "Principal" : "sns.amazonaws.com",
        "SourceArn" : { "Ref" : "YourSNSTopicArn" }
    }
}

然后,您需要订阅您的Lambdas到您的SNS主题。这可以通过API调用或通过CloudFormation完成。

{
    "Type" : "AWS::SNS::Topic",
    "Properties" : {
        "TopicName" : "YourTopicName",
        "Subscription" : [ {
            "Endpoint" : { "Fn::GetAtt" : [ "YourLambda", "Arn" ] },
            "Protocol": "lambda"
        } ]
    }
}
如果您缺少以上任何内容,您的Lambdas将无法调用。以上信息的来源是官方博客文章通过SNS调用Lambda函数

谢谢。你能帮我理解一下这个AssumeRole策略发生了什么吗?我没有使用Cloud Formation,所以不太了解它,但是你在那个策略中没有指定资源,这是否给Lambda授予了扮演任何角色的权限?这会有任何安全风险吗? - Shane H
目前我创建了一个带有通配符资源的策略。不幸的是,它并没有起到帮助作用。我已经给Lambda授予了“PassRole”策略。 - Shane H
是的,Lambda角色包括InvokeFunction的策略。当我向主题发布消息时,它确实会在与主题相同的区域中调用函数。问题是,即使我在查看主题时可以清楚地看到它们的订阅,它也不会调用其他区域中的函数。 - Shane H
我使用aws-cli进行配置。以下是我设置的权限示例:--region ${REGION} \ --function-name ${FUNCTION_ARN}:PROD \ --statement-id sns-invoke \ --action lambda:invokeFunction \ --principal sns.amazonaws.com \ --source-arn arn:aws:sns:us-west-2:${ACCT_NUM}:prod-reducer-us-west-2``` 这将使生产主题能够调用lambda函数的PROD别名。 - Shane H
1
谢谢!我找到了问题。你可以在我之前粘贴的语句中看到它:我在那个语句中硬编码了主题名称。非常感谢你的帮助,因为我担心这是AWS的限制,而我没有在代码中寻找问题。 - Shane H
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接