跳至內容

如何允許次要帳戶在我的 Amazon ECR 映像檔儲存庫中推送或提取映像檔?

2 分的閱讀內容
0

我想要允許次要 AWS 帳戶在我的 Amazon Elastic Container Registry (Amazon ECR) 映像檔儲存庫中推送或提取映像檔。

簡短描述

若要讓次要帳戶能從您的 Amazon ECR 儲存庫推送或提取映像檔,請在您的主要帳戶中建立登錄或儲存庫政策。若要提供 AWS 區域中所有儲存庫或多個不同儲存庫的存取權,請設定登錄層級政策。若只想提供單一儲存庫的存取權,或想限制同一儲存庫中不同身分的存取權,請設定儲存庫層級政策。設定政策以允許次要帳戶執行特定 API 呼叫。

然後,在次要帳戶中產生 Docker 驗證權杖,以從主要帳戶的儲存庫推送和提取映像檔。

解決方法

**注意:**如果您在執行 AWS Command Line Interface (AWS CLI) 命令時收到錯誤訊息,請參閱對 AWS CLI 錯誤進行疑難排解。此外,請確定您使用的是最新的 AWS CLI 版本

設定登錄層級權限

**先決條件:**您的 Amazon ECR 登錄必須使用 V2 政策。如果您使用的是 V1 政策,請切換至 V2。如需 V2 政策的更多資訊,請參閱 Amazon ECR 將登錄政策擴展至所有 ECR 動作

請完成下列步驟:

  1. 開啟主要帳戶的 Amazon ECR 主控台
  2. 在導覽窗格中,於 Private registry (私有登錄) 底下,選擇 Features & Settings (功能與設定)。
  3. 選擇 Permissions (權限)。
  4. 選擇 Edit JSON (編輯 JSON)。
  5. 將您的政策輸入編輯器中。允許次要帳戶在區域內所有儲存庫推送與提取映像檔的範例政策:
     {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Principal": {
            "AWS": "arn:aws:iam::account-id:root"
          },
          "Action": [
            "ecr:GetDownloadUrlForLayer",
            "ecr:BatchGetImage",
            "ecr:BatchCheckLayerAvailability",
            "ecr:PutImage",
            "ecr:InitiateLayerUpload",
            "ecr:UploadLayerPart",
            "ecr:CompleteLayerUpload"
          ],
          "Resource": "*"
        }
      ]
    }
    **注意:**將 account-id 替換為次要帳戶的帳戶 ID。在 Action (動作) 中,輸入該帳戶可在儲存庫中執行的動作。若要允許特定角色的存取,請在 Principal (主體) 中提供該角色的 Amazon Resource Name (ARN),例如 AWS: arn:aws:iam::account-id:role/ecsInstanceRole。在您儲存登錄政策前,請確認您輸入的角色確實存在於次要帳戶中。若角色不存在,您會收到「invalid registry policy provided」錯誤。
  6. 選擇 Save (儲存)。

設定儲存庫層級權限

請完成下列步驟:

  1. 開啟主要帳戶的 Amazon ECR 主控台
  2. 在導覽窗格中,於 Private registry (私有登錄) 底下,選擇 Repositories (儲存庫)。
  3. 選擇您想修改的儲存庫。
  4. 在導覽窗格中,選擇 Permissions (權限)。
  5. 選擇 Edit policy JSON (編輯政策 JSON)。
  6. 在政策編輯器中輸入您的政策陳述式。
    允許某帳戶進行推送與提取的儲存庫政策範例:
    {  "Version": "2012-10-17",
      "Statement": [
        {
          "Sid": "AllowPushPull",
          "Effect": "Allow",
          "Principal": {
            "AWS": "arn:aws:iam::account-id:root"
          },
          "Action": [
            "ecr:GetDownloadUrlForLayer",
            "ecr:BatchGetImage",
            "ecr:BatchCheckLayerAvailability",
            "ecr:PutImage",
            "ecr:InitiateLayerUpload",
            "ecr:UploadLayerPart",
            "ecr:CompleteLayerUpload"
          ]
        }
      ]
    }
    **注意:**將 account-id 替換為次要帳戶的帳戶 ID。在 Action (動作) 中,輸入該帳戶可在儲存庫中執行的動作。若要允許特定角色的存取,請在 Principal (主體) 中提供該角色的 Amazon Resource Name (ARN),例如 AWS: arn:aws:iam::account-id:role/ecsInstanceRole。在您儲存登錄政策前,請確認您輸入的角色確實存在於次要帳戶中。若角色不存在,您會收到「invalid registry policy provided」錯誤。
  7. 選擇 Save (儲存)。
  8. 如果您在次要帳戶中使用 Amazon ECS 執行容器,請設定要搭配 Amazon ECS 使用的映像檔。該映像檔由主要帳戶的 Amazon ECR 儲存庫所託管。

**注意:**請確保 AmazonEC2ContainerRegistryPowerUser 受管政策已為您的次要帳戶加入必要的 Amazon ECR 權限。您必須具備這些權限才能從主要帳戶進行提取或推送。

產生暫時性的 Docker 驗證權杖

**注意:**取得權杖的帳戶必須擁有修改儲存庫所需的 AWS Identity and Access Management (IAM) API 權限。如需範例,請參閱 Amazon ECR 的 AWS 受管政策。若要對 Docker 相關問題進行疑難排解,請在 Docker 常駐程式上啟用偵錯模式

請完成下列步驟:

  1. 若要為在 Amazon ECS 之外進行映像檔推送與提取的帳戶產生 Docker 驗證權杖,請執行以下 get-login-password AWS CLI 命令:

    aws ecr get-login-password --region regionID | docker login --username AWS --password-stdin AWS_ACCOUNT_ID.dkr.ecr.REGION-ID.amazonaws.com

    -或-
    執行以下 AWS Tools for Windows PowerShell 命令:

    (Get-ECRLoginCommand).Password | docker login --username AWS --password-stdin AWS_ACCOUNT_ID.dkr.ecr.regionID.amazonaws.com

    **注意:**將 AWS-ACCOUNT-ID 替換為主要帳戶 ID,將 REGION-ID 替換為您的區域。此暫時性驗證權杖有效期限為 12 小時。
    輸出範例:

    aws ecr get-login-password --region ap-south-1 | docker login --username AWS --password-stdin 123456789012.dkr.ecr.ap-south-1.amazonaws.com
    WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
    Configure a credential helper to remove this warning. See https://docs.docker.com/engine/reference/commandline/login/#credentials-store
    Login Succeeded
    
    or
    
    Login Succeeded
  2. 若要測試從主要帳戶進行映像檔提取或推送,請執行以下命令:

    docker pull ACCOUNT-ID.dkr.ecr.REGION.amazonaws.com/REPOSITORY-NAME:TAG-NAME

    **注意:**將 ACCOUNT-ID 替換為您的主要帳戶 ID、將 REGION 替換為您的區域、將 REPOSITORY-NAME 替換為您的儲存庫名稱,並將 TAG-NAME 替換為映像檔的標籤名稱。

  3. 若要確認您已成功下載映像檔,請執行以下命令:

    docker images | grep IMAGE-NAME

    **注意:**將 IMAGE-NAME 替換為您的映像檔名稱。