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

使用GoogleCloudStorageToS3Operator遇ListObjectsV2权限拒绝问题求助

排查GoogleCloudStorageToS3Operator的S3 AccessDenied问题

我来帮你拆解这个问题——既然S3KeySensor能正常运行,说明你的AWS连接凭证是有效的,但GoogleCloudStorageToS3Operator在调用ListObjectsV2时被拒绝,核心原因大概率是算子所需权限与Sensor不一致,或者参数配置有细节偏差,下面分点给你排查方向:

1. 检查AWS IAM权限是否缺失

S3KeySensor仅需要验证文件是否存在,通常只用到s3:ListBucket或s3:GetObject的基础权限;但GoogleCloudStorageToS3Operator在传输文件前,会先调用ListObjectsV2来确认目标S3路径的状态(比如避免重复上传、校验路径合法性),这就要求你的IAM角色必须明确包含s3:ListBucket权限。

建议给对应的IAM策略补充以下权限(替换成你的bucket和路径):

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::test.mydomain.com",
                "arn:aws:s3:::test.mydomain.com/folder1/folder2/*"
            ]
        }
    ]
}

2. 修正dest_s3_key的参数格式

你的代码里把完整的S3路径写在了dest_s3_key里,但GoogleCloudStorageToS3Operator的参数设计是bucket单独指定,dest_s3_key只需要路径前缀。这种混合写法可能导致算子内部解析路径出错,进而触发权限验证失败。

调整后的代码示例:

impressions_from_gcs_to_s3 = GoogleCloudStorageToS3Operator(
    task_id='impressions_from_gcs_to_s3',
    bucket="mygcsbucket",
    prefix=filename,  # 注意:如果是指定单个文件,建议用prefix而非delimiter,delimiter一般用来区分目录层级
    google_cloud_storage_conn_id="google_cloud_storage_default",
    dest_aws_conn_id="aws_connection",
    dest_s3_bucket="test.mydomain.com",  # 单独声明目标bucket
    dest_s3_key="folder1/folder2/",  # 仅保留路径前缀
    dag=dag,
)

补充:原代码里的delimiter=filename可能不符合预期,delimiter参数是用来分割GCS对象路径的(比如用/来模拟目录),如果要传输特定文件名的文件,应该用prefix=filename来过滤。

3. 确认AWS连接的区域配置

虽然S3KeySensor能运行,但如果你的S3 bucket和AWS连接配置的区域不一致,也可能导致ListObjectsV2请求被拒绝。检查你的aws_connection配置里的区域是否和目标bucket的区域完全匹配。

内容的提问来源于stack exchange,提问作者poiuytrez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:34:50