从不同的帐户使用 Amazon SNS 调用 AWS Lambda?
Invoke AWS Lambda with Amazon SNS from Different Accounts?
我有一个 AWS 账户,其中有 SNS 主题。我有一个不同的 AWS 帐户,我在其中使用创建了一个基本的 lambda 函数
this
现在我想使用我在不同帐户中的 SNS 来触发此 lambda 函数。
我需要为我的 lambda function/execution 角色提供哪些权限?实现该目标的最佳做法是什么?
非常感谢任何线索。
给你,下面link有你需要的一切
https://docs.aws.amazon.com/lambda/latest/dg/with-sns-create-x-account-permissions.html
上面提到的步骤link:
1) 从账户 A 创建 Amazon SNS 主题:
aws sns create-topic --name lambda-x-account
注意由命令 return 编辑的主题 arn。当您向 Lambda 函数添加权限以订阅主题时,您将需要它。
2) 从账户 B,创建 Lambda 函数。对于运行时间参数,select nodejs6.10, nodejs4.3, python3.6, python2.7 or java8, 取决于代码在您创建部署包时对您 select 进行了采样。
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
注意命令 return 编辑的函数 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 return 提供以下 JSON 代码。语句值是添加到 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
这将return一个带有唯一标识符的消息ID,表明该消息已被亚马逊SNS服务接受。然后,Amazon SNS 将尝试将其交付给主题的订阅者。
备注
或者,您可以直接向消息参数提供 JSON 字符串,但使用文本文件允许在消息中换行。
我有一个 AWS 账户,其中有 SNS 主题。我有一个不同的 AWS 帐户,我在其中使用创建了一个基本的 lambda 函数 this
现在我想使用我在不同帐户中的 SNS 来触发此 lambda 函数。
我需要为我的 lambda function/execution 角色提供哪些权限?实现该目标的最佳做法是什么?
非常感谢任何线索。
给你,下面link有你需要的一切
https://docs.aws.amazon.com/lambda/latest/dg/with-sns-create-x-account-permissions.html
上面提到的步骤link:
1) 从账户 A 创建 Amazon SNS 主题:
aws sns create-topic --name lambda-x-account
注意由命令 return 编辑的主题 arn。当您向 Lambda 函数添加权限以订阅主题时,您将需要它。
2) 从账户 B,创建 Lambda 函数。对于运行时间参数,select nodejs6.10, nodejs4.3, python3.6, python2.7 or java8, 取决于代码在您创建部署包时对您 select 进行了采样。
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
注意命令 return 编辑的函数 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 return 提供以下 JSON 代码。语句值是添加到 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
这将return一个带有唯一标识符的消息ID,表明该消息已被亚马逊SNS服务接受。然后,Amazon SNS 将尝试将其交付给主题的订阅者。
备注
或者,您可以直接向消息参数提供 JSON 字符串,但使用文本文件允许在消息中换行。