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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:14:30