【问题标题】:Invoke AWS Lambda with Amazon SNS from Different Accounts?使用来自不同账户的 Amazon SNS 调用 AWS Lambda?
【发布时间】:2018-09-09 04:13:35
【问题描述】:

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

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

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

高度赞赏任何潜在客户。

【问题讨论】:

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


    【解决方案1】:

    给你,下面的链接有你需要的一切

    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 字符串直接提供给消息参数,但使用文本文件允许在消息中换行。

    【讨论】:

    • @MrT 哦,是的,有道理。完成。
    • 您好,感谢您的及时回复。我想我不明白我需要在哪里运行这些命令?我们可以使用 EC2 实例登录 AWS 帐户吗?
    • 这些是 AWS CLI(命令行界面)命令。您可以在您的计算机上安装此工具。在命令提示符/终端中工作
    • 例如在第三个命令中它如何知道我们正在为帐户 A 运行此命令。
    • 它将转到您用于执行此命令的配置文件/凭据的 Acc A。另外仅供参考,您需要为两个不同的账户为 AWS CLI 配置两个单独的配置文件,并且您应该使用配置文件名称提及您正在为哪个账户执行此命令。有关配置文件的更多信息,请阅读此docs.aws.amazon.com/cli/latest/userguide/…
    猜你喜欢
    • 2016-04-17
    • 1970-01-01
    • 1970-01-01
    • 2020-03-27
    • 1970-01-01
    • 1970-01-01
    • 2019-10-17
    • 1970-01-01
    • 2022-01-27
    相关资源
    最近更新 更多