【发布时间】:2018-09-09 04:13:35
【问题描述】:
我有一个 AWS 帐户,其中有 SNS 主题。我有一个不同的 AWS 账户,我在其中创建了一个基本的 lambda 函数,使用 this
现在我想使用我在不同帐户中的 SNS 来触发这个 lambda 函数。
我需要为我的 lambda 函数/执行角色提供哪些权限?实现这一目标的最佳做法是什么?
高度赞赏任何潜在客户。
【问题讨论】:
标签: amazon-web-services aws-lambda amazon-sns
我有一个 AWS 帐户,其中有 SNS 主题。我有一个不同的 AWS 账户,我在其中创建了一个基本的 lambda 函数,使用 this
现在我想使用我在不同帐户中的 SNS 来触发这个 lambda 函数。
我需要为我的 lambda 函数/执行角色提供哪些权限?实现这一目标的最佳做法是什么?
高度赞赏任何潜在客户。
【问题讨论】:
标签: amazon-web-services aws-lambda amazon-sns
给你,下面的链接有你需要的一切
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 函数。对于运行时参数,根据您在创建部署包时选择的代码示例,选择 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 服务接受。然后,Amazon SNS 将尝试将其传递给主题的订阅者。
注意
或者,您可以将 JSON 字符串直接提供给消息参数,但使用文本文件允许在消息中换行。
【讨论】: