【问题标题】:AWS Lambda : Cross account Policy for Lambda function S3 to S3 copyAWS Lambda:Lambda 函数 S3 到 S3 复制的跨账户策略
【发布时间】:2021-02-06 02:20:14
【问题描述】:

我们正在尝试实现 lambda 函数,该函数将根据源 S3 存储桶事件将对象从一个 S3 复制到跨账户中的另一个 S3 存储桶。目前我们能够在同一个 SAG 中的源和目标之间复制文件。但是当我们尝试用跨账户实现相同的逻辑时,得到 CopyObject operation: Access Denied 问题。我已经给出了以下存储桶策略。您能否帮我获取正确的 IAM 和存储桶策略来解决此问题。

{
    "Version": "2012-10-17",
    "Id": "Policy1603404813917",
    "Statement": [
        {
            "Sid": "Stmt1603404812651",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::6888889898:role/Staff"
            },
            "Action": [
                "s3:GetObject",
                "s3:GetObjectAcl",
                "s3:ListBucket",
                "s3:PutObject",
                "s3:PutObjectAcl"
            ],
            "Resource": [
                "arn:aws:s3:::source-bucktet-testing-lambda/*",
                "arn:aws:s3:::source-bucktet-testing-lambda"
            ]
        }
    ]
}

基于https://www.lixu.ca/2016/09/aws-lambda-and-s3-how-to-do-cross_83.html链接,是的,我们可以在源和目标的访问ID和访问密钥的帮助下实现相同的逻辑。但是我试图实现相同的逻辑,而不是源和目标的访问 ID 和访问密钥,使用适当的策略授予源和目标存储桶的访问权限,并使其像同一个帐户一样工作。

【问题讨论】:

  • 什么是SAG?
  • 此存储桶策略是应用于源存储桶还是目标存储桶? Staff 角色是否已分配给 Lambda 函数?请编辑您的问题以包含分配给该角色的权限。
  • SAG - 服务帐户组。每个团队都有各自的 SAG 帐户,拥有自己的权限。
  • 此存储桶策略是应用于源存储桶还是目标存储桶?是否将 Staff 角色分配给 Lambda 函数? - 是的,这是应用于源存储桶的策略。

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


【解决方案1】:

为了重现您的情况,我做了以下操作:

  • 在 帐户-A 中:
    • 创建了一个 Amazon S3 存储桶 (Bucket-A)
    • 创建了 IAM 角色 (Role-A)
    • 创建了一个 AWS Lambda 函数 (Lambda-A) 并将Role-A 分配给该函数
    • 在Bucket-A 上配置了一个Amazon S3 事件,以触发Lambda-A 的“所有对象创建事件”
  • 在 帐户-B 中:
    • 使用存储桶策略创建了一个 Amazon S3 存储桶 (Bucket-B)(见下文)

IAM 角色

Role-A 具有 AWSLambdaBasicExecutionRole 托管策略,以及此内联策略,该策略分配 Lambda 函数从 Bucket-A 读取和写入 Bucket-B 的权限:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::bucket-a/*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:PutObjectAcl"
            ],
            "Resource": "arn:aws:s3:::bucket-b/*"
        }
    ]
}

目标存储桶的存储桶政策

Bucket-B 上的存储桶策略允许从 Role-A IAM 策略进行访问:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::ACCOUNT-A:role/role-a"
            },
            "Action": [
                "s3:PutObject",
                "s3:PutObjectAcl"
            ],
            "Resource": "arn:aws:s3:::bucket-b/*"
        }
    ]
}

Lambda 函数

Lambda-A在Bucket-A中创建对象时触发,并将其复制到Bucket-B:

import boto3
import urllib

TARGET_BUCKET = 'bucket-b'

def lambda_handler(event, context):
    
    # Get incoming bucket and key
    source_bucket = event['Records'][0]['s3']['bucket']['name']
    source_key = urllib.parse.unquote_plus(event['Records'][0]['s3']['object']['key'])

    # Copy object to different bucket
    s3_resource = boto3.resource('s3')
    copy_source = {
        'Bucket': source_bucket,
        'Key': source_key
    }
    target_key = source_key # Change if desired

    s3_resource.Bucket(TARGET_BUCKET).Object(target_key).copy(copy_source, ExtraArgs={'ACL': 'bucket-owner-full-control'})

我同意ACL=bucket-owner-full-control,因为将对象复制到不同账户拥有的存储桶有时会导致对象仍由原始账户“拥有”。使用此 ACL 将所有权授予拥有目标存储桶的账户。

测试

我在Account-A 中向Bucket-A 上传了一个文件。

文件已正确复制到Account-B中的Bucket-B。

评论

解决方案不需要:

  • Bucket-A 上的存储桶策略,因为 Role-A 授予必要的权限
  • 关闭 S3 阻止公共访问,因为分配的权限不授予“公共”访问权限

【讨论】:

  • 感谢您的回复约翰。您能否请您说明 IAM 角色和存储桶政策的政策声明
  • 我已更新我的答案以提供完整的解决方案。
  • @JohnRotenstein 这是一个很好的解释,经过测试并像魅力一样工作。困扰我的一件事:如果您上传多个文件怎么办?我知道调用是异步的。另一个问题是当文件大于一定大小时 3 秒超时是否足够?由于异步调用,我的直觉是没关系,但是文件呢? >100MB?
【解决方案2】:

假设如下

  1. 上述策略适用于源存储桶
  2. 6888889898 是目标 AWS 账户
  3. 用于复制文件的 Lambda 位于目标 AWS 账户中,并附加了员工角色。

即使正确设置了所有这些,复制操作也可能会失败。这是因为 Policy 允许您获取/放置 s3 对象,但不能获取/放置与这些 s3 对象关联的标签。

您还需要允许以下操作以及“s3:GetObjectTagging”和“s3:PutObjectTagging”

【讨论】:

    猜你喜欢
    • 2019-04-23
    • 1970-01-01
    • 2021-04-25
    • 1970-01-01
    • 2016-03-17
    • 1970-01-01
    • 1970-01-01
    • 2020-03-11
    • 2022-09-24
    相关资源
    最近更新 更多