我有一个AWS帐户,其中我有SNS主题。我有一个不同的AWS账户,我用它创建了一个基本的lambda函数 this
现在我想使用我在不同帐户中使用的SNS来触发这个lambda函数。
我需要为lambda函数/执行角色提供哪些权限?实现这一目标的最佳做法是什么?
任何领导都非常感谢。
答案 0 :(得分:4)
在这里,您可以在下面找到链接
https://docs.aws.amazon.com/lambda/latest/dg/with-sns-create-x-account-permissions.html
上述链接中提到的步骤:
1)从帐户A,创建Amazon SNS主题:
aws sns create-topic --name lambda-x-account
请注意命令返回的主题arn。当您向Lambda函数添加权限以订阅主题时,您将需要它。
2)从帐户B,创建Lambda函数。对于runtime参数,请选择nodejs6.10,nodejs4.3,python3.6,python2.7或java8,具体取决于您在创建部署包时选择的代码示例。
aws lambda create-function \
--function-name SNS-X-Account \
--runtime runtime language \
--role role arn \
--handler handler-name \
--description "SNS X Account Test Function" \
--timeout 60 \
--memory-size 128 \
--zip-file fileb://path/LambdaWithSNS.zip
请注意命令返回的函数arn。当您添加允许Amazon SNS调用您的功能的权限时,您将需要它。
3)从帐户A添加帐户B的权限以订阅主题:
aws sns add-permission \
--region us-east-1 \
--topic-arn Amazon SNS topic arn \
--label lambda-access \
--aws-account-id B \
--action-name Subscribe ListSubscriptionsByTopic Receive
4)从帐户B添加Lambda权限以允许从Amazon SNS调用:
aws lambda add-permission \
--function-name SNS-X-Account \
--statement-id sns-x-account \
--action "lambda:InvokeFunction" \
--principal sns.amazonaws.com \
--source-arn Amazon SNS topic arn
作为回应,Lambda返回以下JSON代码。 Statement值是添加到Lambda函数策略的语句的JSON字符串版本:
{
"Statement": "{\"Condition\":{\"ArnLike\":{\"AWS:SourceArn\":\"arn:aws:lambda:us-east-1:B:function:SNS-X-Account\"}},\"Action\":[\"lambda:InvokeFunction\"],\"Resource\":\"arn:aws:lambda:us-east-1:A:function:SNS-X-Account\",\"Effect\":\"Allow\",\"Principal\":{\"Service\":\"sns.amazonaws.com\"},\"Sid\":\"sns-x-account1\"}"
}
请注意
添加策略时,请勿使用--source-account参数将源帐户添加到Lambda策略。 Amazon SNS事件源不支持源帐户,并将导致访问被拒绝。这不会对安全性产生影响,因为源帐户包含在源ARN中。
5)从帐户B订阅Lambda函数到主题:
aws sns subscribe \
--topic-arn Amazon SNS topic arn \
--protocol lambda \
--notification-endpoint arn:aws:lambda:us-east-1:B:function:SNS-X-Account
您应该看到类似于以下内容的JSON输出:
{
"SubscriptionArn": "arn:aws:sns:us-east-1:A:lambda-x-account:5d906xxxx-7c8x-45dx-a9dx-0484e31c98xx"
}
6)您可以在帐户A中测试订阅。输入" Hello World"进入文本文件并将其另存为message.txt。然后运行以下命令:
aws sns publish \
--topic-arn arn:aws:sns:us-east-1:A:lambda-x-account \
--message file://message.txt \
--subject Test
这将返回带有唯一标识符的消息ID,表明该消息已被Amazon SNS服务接受。然后,亚马逊SNS将尝试将其提供给主题的订阅者。
请注意
或者,您可以直接向message参数提供JSON字符串,但使用文本文件可以在消息中提供换行符。