【问题标题】:AWS Lambda put data to cross account s3 bucketAWS Lambda 将数据放入跨账户 s3 存储桶
【发布时间】:2020-03-29 23:20:09
【问题描述】:

这是我想要做的:

我在账户 A 中有访问日志,这些日志由 AWS 默认加密,并且我在账户 B 中有 lambda 和 s3 存储桶。我想在账户 A 上出现新对象时触发 lambda s3 存储桶和账户 B 中的 lambda 下载数据并将其写入帐户 B s3 存储桶。以下是我面临的障碍。

第一种方法: 我能够从账户 A s3 新对象获取触发器到账户 B 中的 lambda 但是,账户 B 中的 lambda 无法下载该对象 - 访问被拒绝错误。找了几天,我想这是因为访问日志默认是加密的,我无法将 lambda 角色添加到加密角色策略中,以便它可以加密/解密日志文件。所以转向第二种方法。

第二种方法: 我已将我的 lambda 移动到账户 A。现在源 s3 存储桶和 lambda 在账户 A 中,目标 s3 存储桶在账户 B 中。现在我可以通过账户 A 中的 Lambda 处理账户 A 中的访问日志,但是当它写入帐户 B s3 存储桶中的文件我在下载/读取文件时收到拒绝访问错误。

Lambda 角色策略: 除了完整的 s3 访问权限和完整的 lambda 访问权限。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Stmt1574387531641",
            "Effect": "Allow",
            "Action": "s3:*",
            "Resource": "*"
        },
        {
            "Sid": "Stmt1574387531642",
            "Effect": "Allow",
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::Account-B-bucket",
                "arn:aws:s3:::Account-B-bucket/*"
            ]
        }
    ]
}

信任关系

{   "Version": "2012-10-17",   "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "lambda.amazonaws.com",
        "AWS": "arn:aws:iam::Account-B-ID:root"
      },
      "Action": "sts:AssumeRole"
    }   ] }

目标 - 账户 B s3 存储桶策略:

   {
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": [
                    "arn:aws:iam::Account-A-ID:role/service-role/lambda-role"
                ]
            },
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::Account-B-Bucket",
                "arn:aws:s3:::Account-B-Bucket/*"
            ]
        },
        {
            "Sid": "Stmt11111111111111",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::Account-A-ID:root"
            },
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::Account-B-Bucket",
                "arn:aws:s3:::Account-B-Bucket/*"
            ]
        }
    ] }

我被困在这里。我希望 lambda 能够解密访问日志并读取/处理数据并将其写入不同的帐户 s3 存储桶。我错过了什么吗?非常感谢您的帮助!

添加文件元数据: File property screenshot

Lambda 代码:

s3 = boto3.client('s3')
# reading access logs from account A. Lambda is also running in account A.
response = s3.get_object(Bucket=access_log_bucket, Key=access_log_key)
body = response['Body']
content = io.BytesIO(body.read())
# processing access logs
processed_content = process_it(content)
# writting to account B s3 bucket
s3.put_object(Body=processed_content,
    Bucket=processed_bucket,
    Key=processed_key)

【问题讨论】:

  • Trust Policy 是否指的是 Account-B 而不是 Account-A?
  • 您的 Lambda 函数似乎没有任何 KMS 权限,因此它无法从 Account-A-Bucket 中读取加密对象。另外,你是如何复制文件的?你是用CopyObject(),还是先下载再上传?什么具体的命令导致了 Access Denied 错误?
  • 使用第一种方法,你建议如何给KMS权限?我读到的是您需要将 lambda 角色添加到密钥策略中,但是 AWS 默认服务器端加密策略无法更新。另外,我不能为访问日志做 CMK。如果我在这里遗漏了什么,请告诉我。
  • 对于第二种方法,由于我的 lambda 与我的源 s3 存储桶(即账户 A)在同一个账户中,我认为我不需要给它任何 KMS 权限。在这种方法中,当我的 lambda 写入帐户 B s3 存储桶时,文件的所有者不正确,我猜。因此,当我尝试从控制台下载文件或从 Athena boto3 查询数据时,我被拒绝访问。
  • 如果您正在写入/复制到存储桶 B,您需要指定 bucket-owner-full-control ACL 以便账户 B“拥有”该对象。

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


【解决方案1】:

建议您使用copy_object() 命令,而不是下载然后上传对象。

使用copy_object()的好处是对象会被Amazon S3直接复制,不需要先下载对象。

这样做时,您使用的凭据必须对源存储桶具有读取权限,对目标存储桶具有写入权限。 (但是,如果您正在“处理”数据,这当然不适用。)

作为此命令的一部分,您可以指定 ACL:

ACL='bucket-owner-full-control'

这是必需的,因为对象正在从账户 A 中的凭据写入到账户 B 拥有的存储桶中。使用 bucket-owner-full-control 会将对象的控制权传递给账户 B。(如果使用账户 B 中的凭据,则不需要并从账户 A 中“拉取”一个对象。)

【讨论】:

    【解决方案2】:

    感谢 John Rotenstein 的指导。我找到了解决方案。我只需要在 put_object 中添加 ACL='bucket-owner-full-control'。下面是完整的 boto3 cmd。

    s3.put_object(
        ACL='bucket-owner-full-control'
        Body=processed_content,
        Bucket=processed_bucket,
        Key=processed_key)
    

    【讨论】:

      猜你喜欢
      • 2019-06-28
      • 2016-03-17
      • 2019-10-25
      • 2019-04-23
      • 2018-11-26
      • 1970-01-01
      • 1970-01-01
      • 2020-12-28
      • 2017-07-21
      相关资源
      最近更新 更多