Amazon s3 Lambda跨帐户对象复制-头对象操作:未找到
我正在尝试将使用KMS加密的S3对象复制到另一个帐户。 将执行复制操作的Lambda驻留在存在S3 Bucket with object的同一帐户中。 以下是相同的架构图: 我想将对象从帐户B复制到帐户A 为了开展活动,我已执行了以下步骤 帐户A操作:Amazon s3 Lambda跨帐户对象复制-头对象操作:未找到,amazon-s3,aws-lambda,amazon-iam,Amazon S3,Aws Lambda,Amazon Iam,我正在尝试将使用KMS加密的S3对象复制到另一个帐户。 将执行复制操作的Lambda驻留在存在S3 Bucket with object的同一帐户中。 以下是相同的架构图: 我想将对象从帐户B复制到帐户A 为了开展活动,我已执行了以下步骤 帐户A操作: 在帐户a中创建S3存储桶(已启用服务器端加密) 为帐户B创建具有信任策略的IAM角色:请分别参阅随附的角色策略和信任策略 角色策略 { "Version": "2012-10-17",
- 在帐户a中创建S3存储桶(已启用服务器端加密)
- 为帐户B创建具有信任策略的IAM角色:请分别参阅随附的角色策略和信任策略
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:*"
],
"Resource": "arn:aws:s3:::Account-A-Bucket/*"
}
] }
{
"Version": "2012-10-17",
"Statement": {
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Resource": "arn:aws:iam::Account-A:role/S3_Cross_Account_Access"
}
}
信任政策
{
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::Account-B:role/COPY-LAMBDA-ROLE"
},
"Action": "sts:AssumeRole",
"Condition": {
"StringEquals": {
"sts:ExternalId": "demo"
}
}
}]
}
- 帐户存储桶的存储桶策略
{ "Version": "2012-10-17", "Statement": [ { "Sid": "DelegateS3Access", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::Account-B:role/COPY-LAMBDA-ROLE" }, "Action": "s3:PutObject", "Resource": [ "arn:aws:s3:::Account-A-Bucket/*", "arn:aws:s3:::Account-A-Bucket" ] } ] }
- Lambda IAM角色(承担角色并访问S3)
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:*"
],
"Resource": "arn:aws:s3:::Account-A-Bucket/*"
}
] }
{
"Version": "2012-10-17",
"Statement": {
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Resource": "arn:aws:iam::Account-A:role/S3_Cross_Account_Access"
}
}
S3访问策略
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"s3:Put*",
"s3:List*",
"s3:Get*"
],
"Resource": "arn:aws:s3:::Account-A-Bucket/*",
"Effect": "Allow",
"Sid": "S3"
}
] }
- 要从帐户B复制到帐户A的Lambda代码
def lambda_handler(event, context): file_key_name = event['Records'][0]['s3']['object']['key'] src_bucket_name='Account-B-Bucket' s3 = boto3.resource('s3') copy_source = { 'Bucket': src_bucket_name, 'Key': file_key_name } des_bucket = s3.Bucket('Account-A-Bucket') des_bucket.copy(copy_source, file_key_name)
[ERROR] ClientError: An error occurred (404) when calling the HeadObject operation: Not Found
这里我还缺少什么?要使用一个api调用进行复制,您需要一个对这两个bucket都有权限的角色 基本上,您需要目标帐户中的一个角色,该角色允许访问这两个bucket。允许此角色使用bucket策略访问源bucket。让lambda或else承担目标帐户中的角色并调用复制api 我指的是这篇AWS文章:
对于每个使用假定角色的人,有一个一般提示:像您这样的角色,可以使用
sts:assumeRole
策略假定,需要明确假定!Lambda承担执行角色,并且无法猜测在另一个帐户中承担哪个角色来完成某个作业,因此显式地承担该角色 要使用一个api调用进行复制,您需要一个对两个bucket都有权限的角色
基本上,您需要目标帐户中的一个角色,该角色允许访问这两个bucket。允许此角色使用bucket策略访问源bucket。让lambda或else承担目标帐户中的角色并调用复制api
我指的是这篇AWS文章:
对于每个使用假定角色的人,有一个一般提示:像您这样的角色,可以使用sts:assumeRole
策略假定,需要明确假定!Lambda承担执行角色,并且无法猜测在另一个帐户中承担哪个角色来完成某个作业,因此显式地承担该角色