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

Posted

技术标签:

【中文标题】Amazon S3 在另一个账户中触发另一个 Lambda 函数【英文标题】:Amazon S3 triggering another a Lambda function in another account 【发布时间】:2018-01-08 18:40:25 【问题描述】:

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

但我听说我们只能从同一个账户 S3 访问 Lambda,对于跨账户 S3 Lambda 访问我必须在同一个账户内运行 Lambda 并创建另一个运行另一个账户 Lambda 的触发器:

    S3(帐户 A)--> Lambda(帐户 B)- 不可能 S3(账户 A)--> Lambda(账户 A)-->Lambda(账户 B)- 可能

谁能帮我选择哪个选项是可能的?如果有怎么办?

【问题讨论】:

【参考方案1】:

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

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

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

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

Account-A.S3-bucket -> Account-B.Lambda-function
    从终端,切换到 Lambda 所在的账户 B 的 AWS 配置文件

    运行以下命令,根据您的情况更改参数:

    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 存在错误,增加 statement-id 并重新运行命令。

    转到 Account-AS3 存储桶并在 Properties 的选项卡下 > 在 Events 下 选择添加通知

    添加以下字段:

    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】:

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

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

这就是我所做的:

在账户 A 中创建了 Amazon S3 存储桶 在账户 B 中创建 Lambda 函数 通过 AWS Command-Line Interface (CLI) 向 Lambda 函数添​​加了 Resource-Based Policy for AWS Lambda,允许 S3 存储桶在 Lambda 函数上调用 lambda:InvokeFunction 向 S3 存储桶添加了存储桶策略,以允许从任何地方访问 GetObject(这应该进一步锁定,但对于实验来说已经足够了) 在 S3 存储桶上为 ObjectCreate (All) 配置了一个事件,通过其 ARN 引用 Lambda 函数 上传文件到 Account-A.S3-bucket Account-B.Lambda 函数成功触发

然后我用 在不同区域的存储桶重复了实验,但失败了,说:

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

【讨论】:

我添加了 getobject 策略,但仍然被拒绝访问。此存储桶具有读取对象的加密策略我必须指定任何内容以使该加密通过吗? 您能否澄清一下“具有加密策略”的含义?你的意思是对象是用 SSE-KMS 加密的吗?另外,你在做什么接收拒绝访问消息(它在 Lambda 函数中)?随时编辑您的问题以添加更多详细信息。【参考方案3】:

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

【讨论】:

你不会说这个问题是那个问题的重复吗?如果是这样,要做的就是将此问题标记为重复问题并提供指向另一个问题的链接。这会将问题排在队列中,以便更高的代表用户投票决定是否关闭一个问题作为另一个问题的副本。如果没有,请帮助我理解为什么不。对我来说,这看起来基本上是同一个问题。【参考方案4】:

这两个选项都应该是可能的。所以你可以选择第一个选项,它是简约的。

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

这是通过在账户 B 中创建一个 IAM 角色来实现的,该角色被授予对账户 A 中存储桶的访问权限,并允许由 Lambda(在账户 B 中)承担。

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

Using Resource-Based Policies for AWS Lambda[示例2:桶 Owner Granting Cross-Account Bucket Permissions

【讨论】:

"Sid": "InvokeLambda", "Action": [ "lambda:InvokeFunction" ], "Resource": "arn:aws:lambda:us-east-1:AccountB-ID: function_name", "Effect": "Allow", "Principal": "AWS": "AccountB-ID" 我试图为账户 A 存储桶设置上述策略,但它不允许我出错 "Version": "2012-10-17", "Statement": "Effect": "Allow", "Action": "sts:AssumeRole", "Resource": "arn :aws:iam::PRODUCTION-ACCOUNT-ID:role/UpdateAPP" 我是否需要将 Assume Role 策略也附加到账户 B 中的 IAM 角色??【参考方案5】:

以下是您如何通过明确的步骤执行此操作:

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

    在具有完全 S3 访问权限的客户帐户上创建代入角色, 在指向 Lambda ARN 的假定角色中创建信任策略

    将 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)

【讨论】:

以上是关于Amazon S3 在另一个账户中触发另一个 Lambda 函数的主要内容,如果未能解决你的问题,请参考以下文章

主账户内的 Amazon S3 存储桶未在成员账户中列出

ColdFusion ImageWrite到Amazon S3

允许搜寻器访问其他帐户中的Amazon S3存储桶

AWS CloudFormation:如何从另一个AWS账户为Lambda代码指定存储桶?

使用 Amazon Educate Starter 账户将图像上传到 S3

Amazon S3 将目录复制到另一个目录