Amazon S3在另一个帐户中触发另一个Lambda函数

时间:2017-08-01 18:50:19

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

当任何对象进入Account A S3存储桶时,我想在帐户B中运行lambda。

但我听说我们只能从同一帐户S3访问Lambda,对于跨帐户S3 Lambda访问我必须在同一帐户中运行Lambda并再生成另一个运行另一个帐户的触发器Lambda:

  1. S3(帐户A) - > Lambda(账户B) - 不可能
  2. S3(帐户A) - > Lambda(账户A) - > Lambda(账户B) - 可能
  3. 有人可以帮我找哪个选项吗?如果是这样的话?

5 个答案:

答案 0 :(得分:7)

我设法成功触发帐户B中的AWS Lambda函数,从上传到帐户A中的Amazon S3存储桶。

Account-A.S3-bucket -> Account-B.Lambda-function

这就是我的所作所为:

  • 在帐户A
  • 中创建 Amazon S3存储桶
  • 在帐户B
  • 中创建了 Lambda函数
  • 通过允许S3存储分区在Lambda函数上调用lambda:InvokeFunction的{​​{3}}向Lambda函数添加Resource-Based Policy for AWS Lambda
  • 向S3存储桶添加了存储桶策略以允许GetObject从任何位置进行访问(这应该被进一步锁定,但足以进行实验)
  • 在S3存储桶上为ObjectCreate (All)配置事件,通过其ARN引用Lambda函数
  • 上传文件到Account-A.S3-bucket
  • 帐户-L.Lambda功能已成功触发

然后,我在其他地区重复了存储桶的实验,但失败,说:

  

通知目标服务区域对存储区位置约束无效

答案 1 :(得分:4)

@ John的解决方案有效,但我想在他的答案中添加一些步骤。

  • S3 存储桶和 Lambda 需要位于同一区域。例如,两者都应在us-east-1区域中创建。不同的区域会产生如下错误:
  

通知目标服务区域对存储区位置约束无效

以下是我创建触发器的步骤:

Account-A.S3-bucket -> Account-B.Lambda-function
  1. 从终端切换到Lambda将驻留的帐户B的AWS配置文件
  2. 运行以下命令,更改案例的参数:

    aws lambda add-permission \ --region {Account-B.Lambda region Eg. us-east-1} \ --function-name {Account-B.Lambda name} \ --statement-id 1 \ --principal s3.amazonaws.com \ --action lambda:InvokeFunction \ --source-arn arn:aws:s3:::{Account-A.S3 name} \ --source-account {Account-A.account-id} \ --profile {Account-B.profile-name}

  3. 在这种情况下,您可能会获得statement-id exists错误,increment statement-id和重新运行命令。

    1. 转到Account-A S3 存储桶,然后转到属性的标签>>在活动
    2. 选择添加通知
    3. 添加以下字段:

      Name: ObjectCreation Events: ObjectCreate (All) Send to: Lambda function Lambda: Add Lambda function ARN Lambda function ARN: your-lambda-arn

    4. 注意:Lambda函数可能仍会显示错误,但S3存储桶中添加的新对象会触发lambda和打印(事件)日志显示在Cloudwatch日志中。

答案 2 :(得分:0)

在新的S3控制台中,转到S3控制台并打开您的存储桶。单击“属性”选项卡 - >活动。您需要授予S3调用Lambda函数的权限。请参阅:configure Amazon s3 bucket to run Lambda function created in another account

答案 3 :(得分:0)

两种选择都应该是可能的。所以你可以使用第一个选项,这是极简主义的。

使用IAM中的跨帐户访问功能授予Lambda(帐户B)对S3(帐户A)的访问权限。

这是通过在帐户B中创建IAM角色来实现的,该角色被授予加入帐户A中的存储桶并允许由Lambda承担(在帐户B中)。

有关详细信息,请参阅AWS的以下文档。

答案 4 :(得分:0)

这是您按照明确的步骤进行操作的方法:

我将(客户帐户)定义为包含S3资源的帐户,将“服务帐户”定义为包含Lambda函数的帐户,该帐户将访问S3资源。

  1. 在具有完全S3访问权限的客户帐户上创建假定的角色,
  2. 以Lambda ARN的假定角色创建信任策略
  3. 将IAM策略附加到服务帐户上的Lambda执行角色-指向客户帐户/承担的角色 (参考:https://aws.amazon.com/premiumsupport/knowledge-center/lambda-function-assume-iam-role/

  4. 在客户帐户的目标S3存储桶上创建对象通知事件,以通知服务帐户的Lambda ARN。 (参考:https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#putBucketNotificationConfiguration-property