AWS Lambda将数据放入跨账户s3存储桶

时间:2019-12-05 04:12:55

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

这就是我想要做的:

我在账户A中拥有访问日志,AWS默认对其进行了加密,并且账户B中具有lambda和s3存储桶。当新对象登陆到账户A s3存储桶中并且账户B下载了lambda时,我想触发lambda并将其写入帐户B s3存储桶。以下是我面临的障碍。

第一种方法: 我能够从帐户A s3新对象获取触发器到帐户B中的lambda,但是帐户B中的lambda无法下载对象-访问被拒绝错误。在寻找了几天之后,我发现这是因为Access日志默认情况下是加密的,并且无法将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)

2 个答案:

答案 0 :(得分:0)

感谢约翰·罗滕斯坦的指导。我找到了解决方案。我只需要在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)

答案 1 :(得分:0)

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

使用copy_object()的好处在于,该对象将由Amazon S3直接复制,而无需先下载该对象。

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

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

ACL='bucket-owner-full-control'

这是必需的,因为该对象已从帐户A中的凭据写入到帐户B拥有的存储桶中。使用bucket-owner-full-control会将对象的控制权传递给帐户B。(如果使用来自帐户B,然后从帐户A中“拉”一个对象。)