Возникли проблемы с доступом к значению хранилища параметров из задачи ECS с помощью ExecutionRole - PullRequest
0 голосов
/ 09 октября 2019

Я пытаюсь передать конфиденциальные данные в контейнер, который работает в службе ECS. Я следовал документации AWS для того, как это сделать ( ссылка ). Я сделал следующее:

  • определение my-param в хранилище параметров SSM
  • создание TaskRole (см. Ниже)
  • использование TaskRole в ExecutionRole задачи
  • добавление переменной среды к экземпляру контейнера

Вот определение задачи:

Description: >
  An IAM Role that gives tasks access to SSM Parameter store.
  https://docs.aws.amazon.com/AmazonECS/latest/developerguide/specifying-sensitive-data.html

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" ]
            }]
        }
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy
      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: An IAM Role that gives tasks read access to SSM Parameter store parameters.
    Value: !Ref TaskRole

Вот определение задачи, в котором я использую эту роль:

  TaskDefinition:
    Type: AWS::ECS::TaskDefinition
    Properties:
      Family: backend
      ExecutionRoleArn: !Ref TaskRole <--- TaskRole is passed in as a parameter
      ContainerDefinitions:
        - Name: backend
          Essential: true
          Image: !Ref ImageUrl
          MemoryReservation: 128
          Command:
            - '/start_prod.sh'
          Secrets: <-- here is where I'm trying to access the parameter
            - Name: MY_PARAM 
              ValueFrom: !Sub "arn:aws:ssm:${AWS::Region}:${AWS::AccountId}:parameter/my-param"
          Environment:
            - Name: GIT_SHA
              Value: !Ref GitSHA

В мои CloudFormation::Init метаданные для LaunchConfiguration я добавил следующее:

            03_enable_awslogs_executionrole_override:
              command: echo ECS_ENABLE_AWSLOGS_EXECUTIONROLE_OVERRIDE=true >> /etc/ecs/ecs.config

Когда я обновляю стек, он, кажется, зависает, а затем в конечном итоге откатывается с failed to stabilize ошибка в службе, в которой у меня есть задача, которая пытается использовать определенную мной TaskRole.

Исходный код проекта находится здесь: https://gitlab.com/verbose-equals-true/django-postgres-vue-gitlab-ecs

1 Ответ

0 голосов
/ 10 октября 2019

Я просто использовал устаревший контейнерный агент. Из документов :

Для задач, использующих тип запуска EC2, эта функция требует, чтобы ваш экземпляр контейнера имел версию 1.22.0 или более позднюю версию агента контейнера.

После обновления моего LaunchConfiguration все заработало:

Parameters:

  ECSAMI:
    Description: AMI ID
    Type: AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>
    Default: /aws/service/ecs/optimized-ami/amazon-linux/recommended/image_id
    Description: The Amazon Machine Image ID used for the cluster, leave it as the default value to get the latest AMI

  ContainerInstances:
    Type: AWS::AutoScaling::LaunchConfiguration
    Properties:
      ImageId: !Ref ECSAMI
      ...
...