适用于S3传输的AWS Lambda跨账户键和角色用法

时间:2020-09-30 16:58:12

标签: amazon-web-services aws-lambda

我有一个用例,可以使用AWS Lambda将文件/对象从一个S3存储桶复制到另一个。在此用例中,Source S3存储桶位于单独的AWS账户(例如账户1)中,提供商仅向我们提供了AccessKey和SecretAccess Key。我们的Lambda在帐户2中运行,目标存储桶可以在帐户2或其他帐户3中运行,可以使用IAM角色进行访问。由于多个合作伙伴共享数据文件,因此设置类似

通常,当所有内容都在同一帐户中时,我通常使用以下boto3命令在两个存储桶之间复制内容,但想知道如何针对新用例进行修改

copy_source_object = {'Bucket': source_bucket_name, 'Key': source_file_key}
s3_client.copy_object(CopySource=copy_source_object, Bucket=destination_bucket_name, Key=destination_file_key)

如何修改以上代码以适合我的用例,该用例具有到源存储桶和目标存储桶的角色(也可以是跨帐户角色)的基于访问密钥的连接?请让我知道是否需要澄清

2 个答案:

答案 0 :(得分:1)

这里有多个选项。最简单的方法是向boto3(docs)提供凭据。我建议从SSM参数存储或机密管理器中检索密钥,这样就不会对其进行硬编码存储了。


编辑:我现在意识到问题了,两个存储桶不能使用相同的error server@1.0.0: The engine "node" is incompatible with this module. Expected version "14.13.0". Got "12.18.3" ,这是有道理的。您想要的确切内容是不可能的(即,使用session)。诀窍是使用2个单独的会话,这样您就不会混淆凭据。您需要从第一个帐户copy_object到第二个对象get_object。您应该能够简单地将get中的put_object放入put请求中,但我尚未对此进行测试。


resp['Body']

答案 1 :(得分:0)

您的情况似乎是:

帐户1:

  • 包含要复制文件的Amazon S3存储桶
  • 您有一个来自Account-1的访问密钥+秘密密钥,可以读取这些对象

帐户2:

  • 具有IAM角色的AWS Lambda函数,该函数可以写入目标存储桶

使用CopyObject()命令时,所使用的凭据必须具有对源存储桶的读取权限和对目标存储桶的写入权限。通常有两种方法可以做到这一点:

  1. 使用帐户1中的凭据将文件“推送”到帐户2中。这要求目标存储桶上有一个存储桶策略,该策略允许PutObject获得Account-1凭据。另外,您应将ACL= bucket-owner-full-control设置为将控制权移交给Account-2。 (这听起来与您的情况类似。) OR
  2. 使用帐户2中的凭据从帐户1中“拉”文件。这要求在源存储桶上使用存储桶策略,该策略必须允许GetObject获得Account-2凭据。

如果您无法请求允许“帐户2”读取内容的源存储桶上的存储桶策略的更改,那么**您将需要“目标存储桶”上的存储桶策略,该存储桶策略允许通过来自Account-1`的凭据。

由于您有可能将对象复制到“其他帐户”中的存储桶,因此这变得更加复杂。如果您在此过程中开始使用3个帐户,则没有简单的答案。

底线::如果可能,请他们更改源存储桶的存储桶策略,以便您的Lambda函数无需更改凭据即可读取文件。然后,它可以将对象复制到该功能的IAM角色可以访问的任何存储桶中。