AWS Lambda
开发人员指南
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。点 击 Getting Started with Amazon AWS to see specific differences applicable to the China (Beijing) Region.

步骤 3:设置跨账户权限

在此部分中,您使用 CLI 命令跨 Lambda 函数账户和 Amazon SNS 主题账户设置权限,然后测试订阅。

  1. 从账户 A 创建 Amazon SNS 主题:

    Copy
    aws sns create-topic \ --name lambda-x-account

    记下该命令返回的主题 ARN。在将权限添加到 Lambda 函数以订阅主题时,需要使用此 ARN。

  2. 从账户 B 创建 Lambda 函数。对于运行时参数,根据您在创建部署程序包时选择的代码示例来选择 nodejs6.10nodejs4.3python3.6python2.7java8

    Copy
    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 调用函数时,需要使用此 ARN。

  3. 从账户 A 中,将权限添加到账户 B 以订阅主题:

    Copy
    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 进行调用:

    Copy
    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 字符串版本:

    Copy
    { "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 函数订阅到主题:

    Copy
    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 输出内容:

    Copy
    { "SubscriptionArn": "arn:aws:sns:us-east-1:A:lambda-x-account:5d906xxxx-7c8x-45dx-a9dx-0484e31c98xx" }
  6. 从账户 A 中,您现在可以测试订阅。在文本文件中键入“Hello World”并将它保存为 message.txt。然后运行以下命令:

    Copy
    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 字符串提供给 message 参数,但使用文本文件将允许消息中出现换行符。

有关 Amazon SNS 的更多信息,请参阅什么是 Amazon Simple Notification Service?