【发布时间】:2022-12-11 15:51:45
【问题描述】:
您好,我正在尝试跨帐户移动文件,从存储桶帐户 S 到存储桶帐户,我收到以下错误
调用 o88.parquet 时出错。 dt/output1/parquet/_temporary/0/:在 dt/output1/parquet/_temporary/0/ 上放置 0 字节对象:com.amazonaws.services.s3.model.AmazonS3Exception:拒绝访问(服务:Amazon S3;状态代码: 403; Error Code: AccessDenied; Request ID: F99P5W0C8Q28BJ4R; S3 Extended Request ID: VpFGWR9JR7r2yae9v8ezB7HAgJu0uuwn4v3mBAG8CaaJ2q0+sOVFGdxsZ1GzMXhAifSCtdxJ0OM=; Proxy: null), S3 Extended Request ID: VpFGWR9JR7r2yae9v8ezB7HAgJu0uuwn4v3mBAG8CaaJ2q0+sOVFGdxsZ1GzMXhAifSCtdxJ0OM=:AccessDenied
我最后有以下设置。
账户 A 具有以下角色 cross-account-sample-role 和以下政策
{ "Version": "2012-10-17", "Statement": [ { "Action": [ "s3:ListAllMyBuckets" ], "Effect": "Allow", "Resource": [ "arn:aws:s3:::*" ] }, { "Action": [ "s3:ListBucket", "s3:GetBucketLocation" ], "Effect": "Allow", "Resource": "arn:aws:s3:::my-bucket" }, { "Effect": "Allow", "Action": [ "s3:Get*", "s3:Put*", "s3:List*" ], "Resource": "arn:aws:s3:::my-bucket/*" } ] }账户A角色中的信任关系
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "s3.amazonaws.com" }, "Action": "sts:AssumeRole" }, { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::{accountBId}:role/{accountBrole}" }, "Action": "sts:AssumeRole" } ] }账户 B 跨账户角色
{ "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": "sts:AssumeRole", "Resource": "arn:aws:iam::{accountAId}:role/{accountArole}" } ] }编辑账户 B 附加到角色的策略
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:*", "s3-object-lambda:*" ], "Resource": "*" } ] }和
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "glue:*", "s3:GetBucketLocation", "s3:ListBucket", "s3:ListAllMyBuckets", "s3:GetBucketAcl", "ec2:DescribeVpcEndpoints", "ec2:DescribeRouteTables", "ec2:CreateNetworkInterface", "ec2:DeleteNetworkInterface", "ec2:DescribeNetworkInterfaces", "ec2:DescribeSecurityGroups", "ec2:DescribeSubnets", "ec2:DescribeVpcAttribute", "iam:ListRolePolicies", "iam:GetRole", "iam:GetRolePolicy", "cloudwatch:PutMetricData" ], "Resource": [ "*" ] }, { "Effect": "Allow", "Action": [ "s3:CreateBucket" ], "Resource": [ "arn:aws:s3:::aws-glue-*" ] }, { "Effect": "Allow", "Action": [ "s3:GetObject", "s3:PutObject", "s3:DeleteObject" ], "Resource": [ "arn:aws:s3:::aws-glue-*/*", "arn:aws:s3:::*/*aws-glue-*/*" ] }, { "Effect": "Allow", "Action": [ "s3:GetObject" ], "Resource": [ "arn:aws:s3:::crawler-public*", "arn:aws:s3:::aws-glue-*" ] }, { "Effect": "Allow", "Action": [ "logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents" ], "Resource": [ "arn:aws:logs:*:*:/aws-glue/*" ] }, { "Effect": "Allow", "Action": [ "ec2:CreateTags", "ec2:DeleteTags" ], "Condition": { "ForAllValues:StringEquals": { "aws:TagKeys": [ "aws-glue-service-resource" ] } }, "Resource": [ "arn:aws:ec2:*:*:network-interface/*", "arn:aws:ec2:*:*:security-group/*", "arn:aws:ec2:*:*:instance/*" ] } ] }几乎是多余的访问,但在这一点上我不再担心了。
【问题讨论】:
-
那么,您有账户 B 凭据,您正在使用它们在账户 A 中担任角色,然后使用这些凭据尝试将对象从账户 A 拉到账户 B?您使用的凭据需要同时允许 GetObject 从 A 和 PutObject 到 B。假设的角色只有前者,如果我理解正确的话。
-
@jarmod,担任角色不足以从帐户 A 中提取对象吗?如果我授予 S3 对帐户 B 的完全访问权限,是否可以解决问题?
-
您也可以结合使用源 IAM 策略和目标存储桶策略来执行此操作。看看How can I copy S3 objects from another AWS account? 是否有帮助。
-
当您承担一个角色时,您将获得一组与该角色关联的专用凭证。这些凭据也没有原始权限。
-
您使用哪个 IAM 角色执行复制?在执行从存储桶 A(账户 A)到存储桶 B(账户 B)的复制时,您将使用单个 IAM 角色来访问这两个存储桶,并且该角色应该有足够的权限来访问这两个存储桶。您能否添加您运行的确切命令,以及之前
aws sts get-caller-identity的输出(它不包含敏感信息,您可以删除帐户 ID 并将它们替换为 AccountA 和 AccountB 以实现匿名)
标签: amazon-web-services amazon-s3