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
- Folosește
taskExecutionRole
mai degrabă decât rolul de container.
- Exportator
AWS_PROFILE=implicit
în recipient