You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

跨AWS账户迁移S3文件遇403 AccessDenied,请求排查IAM配置

解决跨账户S3迁移PUT临时文件时的Access Denied错误

核心问题分析

你遇到的403错误是因为账户B的目标S3桶未配置允许账户A角色写入的桶策略,同时账户A的角色当前权限仅覆盖自身桶,无法对账户B的桶执行写入操作。迁移过程中(尤其是用Glue这类工具时)需要在目标桶创建临时文件,这一步缺少必要权限导致失败。

修复步骤

1. 给账户B的目标桶添加桶策略

登录账户B的AWS控制台,找到目标S3桶,进入「权限」→「桶策略」,添加以下策略(替换占位符为实际值):

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::{accountAId}:role/cross-accountA-sample-role"
            },
            "Action": [
                "s3:ListBucket",
                "s3:PutObject",
                "s3:PutObjectAcl",
                "s3:DeleteObject",
                "s3:GetBucketLocation"
            ],
            "Resource": [
                "arn:aws:s3:::{accountB-target-bucket-name}",
                "arn:aws:s3:::{accountB-target-bucket-name}/*"
            ]
        }
    ]
}

这个策略允许账户A的cross-accountA-sample-role角色对目标桶执行列表、写入、删除等操作,满足临时文件创建和清理的需求。

2. 补充账户A角色的目标桶权限(可选但更严谨)

登录账户A的AWS控制台,找到cross-accountA-sample-role角色,编辑其附加的策略,新增以下Statement:

{
    "Effect": "Allow",
    "Action": [
        "s3:ListBucket",
        "s3:PutObject",
        "s3:DeleteObject",
        "s3:GetBucketLocation"
    ],
    "Resource": [
        "arn:aws:s3:::{accountB-target-bucket-name}",
        "arn:aws:s3:::{accountB-target-bucket-name}/*"
    ]
}

确保该角色拥有对账户B目标桶的写入权限,完成IAM权限链的闭环。

3. 验证权限有效性

用AWS CLI测试权限链是否正常:

  1. 切换到账户B的角色凭证,执行角色扮演:
aws sts assume-role --role-arn arn:aws:iam::{accountAId}:role/cross-accountA-sample-role --role-session-name test-s3-migrate
  1. 使用返回的临时凭证,测试写入目标桶的临时路径:
# 替换临时凭证的值
export AWS_ACCESS_KEY_ID=临时AccessKey
export AWS_SECRET_ACCESS_KEY=临时SecretKey
export AWS_SESSION_TOKEN=临时SessionToken

# 测试写入临时文件
echo "test" > temp.txt
aws s3 cp temp.txt s3://{accountB-target-bucket-name}/dt/output1/parquet/_temporary/0/test.txt

如果能成功上传,说明权限配置正确。

额外排查点

  • 检查目标桶的Block Public Access设置:确保未完全阻止跨账户IAM访问(Block Public Access不影响合法的跨账户IAM角色访问)。
  • 确认Glue作业(如果用Glue迁移)的执行角色是账户B的跨账户角色,且该角色已正确配置sts:AssumeRole权限访问账户A的角色。

内容的提问来源于stack exchange,提问作者noobie-php

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 15:15:42