【发布时间】: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-controlACL 以便账户 B“拥有”该对象。
标签: amazon-web-services amazon-s3 aws-lambda amazon-iam