从外部帐户使用SNS调用Lambda

时间:2016-01-12 16:49:04

标签: amazon-sns aws-lambda

我一直关注以下来自亚马逊的博客文章(场景3:从另一个帐户中的Amazon S3存储桶通知触发Lambda函数)关于授权Lambda函数用于各种用途。我想设置一个Lambda函数来接受来自外部帐户的SNS消息(带有lambda函数的acct外部)。

https://aws.amazon.com/blogs/compute/easy-authorization-of-aws-lambda-functions/

我希望添加远程调用函数的权限,如下所示:

$ aws lambda add-permission \
     --function-name MyFunction \
     --region us-west-2 \
     --statement-id Id-123 \
     --action "lambda:InvokeFunction" \
     --principal sns.amazonaws.com \
     --source-arn arn:aws:sns:::<topic name> \
     --source-account <account number> \
     --profile adminuser

然后我尝试转到我的SNS主题并将Lambda设置为端点,并在第一个帐户中输入lambda函数的远程ARN。这不能很好地工作,因为端点期望帐户中的函数具有arn ...

B计划: 尝试通过CLI创建订阅以规避控制台中的限制......

 aws sns --profile adminuser \
     --region us-west-2 subscribe 
     --topic-arn arn:aws:sns:us-west-2:<account #>:<topic name> 
     --protocol lambda 
     --notification-endpoint arn:aws:lambda:us-west-2:<account id>:function:<lambda function name>

响应:
A client error (AuthorizationError) occurred when calling the Subscribe operation: The account <account id> is not the owner of the lambda function arn:aws:lambda:us-west-2:<account id>:function:<function name>

是否有人能够从&#34;遥控器&#34;中调用Lambda函数? SNS在另一个账号?我对可能出错的地方感到有点难过......根据博客文章中的说明,我完全希望远程SNS能够工作:
Note: Amazon SNS (Simple Notification Service) events sent to Lambda works the same way, with “sns.amazonaws.com” replacing “s3.amazonaws.com” as the principal.

4 个答案:

答案 0 :(得分:4)

如果提供者帐户授权拥有lambda的使用者帐户订阅SNS主题,则可以。这可以在topics page下的“编辑主题政策”中完成。

以下是允许lambda从外部帐户收听SNS主题的步骤摘要:

  1. 消费者帐户创建lambda,
  2. 消费者帐户通过指定提供商的SNS主题ARN(不要在此担心错误消息),在AWS控制台中将事件源添加到lambda,
  3. 提供商帐户将SNS订阅权限添加到在第三方的AWS账户中创建的消费者IAM账户(通过上述“编辑主题政策”完成),
  4. 消费者使用步骤2中的IAM帐户使用AWS CLI添加订阅服务提供商帐户。
  5. 以前为第4步工作的示例命令:

    aws sns subscribe --topic-arn <provider_sns_arn> --protocol lambda --notification-endpoint <consumer_lambda_arn> --profile consumer-IAM-account
    

答案 1 :(得分:1)

在AWS Lambda开发人员指南中,有一个tutorial,其中AWS CLI命令用于设置从属于另一个帐户的SNS调用Lambda函数。

该程序与接受答案中的程序非常相似。订阅不必确认。它已准备好在aws sns subscribe命令之后立即进行测试。

答案 2 :(得分:1)

今天有类似的要求。概括来说,有3个步骤。假设111111111是具有SNS主题的生产者帐户,而2222222222是具有lambda的消费者,并且

  1. 允许Lambda函数订阅主题

    aws sns --profile SNS_Owner_Profile add-permission \  
          --topic-arn "arn:aws:sns:us-east-1:111111111:your-sns-top" \  
          --label "AllowCrossAccountSns" \  
          --aws-account-id "2222222222" \  
          --action-name "Receive" "Subscribe"  
    
  2. 允许主题调用Lambda函数,

    aws lambda --profile Lambda_Owner_Profile add-permission \                                                                                                                     
          --function-name "your-lambda-function" \  
          --statement-id "allowCrossAccountSNS" \  
          --principal "sns.amazonaws.com" \  
          --action "lambda:InvokeFunction" \  
          --source-arn "arn:aws:sns:us-east-1:111111111:your-sns-top"  
    
  3. 将lambda函数订阅该主题。

    aws sns --profile Lambda_Owner_Profile subscribe \                                                                                                                          
          --topic-arn "arn:aws:sns:us-east-1:111111111:your-sns-top" \  
          --protocol "lambda" \  
          --notification-endpoint "arn:aws:lambda:us-east-1:2222222222:function:your-lambda-function" 
    

答案 3 :(得分:0)

我遇到了同样的问题。该错误是因为您正在从拥有SNS主题的帐户中调用SNS订阅功能。虽然这看起来很合理,并且通常会这样做,但是AWS希望您在进行跨账户访问时采取另一种方式-您必须从拥有Lambda函数的账户中调用SNS订阅函数。 / p>