这就是我想要做的:
我在账户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)
答案 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中“拉”一个对象。)