Score:2

CredentialRetrievalError ภายในคอนเทนเนอร์ ECS

ธง pe

ปัญหา

ฉันได้ปรับใช้คลัสเตอร์ 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
              อ่านอย่างเดียว: จริง

สิ่งที่ฉันได้ลอง

  1. ใช้ บทบาทการดำเนินการ มากกว่าบทบาทของคอนเทนเนอร์
  2. การส่งออก AWS_PROFILE=ค่าเริ่มต้น ในคอนเทนเนอร์

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา