Задание создания Docker в контексте ECS не удается извлечь секрет AWS для извлечения изображения из DockerHub

#amazon-web-services #docker #docker-compose #amazon-ecs

Вопрос:

Я пытаюсь использовать docker compose для создания и запуска небольшого кластера ECS-Fargate всего с 2 контейнерами. Одно из изображений контейнера находится в моем личном хранилище на DockerHub. Однако, командование

 docker compose --file path-to-docker-compose-yml-file up
 

запущенный в контексте ECS продолжает отказывать с сообщением об ошибке:

 QuarkustodoService TaskFailedToStart: ResourceInitializationError: unable to pull secrets or registry auth: execution resource retrieval failed: unable to get registry auth from asm: service call has been retried 1 time(s): failed to fetch secret arn:aws:secretsmanager:us-east-2:1071311304...
 

Однако функция ecsTaskExecutionRole моего идентификатора пользователя AWS действительно оснащена необходимыми политиками для получения секрета и расшифровки моих учетных данных DockerHub, хранящихся в AWS secret-manager и kms. Я использую идентификатор пользователя DockerHub и токен доступа в качестве учетных данных и проверяю, работают ли они.

Может ли кто-нибудь помочь или у кого есть идеи, как устранить проблему?

Полный вывод строки cmd гласит::

 docker compose --file path-to-docker-compose.yml up
[ ] Running 17/17
 - quarkus-todo                      DeleteComplete                                                                                    205.2s
 - Cluster                           DeleteComplete                                                                                    154.2s
 - Quarkustodo8080TargetGroup        DeleteComplete                                                                                    155.5s
 - CloudMap                          DeleteComplete                                                                                    200.2s
 - LogGroup                          DeleteComplete                                                                                    157.5s
 - DbTaskExecutionRole               DeleteComplete                                                                                    147.6s
 - QuarkustodoTaskExecutionRole      DeleteComplete                                                                                    157.5s
 - DefaultNetwork                    DeleteComplete                                                                                    154.2s
 - Quarkustodo8080Listener           DeleteComplete                                                                                    152.3s
 - DefaultNetworkIngress             DeleteComplete                                                                                     82.4s
 - Default8080Ingress                DeleteComplete                                                                                     81.2s
 - DbTaskDefinition                  DeleteComplete                                                                                    127.4s
 - QuarkustodoTaskDefinition         DeleteComplete                                                                                    137.2s
 - QuarkustodoServiceDiscoveryEntry  DeleteComplete                                                                                    106.1s
 - DbServiceDiscoveryEntry           DeleteComplete                                                                                     96.4s
 - DbService                         DeleteComplete                                                                                     90.2s
 - QuarkustodoService                DeleteComplete                                                                                    100.3s
QuarkustodoService TaskFailedToStart: ResourceInitializationError: unable to pull secrets or registry auth: execution resource retrieval failed: unable to get registry auth from asm: service call has been retried 1 time(s): failed to fetch secret arn:aws:secretsmanager:us-east-2:1071311304...
 

Я использую:

 Docker version 20.10.6 on Win10
aws --version
aws-cli/2.2.9 Python/3.8.8 Windows/10 exe/AMD64 prompt/off
ecs-cli --version
ecs-cli version 1.21.0 (bb0b8f0)
 

Это мой файл my docker-compose.yml:

 version: "3.8"

x-aws-vpc: "vpc-07cdb7bacc9b8010a"
x-aws-loadbalancer: "exter-Publi-FY7S28M1QL7L"

services:
    quarkus-todo: 
        image: bergemannf/mytoolchain:quarkus-todo-ce
        x-aws-pull_credentials: arn:aws:secretsmanager:us-east-2:1111111111111:secret:DockerHubAPIToken-d9RKLn

        ports:
            - target: 8080
              x-aws-protocol: http

    db:
        image: postgres
        environment:
            POSTGRES_USER: "<some user-id>"
            POSTGRES_PASSWORD: "<some pw>"
            POSTGRES_DB: "<some db>"
 

Это мой файл ecs-param.yml:

 version: 1
task_definition:
  ecs_network_mode: awsvpc
  task_role_arn: arn:aws:iam::107131130437:role/ECSTaskRole
  task_execution_role:  arn:aws:iam::1111111111:role/ecsTaskExecutionRole
  task_size:
    cpu_limit: 256
    mem_limit: 512
  pid_mode: task
  ipc_mode: task
  services:
    quarkus-todo:
      essential: true
      depends_on:
        - container_name: db
          condition: START

      init_process_enabled: false
      healthcheck:
        test: ["CMD", "curl -f http://localhost"]
        interval: 10
        timeout: 5
        retries: 3
        start_period: 180
      secrets:  
        - value_from: arn:aws:secretsmanager:us-east-2:107131130437:secret:DockerHubAPIToken-d9RKLn
#          name: dev/DockerHubAccessToken
    db:
      essential: false
  efs_volumes:
      - name: postgres-db-efs
        filesystem_id: fs-5473872f
        root_directory: /
        access_point: fsap-11111111
run_params:
  network_configuration:
    awsvpc_configuration:
      subnets: 
        - subnet-0af2d8c8faa7f6b9f
        - subnet-039c3a3061848c2a9
      security_groups: 
        - sg-0d52c217fa0f25cfb
      assign_public_ip: ENABLED
 

Ответ №1:

Прежде всего, вы упоминаете ecs-cli и ecs-param.yml файл, но интеграция compose/ecs не использует их (для записей интерфейс командной строки ECS превратился в второй пилот AWS и отказался от совместимости с compose, которая была реализована с использованием нового docker compose , который вы используете).

С учетом сказанного, ваш файл compose на самом деле выглядит хорошо. Вам нужно только вызвать x-aws-pull_credentials параметр, и docker сгенерирует шаблон CFN со всеми необходимыми проводами. Например, я использую этот файл компоновки:

 version: "3.8"

services:
    myweb: 
        image: mreferre/nginx-custom-site
        x-aws-pull_credentials: arn:aws:secretsmanager:us-west-2:111111111111:secret:dockerhubAccessToken-xyzwh
        ports: 
          - "80:80"
 

…. и это работает просто отлично

 $ docker compose up      
[ ] Running 14/14
 ⠿ downloads                   CreateComplete                                                                                                                                                                             190.3s
 ⠿ Cluster                     CreateComplete                                                                                                                                                                               6.0s
 ⠿ CloudMap                    CreateComplete                                                                                                                                                                              47.0s
 ⠿ DefaultNetwork              CreateComplete                                                                                                                                                                               5.0s
 ⠿ MywebTaskExecutionRole      CreateComplete                                                                                                                                                                              20.1s
 ⠿ MywebTCP80TargetGroup       CreateComplete                                                                                                                                                                               1.0s
 ⠿ LogGroup                    CreateComplete                                                                                                                                                                               2.0s
 ⠿ LoadBalancer                CreateComplete                                                                                                                                                                              92.0s
 ⠿ DefaultNetworkIngress       CreateComplete                                                                                                                                                                               1.0s
 ⠿ Default80Ingress            CreateComplete                                                                                                                                                                               1.0s
 ⠿ MywebTaskDefinition         CreateComplete                                                                                                                                                                               3.0s
 ⠿ MywebServiceDiscoveryEntry  CreateComplete                                                                                                                                                                               2.0s
 ⠿ MywebTCP80Listener          CreateComplete                                                                                                                                                                               2.0s
 ⠿ MywebService                CreateComplete                                                                                                                                                                              76.6s
$
 

[обратите внимание, что изображение, которое я использую, не является частным, но весь процесс извлечения изображения и входа в DH не приводит к ошибке]

Единственное, о чем я могу думать, это о том, есть ли у вас сетевая настройка, которая не позволяет вам достичь конечной точки диспетчера секретов?

Комментарии:

1. Спасибо, что рассказали об этом. Возможно, вы указали мне на основную причину проблемы. В моем docker-compose.yml файле я использую группу безопасности/vpc ( x-aws-vpc: "vpc-07cdb7bacc9b8010a" ) Я создал его ранее. Это может не разрешить связь с secretsmanager. Можете ли вы определить, что необходимо сделать, чтобы это произошло? Шаги на веб-консоли AWS будут в порядке. В Интернете есть довольно много материалов, доступных. Но страницы, которые я нашел по этой теме, совершенно сбивают меня с толку.

2. Mh… вы не используете SG/VPC, вы просто на самом деле используете VPC. SGS создается на лету и назначается задачам (создается на лету). В этих SGS, как правило, открыто исходящее подключение, поэтому единственная причина, по которой ваша задача не сможет взаимодействовать за пределами этого VPC, будет связана с ACL, который этого не позволяет. Прежде чем вы вскипятите океан с отладкой вашего VPC, я бы посоветовал вам закомментировать x-aws-vpc строку, чтобы она использовала VPC по умолчанию (при условии, что он не был изменен, он должен разрешать все исходящие). Если VPC по умолчанию работает, мы можем сосредоточиться на другом VPC.

3. Спасибо вам за предложения. После воссоздания моего vpc по умолчанию через веб-консоль AWS я смог уменьшить размер своего файла docker-compose.yml до такого:

4. version: "3.8" services: quarkus-todo: image: bergemannf/mytoolchain:quarkus-todo-ce x-aws-pull_credentials: arn:aws:secretsmanager:us-east-2:107131130437:secret:DockerHubAPIToken-d9RKLn ports: - target: 8080 x-aws-protocol: http Но сообщение об ошибке по-прежнему такое же, как указано выше. Имеет ли смысл воссоздать секрет и ключ kms через интерфейс командной строки?

5. К сожалению, эта проблема все еще сохраняется, и я пока не смог найти решение. Теперь я считаю, что ошибка связана с отсутствием разрешений AWS IAM. В следующей ссылке представлен довольно большой список разрешений, необходимых для использования docker compose с AWS, см. docs.docker.com/cloud/ecs-integration . У вас есть идея, какие разрешения могут отсутствовать для функции ECSTaskExectionRole? Я позаботился о тех, которые указаны в этой статье: aws.amazon.com/de/blogs/containers/. … Мы будем признательны вам за вашу помощь. — Фрэнк

Ответ №2:

Я мог бы решить эту проблему, создав новый секрет ecs с помощью следующей команды:

 docker ecs secret create <yourTokenName> --username <yourUserName>  --password <yourPassword>
 

Затем эта команда выводит секретный arn AWS в качестве ссылки на вновь созданный секрет.
Этот arn я поместил в назначенное место в docker-compose.yml
Затем docker compose up cmd сработал, и кластер ECS был успешно поднят.
Действительно круто.