当任何对象进入Account A S3存储桶时,我想在帐户B中运行lambda。
但我听说我们只能从同一帐户S3访问Lambda,对于跨帐户S3 Lambda访问我必须在同一帐户中运行Lambda并再生成另一个运行另一个帐户的触发器Lambda:
有人可以帮我找哪个选项吗?如果是这样的话?
答案 0 :(得分:7)
我设法成功触发帐户B中的AWS Lambda函数,从上传到帐户A中的Amazon S3存储桶。
Account-A.S3-bucket -> Account-B.Lambda-function
这就是我的所作所为:
lambda:InvokeFunction
的{{3}}向Lambda函数添加Resource-Based Policy for AWS Lambda GetObject
从任何位置进行访问(这应该被进一步锁定,但足以进行实验)ObjectCreate (All)
配置事件,通过其ARN引用Lambda函数然后,我在其他地区重复了存储桶的实验,但失败,说:
通知目标服务区域对存储区位置约束无效
答案 1 :(得分:4)
@ John的解决方案有效,但我想在他的答案中添加一些步骤。
us-east-1
区域中创建。不同的区域会产生如下错误:通知目标服务区域对存储区位置约束无效
以下是我创建触发器的步骤:
Account-A.S3-bucket -> Account-B.Lambda-function
运行以下命令,更改案例的参数:
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}
在这种情况下,您可能会获得statement-id exists错误,increment statement-id和重新运行命令。
Account-A
的 S3 存储桶,然后转到属性的标签>>在活动 添加以下字段:
Name: ObjectCreation
Events: ObjectCreate (All)
Send to: Lambda function
Lambda: Add Lambda function ARN
Lambda function ARN:
your-lambda-arn
注意: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资源。
将IAM策略附加到服务帐户上的Lambda执行角色-指向客户帐户/承担的角色 (参考:https://aws.amazon.com/premiumsupport/knowledge-center/lambda-function-assume-iam-role/)
在客户帐户的目标S3存储桶上创建对象通知事件,以通知服务帐户的Lambda ARN。 (参考:https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#putBucketNotificationConfiguration-property)