#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 был успешно поднят.
Действительно круто.