Puncte:2

CredentialRetrievalErrore în containerul ECS

drapel pe

Problemă

Am implementat un cluster ECS și rulez o platformă de orchestrare a locurilor de muncă pe cluster. Unul dintre containerele acestei platforme folosește python docker api pentru a extrage un container din depozitul nostru ECR privat și pentru a executa o lucrare în container. Când lucrarea începe să ruleze, în cele din urmă se confruntă cu o problemă în care nu poate găsi acreditările de asumare a rolului definite în interiorul containerului în /root/.aws/config la fel de credential_source=EcsContainer. Acest lucru se întâmplă după ce codul încearcă să efectueze un apel către S3.

De ce s-ar putea întâmpla asta? Sursa acreditării este definită în container. De ce nu se gaseste?

Detalii

Eroare

......

Excepția de mai sus a fost cauzată de următoarea excepție:
botocore.exceptions.CredentialRetrievalError: Eroare la preluarea acreditărilor din EcsContainer: Nu s-au găsit acreditări în credential_source la care se face referire în profil implicit
  Fișierul „/usr/local/lib/python3.6/site-packages/dagster/core/execution/plan/utils.py”, linia 42, în solid_execution_error_boundary
    Randament
  Fișierul „/usr/local/lib/python3.6/site-packages/dagster/utils/__init__.py”, linia 383, în iterate_with_context
    next_output = următorul (iterator)
  Fișierul „/usr/local/lib/python3.6/site-packages/dagster/core/execution/plan/compute_generator.py”, linia 65, în _coerce_solid_compute_fn_to_iterator
    rezultat = fn(context, **kwargs) dacă context_arg_furnizat altfel fn(**kwargs)
  Fișierul „/opt/dagster/app/solids/files.py”, rândul 33, în stream_url_to_s3
    cu smart.open(f's3://{s3_bucket}/{s3_key}', 'wb', transport_params=tp) ca s3location:
  Fișierul „/usr/local/lib/python3.6/site-packages/smart_open/smart_open_lib.py”, linia 235, deschis
    binary = _open_binary_stream(uri, binary_mode, transport_params)
  Fișierul „/usr/local/lib/python3.6/site-packages/smart_open/smart_open_lib.py”, linia 398, în _open_binary_stream
    fobj = submodule.open_uri(uri, mode, transport_params)
  Fișierul „/usr/local/lib/python3.6/site-packages/smart_open/s3.py”, linia 224, în open_uri
    returnează deschis(parsed_uri['bucket_id'], parsed_uri['key_id'], mod, **kwargs)
  Fișierul „/usr/local/lib/python3.6/site-packages/smart_open/s3.py”, linia 308, deschis
    writebuffer=writebuffer,
  Fișierul „/usr/local/lib/python3.6/site-packages/smart_open/s3.py”, linia 757, în __init__
    _initialize_boto3(self, client, client_kwargs, bucket, key)
  Fișierul „/usr/local/lib/python3.6/site-packages/smart_open/s3.py”, linia 528, în _initialize_boto3
    client = boto3.client('s3', **init_kwargs)
  Fișierul „/usr/local/lib/python3.6/site-packages/boto3/__init__.py”, linia 91, în client
    returnează _get_default_session().client(*args, **kwargs)
  Fișierul „/usr/local/lib/python3.6/site-packages/boto3/session.py”, linia 263, în client
    aws_session_token=aws_session_token, config=config)
  Fișierul „/usr/local/lib/python3.6/site-packages/botocore/session.py”, linia 826, în create_client
    credentials = self.get_credentials()
  Fișierul „/usr/local/lib/python3.6/site-packages/botocore/session.py”, linia 431, în get_credentials
    'furnizor_de_acreditări').load_credentials()
  Fișierul „/usr/local/lib/python3.6/site-packages/botocore/credentials.py”, linia 1962, în load_credentials
    creds = provider.load()
  Fișierul „/usr/local/lib/python3.6/site-packages/botocore/credentials.py”, linia 1395, în încărcare
    return self._load_creds_via_assume_role(self._profile_name)
  Fișier „/usr/local/lib/python3.6/site-packages/botocore/credentials.py”, rândul 1410, în _load_creds_via_assume_role
    role_config, profile_name
  Fișierul „/usr/local/lib/python3.6/site-packages/botocore/credentials.py”, linia 1566, în _resolve_source_credentials
    sursă_acreditări, nume_profil
  Fișierul „/usr/local/lib/python3.6/site-packages/botocore/credentials.py”, linia 1623, în _resolve_credentials_from_source
    „în profilul %s” % profile_name

Configurare

Rolul containerului:

  EcsTaskRole:
    Tip: AWS::IAM::Rol
    Proprietăți:
      Descriere: Rolul asumat de containere, permițându-le să apeleze servicii AWS.
      RoleName: !Sub ecs-task-trans-role-development
      AsumeRolePolicyDocument:
        Afirmație:
        - Efect: Permite
          Principal:
            Serviciu:
            - ecs-tasks.amazonaws.com
          Acțiune:
          - sts:AssumeRole
      Politici:
      - PolicyName: !Sub 's3-access-${EnvironmentName}-${AWS::StackName}'
        Document de politică:
          Afirmație:
          - Efect: Permite
            Acțiune:
              - s3:*
            Resursă:
              - "*"

/root/.aws/config in recipient:

[Mod implicit]
role_arn = arn:aws:iam::<contul meu>:role/ecs-task-trans-role-development
credential_source = EcsContainer

Nu este /root/.aws/credentials fișier deoarece scopul asumării unui rol din fișierul de configurare este de a prelua acreditările temporare. https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-role.html

Parțial TaskDefinition:


  Definiția sarcinii:
    Tip: AWS::ECS::TaskDefinition
    Proprietăți:
      ...
      Definiții container:
          ...
          MountPoints:
            - ContainerPath: „/var/run/docker.sock”
              Sursă Volum: docker_sock
              Numai citire: adevărat
            - ContainerPath: „/root/.docker”
              SourceVolume: docker_dir
              Numai citire: adevărat
            - ContainerPath: „/usr/bin/docker-credential-ecr-login”
              SourceVolume: docker_creds
              Numai citire: adevărat

Ce am incercat

  1. Folosește taskExecutionRole mai degrabă decât rolul de container.
  2. Exportator AWS_PROFILE=implicit în recipient

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.