调用ListObjectsV2权限拒绝,AWS Data Pipeline运行失败及EMR日志异常
一、解决S3 ListObjectsV2权限拒绝错误
尽管你使用了拥有S3:*权限的DataPipeline角色,仍出现权限错误,可从以下方向排查修复:
S3桶策略限制:即使IAM角色有全量S3权限,若目标S3桶(
ddb-table-backup、data_pipeline_log)的桶策略设置了拒绝规则,或未明确允许DataPipeline角色访问,会导致权限被拒。检查桶策略,确保添加允许DataPipelineDefaultResourceRole的ARN执行s3:ListObjectsV2、s3:DeleteObjects、s3:PutObject等操作的语句。EMR实例角色权限关联问题:确认
DataPipelineDefaultResourceRole的信任关系包含ec2.amazonaws.com(EMR集群的EC2实例需通过该角色获取权限),同时验证角色的权限策略确实包含所有S3操作,且未被权限边界等其他IAM策略限制。特殊场景额外权限配置:
- 若S3桶属于其他AWS账号,需在桶策略中添加允许当前账号DataPipeline角色访问的规则;
- 若桶启用了KMS加密,需给
DataPipelineDefaultResourceRole添加kms:GenerateDataKey、kms:Decrypt权限,对应桶使用的KMS密钥。
PreStepCommand权限上下文验证:你的
preStepCommand中执行了aws s3 rm命令,该命令使用EMR实例的IAM角色(即DataPipelineDefaultResourceRole)执行,需确保该角色对目标桶有s3:ListBucket和s3:DeleteObject权限(即使有S3:*,也要确认未被桶策略覆盖)。
二、解决EMR集群日志未启用问题
你在Default对象中设置的pipelineLogUri仅控制Data Pipeline自身的日志,EMR集群的日志需单独在EmrCluster对象中配置:
在EmrClusterForBackup的fields中添加logUri字段,引用你定义的myLogUri参数,示例如下:
{ "id": "EmrClusterForBackup", "name": "EmrClusterForBackup", "fields": [ // 原有字段保持不变 { "key": "logUri", "stringValue": "#{myLogUri}" } ] }
同时确保myLogUri对应的S3桶(s3://data_pipeline_log/)已存在,且DataPipelineDefaultResourceRole有向该桶写入日志的权限。
修改后的关键CDK代码片段
针对上述两个问题,调整后的核心代码如下:
// 调整EmrClusterForBackup,添加logUri { "id": "EmrClusterForBackup", "name": "EmrClusterForBackup", "fields": [ { "key": "resourceRole", "stringValue": "DataPipelineDefaultResourceRole" }, { "key": "role", "stringValue": "DataPipelineDefaultRole" }, { "key": "coreInstanceCount", "stringValue": "1" }, { "key": "coreInstanceType", "stringValue": "m4.xlarge" }, { "key": "releaseLabel", "stringValue": "emr-5.29.0" }, { "key": "masterInstanceType", "stringValue": "m4.xlarge" }, { "key": "region", "stringValue": props.region }, { "key": "type", "stringValue": "EmrCluster" }, { "key": "terminateAfter", "stringValue": "2 Hours" }, // 新增EMR日志配置 { "key": "logUri", "stringValue": "#{myLogUri}" } ] }, // 可选:将S3BackupLocation的directoryPath改为引用参数,保持配置一致性 { "id": "S3BackupLocation", "name": "S3BackupLocation", "fields": [ { "key": "directoryPath", "stringValue": "#{myOutputS3Location}" }, { "key": "type", "stringValue": "S3DataNode" } ] }
内容的提问来源于stack exchange,提问作者Fisher Coder

