从不同的帐户使用Amazon SNS调用AWS Lambda?

时间:2018-03-30 05:42:18

标签: amazon-web-services aws-lambda amazon-sns

我有一个AWS帐户,其中我有SNS主题。我有一个不同的AWS账户,我用它创建了一个基本的lambda函数 this

现在我想使用我在不同帐户中使用的SNS来触发这个lambda函数。

我需要为lambda函数/执行角色提供哪些权限?实现这一目标的最佳做法是什么?

任何领导都非常感谢。

1 个答案:

答案 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字符串,但使用文本文件可以在消息中提供换行符。