我想要允許次要帳戶在我的 Amazon Elastic Container Registry (Amazon ECR) 映像檔儲存庫中推送或提取映像檔。
解決方案
您可以將映像檔推送至另一個帳戶的 Amazon ECR 儲存庫,或從其中提取映像檔。首先,您必須建立允許次要帳戶對儲存庫執行 API 呼叫的政策。然後,使用從次要帳戶產生的 Docker 身分驗證權杖,以對主要帳戶的儲存庫使用推送和提取命令。
建立允許次要帳戶對映像檔儲存庫執行 API 呼叫的政策
1. 開啟主要帳戶的 Amazon ECR 主控台。
2. 選擇您想要修改儲存庫的超連結「儲存庫名稱」。
3. 在左側導覽窗格的「Amazon ECR - 儲存庫」下,選擇「許可」。
4. 若要從主要帳戶內新增次要帳戶的儲存庫政策,請選擇「編輯政策 JSON」。將您的政策輸入程式碼編輯器中,然後選擇「儲存」。
重要事項: 在政策中,包括次要帳戶的帳號以及該帳戶可以對儲存庫執行的動作。若要將存取權給予特定角色,請提供角色 arn 作為主體。例如,AWS: arn:aws:iam::account-id:role/ecsInstanceRole。在儲存儲存庫政策之前,該角色必須存在於次要帳戶中。如果不存在,則您會收到與下列內容類似的錯誤:「提供的儲存庫政策無效」。
下列儲存庫政策範例允許特定帳戶推送和提取映像檔:
{
"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"
]
}
]
}
5. 在任務定義中,設定映像檔,該映像檔為您想要與 Amazon ECS 一起搭配使用。在主要帳戶的 Amazon ECR 儲存庫中託管您的映像檔。
**注意事項:**確保次要帳戶在「AmazonEC2ContainerRegistryPowerUser」受管政策中列出 Amazon ECR 許可。需要這些許可,才能從主要帳戶進行提取或推送。
從次要帳戶產生暫時 Docker 身分驗證權杖,並執行測試推送或提取
**注意事項:**如果在執行 AWS Command Line Interface (AWS CLI) 命令時收到錯誤訊息,請確定您是使用最新版本的 AWS CLI。
次要帳戶在收到 12 小時有效的暫時身分驗證權杖之前,無法對儲存庫執行政策動作。該權杖允許次要帳戶對主要帳戶的儲存庫使用 Docker 推送和提取命令。get-login-password 命令會擷取並解碼身分驗證權杖,然後您可以輸入「docker 登入」命令進行身分驗證。
**注意事項:**取得權杖的帳戶必須具有相關的 AWS Identify and Access Management (IAM) API 許可,才能修改儲存庫。如需範例,請參閱 Amazon Elastic Container Registry 的 AWS 受管政策。如需疑難排解 Docker 問題,請在 Docker 常駐程式中啟用偵錯模式。使用最新的 AWS CLI 第 2 版,或者 AWS CLI 第 1 版的 1.17.10 版或更新版本支援此命令。如需相關資訊,請參閱 get-login-password。
1. 若要為在 Amazon ECS 之外推送和提取映像檔的帳戶產生 Docker 身分驗證權杖,請執行下列命令。將 aws_account_id 取代為您的主要帳戶 ID,並將 regionID 取代為您的區域 ID。
使用 AWS CLI:
aws ecr get-login-password --region regionID | docker login --username AWS --password-stdin aws_account_id.dkr.ecr.regionID.amazonaws.com
使用適用於 Windows PowerShell 的 AWS 工具:
(Get-ECRLoginCommand).Password | docker login --username AWS --password-stdin aws_account_id.dkr.ecr.regionID.amazonaws.com
您會收到下列輸出:
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
2. 執行主要帳戶的測試映像檔提取,或將測試映像檔推送至主要帳戶:
docker pull AccountID.dkr.ecr.Region.amazonaws.com/ImageName::TagName
注意事項: 將 AccountID 和 Region 取代為您的帳戶 ID 和區域。將 ImageName 和 TagName 取代為您的映像檔名稱和標籤名稱。
3. 驗證映像檔是否順利下載:
docker images | grep ImageName
注意事項: 將 ImageName 取代為您的映像檔名稱。