ECS任务通过ExecutionRole访问SSM Parameter Store值失败求助
ECS任务读取SSM参数失败:堆栈回滚问题排查与解决
我来帮你梳理下这个ECS任务读取SSM参数失败导致堆栈回滚的问题,结合你的配置来看,核心问题是混淆了ECS的ExecutionRole和TaskRole的作用,还有几个细节需要调整:
1. 先搞清楚两个角色的区别
ECS任务里的ExecutionRoleArn和TaskRoleArn是完全不同的角色,绝对不能混用:
- ExecutionRole:负责任务执行层面的操作——比如拉取Docker镜像、推送日志到CloudWatch、管理容器网络等,需要绑定
AmazonECSTaskExecutionRolePolicy托管策略。 - TaskRole:专门给容器内的应用程序使用,用来访问SSM Parameter Store、DynamoDB这类AWS服务,不需要包含执行层面的权限。
你的配置里把TaskRole当成了ExecutionRole来用,这会导致ECS执行任务时权限不匹配,进而引发堆栈回滚。
2. 修正后的CloudFormation配置
单独拆分ExecutionRole和TaskRole
首先创建专门的ExecutionRole:
ExecutionRole: Type: AWS::IAM::Role Properties: RoleName: !Sub ecs-execution-role-${AWS::StackName} Path: / AssumeRolePolicyDocument: | { "Statement": [{"Effect": "Allow", "Principal": {"Service": ["ecs-tasks.amazonaws.com"]}, "Action": ["sts:AssumeRole"]}] } ManagedPolicyArns: - arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy
然后修正TaskRole,只保留访问SSM的必要权限:
Description: > IAM Role for ECS tasks to access SSM Parameter Store Resources: TaskRole: Type: AWS::IAM::Role Properties: RoleName: !Sub ecs-task-role-${AWS::StackName} Path: / AssumeRolePolicyDocument: | { "Statement": [{"Effect": "Allow", "Principal": {"Service": ["ecs-tasks.amazonaws.com"]}, "Action": ["sts:AssumeRole"]}] } Policies: - PolicyName: !Sub ecs-task-role-${AWS::StackName} PolicyDocument: !Sub | { "Version": "2012-10-17", "Statement": [{"Effect": "Allow", "Action": ["ssm:GetParameters"], "Resource": ["arn:aws:ssm:${AWS::Region}:${AWS::AccountId}:parameter/my-param"]}] } Outputs: TaskRole: Description: Role for ECS tasks to read SSM parameters Value: !Ref TaskRole
正确配置任务定义
在TaskDefinition里分别指定两个角色的ARN:
TaskDefinition: Type: AWS::ECS::TaskDefinition Properties: Family: backend ExecutionRoleArn: !Ref ExecutionRole # 用专门的执行角色处理镜像拉取、日志推送 TaskRoleArn: !Ref TaskRole # 给应用程序用的角色,用来读取SSM参数 ContainerDefinitions: - Name: backend Essential: true Image: !Ref ImageUrl MemoryReservation: 128 Command: ['/start_prod.sh'] Secrets: - Name: MY_PARAM ValueFrom: !Sub "arn:aws:ssm:${AWS::Region}:${AWS::AccountId}:parameter/my-param" Environment: - Name: GIT_SHA Value: !Ref GitSHA
3. ECS代理配置的检查
你添加的ECS_ENABLE_AWSLOGS_EXECUTIONROLE_OVERRIDE=true配置是为了让ExecutionRole接管CloudWatch日志的推送权限,这个方向是对的,但需要确认:
- 容器实例的
/etc/ecs/ecs.config文件确实已经写入了这个配置(可以登录实例直接查看) - ExecutionRole绑定的
AmazonECSTaskExecutionRolePolicy已经包含了CloudWatch日志的必要权限(默认是包含的)
4. 后续排查点
如果调整后堆栈还是回滚,建议:
- 去ECS服务的Events标签查看具体错误日志,里面会明确告诉你是权限不足、参数不存在还是其他问题
- 确认SSM参数
my-param的ARN和你任务定义里的完全匹配(区域、账号ID、参数名一个都不能错) - 检查容器实例的IAM角色(不是任务/执行角色)是否绑定了
AmazonEC2ContainerServiceforEC2Role,这个角色负责让实例和ECS服务正常通信
内容的提问来源于stack exchange,提问作者briancaffey
相关产品推荐
相关产品推荐

