Рейтинг:2

CredentialRetrievalError в контейнере ECS

флаг pe

Проблема

Я развернул кластер 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
              Только для чтения: правда

Что я пробовал

  1. Использовать задачаExecutionRole а не роль контейнера.
  2. Экспорт AWS_PROFILE=по умолчанию в контейнере

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.