Проблема
Я развернул кластер ECS и запускаю в нем платформу оркестрации заданий. Один из контейнеров этой платформы использует API-интерфейс python docker для извлечения контейнера из нашего частного репозитория ECR и выполнения задания в контейнере. Когда задание начинает выполняться, оно в конечном итоге сталкивается с проблемой, когда не может найти учетные данные предполагаемой роли, определенные внутри контейнера в /корень/.aws/config
как credential_source = EcsContainer
. Это происходит после того, как код пытается сделать вызов S3.
Почему это может происходить? Источник учетных данных определяется в контейнере. Почему не найдено?
Подробности
Ошибка
......
Вышеупомянутое исключение было вызвано следующим исключением:
botocore.exceptions.CredentialRetrievalError: ошибка при получении учетных данных из EcsContainer: учетные данные не найдены в credential_source, указанном в профиле по умолчанию
Файл "/usr/local/lib/python3.6/site-packages/dagster/core/execution/plan/utils.py", строка 42, в solid_execution_error_boundary
урожай
Файл "/usr/local/lib/python3.6/site-packages/dagster/utils/__init__.py", строка 383, в iterate_with_context
следующий_выход = следующий (итератор)
Файл "/usr/local/lib/python3.6/site-packages/dagster/core/execution/plan/compute_generator.py", строка 65, в _coerce_solid_compute_fn_to_iterator
результат = fn(context, **kwargs) if context_arg_provided else fn(**kwargs)
Файл "/opt/dagster/app/solids/files.py", строка 33, в stream_url_to_s3
с smart.open(f's3://{s3_bucket}/{s3_key}', 'wb', transport_params=tp) в качестве s3location:
Файл "/usr/local/lib/python3.6/site-packages/smart_open/smart_open_lib.py", строка 235, в открытом
двоичный = _open_binary_stream (uri, двоичный_режим, транспортные_параметры)
Файл "/usr/local/lib/python3.6/site-packages/smart_open/smart_open_lib.py", строка 398, в _open_binary_stream
fobj = submodule.open_uri(uri, режим, transport_params)
Файл "/usr/local/lib/python3.6/site-packages/smart_open/s3.py", строка 224, в open_uri
return open(parsed_uri['bucket_id'], parsed_uri['key_id'], режим, **kwargs)
Файл "/usr/local/lib/python3.6/site-packages/smart_open/s3.py", строка 308, открыт
буфер записи = буфер записи,
Файл "/usr/local/lib/python3.6/site-packages/smart_open/s3.py", строка 757, в __init__
_initialize_boto3 (я, клиент, client_kwargs, ведро, ключ)
Файл "/usr/local/lib/python3.6/site-packages/smart_open/s3.py", строка 528, в _initialize_boto3
клиент = boto3.client('s3', **init_kwargs)
Файл "/usr/local/lib/python3.6/site-packages/boto3/__init__.py", строка 91, в клиенте
вернуть _get_default_session().client(*args, **kwargs)
Файл "/usr/local/lib/python3.6/site-packages/boto3/session.py", строка 263, в клиенте
aws_session_token=aws_session_token, config=config)
Файл "/usr/local/lib/python3.6/site-packages/botocore/session.py", строка 826, в create_client
учетные данные = self.get_credentials()
Файл "/usr/local/lib/python3.6/site-packages/botocore/session.py", строка 431, в get_credentials
'credential_provider').load_credentials()
Файл "/usr/local/lib/python3.6/site-packages/botocore/credentials.py", строка 1962, в load_credentials
кредиты = провайдер.загрузить()
Файл "/usr/local/lib/python3.6/site-packages/botocore/credentials.py", строка 1395, загружается
вернуть self._load_creds_via_assume_role(self._profile_name)
Файл "/usr/local/lib/python3.6/site-packages/botocore/credentials.py", строка 1410, в _load_creds_via_assume_role
role_config, имя_профиля
Файл "/usr/local/lib/python3.6/site-packages/botocore/credentials.py", строка 1566, в _resolve_source_credentials
Credential_source, имя_профиля
Файл "/usr/local/lib/python3.6/site-packages/botocore/credentials.py", строка 1623, в _resolve_credentials_from_source
'в профиле %s' % имя_профиля
Конфигурация
Роль контейнера:
Экстаскроле:
Тип: AWS::IAM::Роль
Характеристики:
Описание: Роль, которую берут на себя контейнеры, позволяет им вызывать сервисы AWS.
RoleName: !Sub ecs-task-trans-role-development
Ассумролеполицидокумент:
Заявление:
- Эффект: Разрешить
Главный:
Оказание услуг:
- ecs-tasks.amazonaws.com
Действие:
- sts:AssumeRole
Политики:
- PolicyName: !Sub 's3-access-${EnvironmentName}-${AWS::StackName}'
Политический документ:
Заявление:
- Эффект: Разрешить
Действие:
- с3:*
Ресурс:
- "*"
/корень/.aws/config
в контейнере:
[По умолчанию]
role_arn = arn:aws:iam::<моя учетная запись>:role/ecs-task-trans-role-development
credential_source = Эксконтейнер
Здесь нет /root/.aws/учетные данные
файл, потому что точка принятия роли из файла конфигурации состоит в том, чтобы получить временные учетные данные.
https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-role.html
Частичный Определение задачи
:
Определение задачи:
Тип: AWS::ECS::TaskDefinition
Характеристики:
...
Определения контейнера:
...
Точки монтирования:
- ContainerPath: "/var/run/docker.sock"
Исходный том: docker_sock
Только для чтения: правда
- ContainerPath: "/root/.docker"
Исходный том: docker_dir
Только для чтения: правда
- ContainerPath: "/usr/bin/docker-credential-ecr-login"
Исходный том: docker_creds
Только для чтения: правда
Что я пробовал
- Использовать
задачаExecutionRole
а не роль контейнера.
- Экспорт
AWS_PROFILE=по умолчанию
в контейнере