使用GoogleCloudStorageToS3Operator遇ListObjectsV2权限拒绝问题求助
我来帮你拆解这个问题——既然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

