ปัญหา
ฉันได้ปรับใช้คลัสเตอร์ ECS และกำลังใช้งานแพลตฟอร์มการจัดการงานบนคลัสเตอร์ หนึ่งในคอนเทนเนอร์ของแพลตฟอร์มนี้ใช้ python docker api เพื่อดึงคอนเทนเนอร์จาก repo ECR ส่วนตัวของเราและดำเนินงานภายในคอนเทนเนอร์ เมื่องานเริ่มทำงาน ในที่สุดก็พบกับปัญหาที่ไม่สามารถค้นหาข้อมูลประจำตัวของบทบาทสมมุติที่กำหนดไว้ภายในคอนเทนเนอร์ใน /root/.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
next_output = ถัดไป (วนซ้ำ)
ไฟล์ "/usr/local/lib/python3.6/site-packages/dagster/core/execution/plan/compute_generator.py", บรรทัด 65 ใน _coerce_solid_compute_fn_to_iterator
ผลลัพธ์ = fn(บริบท **kwargs) ถ้าบริบท_arg_provided อื่น 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, binary_mode, transport_params)
ไฟล์ "/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
กลับมาเปิด (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, profile_name
ไฟล์ "/usr/local/lib/python3.6/site-packages/botocore/credentials.py", บรรทัด 1566 ใน _resolve_source_credentials
credential_source, profile_name
ไฟล์ "/usr/local/lib/python3.6/site-packages/botocore/credentials.py", บรรทัด 1623 ใน _resolve_credentials_from_source
'ในโปรไฟล์ %s' % profile_name
การกำหนดค่า
บทบาทคอนเทนเนอร์:
EcsTaskบทบาท:
ประเภท: AWS::IAM::บทบาท
คุณสมบัติ:
คำอธิบาย: บทบาทของคอนเทนเนอร์ที่อนุญาตให้เรียกใช้บริการของ AWS
ชื่อบทบาท: !Sub ecs-task-trans-role-development
สมมติบทบาทนโยบายเอกสาร:
คำแถลง:
- ผลกระทบ: อนุญาต
อาจารย์ใหญ่:
บริการ:
- ecs-tasks.amazonaws.com
หนังบู๊:
- ห่วง: AssumeRole
นโยบาย:
- PolicyName: !Sub 's3-access-${EnvironmentName}-${AWS::StackName}'
เอกสารนโยบาย:
คำแถลง:
- ผลกระทบ: อนุญาต
หนังบู๊:
- s3:*
ทรัพยากร:
- "*"
/root/.aws/config
ในคอนเทนเนอร์:
[ค่าเริ่มต้น]
role_arn = arn:aws:iam::<บัญชีของฉัน>:role/ecs-task-trans-role-development
credential_source = EcsContainer
ไม่มี /root/.aws/ข้อมูลประจำตัว
ไฟล์เนื่องจากจุดรับบทบาทจากไฟล์กำหนดค่าคือการดึงข้อมูลรับรองชั่วคราว
https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-role.html
บางส่วน คำจำกัดความของงาน
:
คำจำกัดความของงาน:
ประเภท: AWS::ECS::TaskDefinition
คุณสมบัติ:
...
คำจำกัดความของคอนเทนเนอร์:
...
MountPoints:
- เส้นทางคอนเทนเนอร์: "/var/run/docker.sock"
SourceVolume: docker_sock
อ่านอย่างเดียว: จริง
- เส้นทางคอนเทนเนอร์: "/root/.docker"
SourceVolume: docker_dir
อ่านอย่างเดียว: จริง
- เส้นทางคอนเทนเนอร์: "/usr/bin/docker-credential-ecr-login"
SourceVolume: docker_creds
อ่านอย่างเดียว: จริง
สิ่งที่ฉันได้ลอง
- ใช้
บทบาทการดำเนินการ
มากกว่าบทบาทของคอนเทนเนอร์
- การส่งออก
AWS_PROFILE=ค่าเริ่มต้น
ในคอนเทนเนอร์