我想要在透過 AWS Secrets Manager 或環境變數提供的 Amazon Elastic Container Service (Amazon ECS) 容器代理程式上更新我的私有儲存庫憑證。
簡短說明
您可以使用任務定義中的 Secrets Manager 或環境變數,將私有儲存庫憑證提供給 Amazon ECS 容器代理程式。
選擇下列其中一個選項:
- 如果您使用 Secrets Manager 來提供私有儲存庫憑證,請依照使用 Secrets Manager 更新私的儲存庫憑證一節中的步驟進行操作。
- 如果您使用執行個體使用者資料和環境變數來提供私有儲存庫憑證,請依照使用環境變數更新私有儲存庫憑證一節中的步驟進行操作。
**注意:**在容器執行個體上以純文字形式儲存憑證並不是安全性最佳做法。最佳做法是改用 Secrets Manager,除非在容器執行個體中儲存登錄檔憑證有直接的架構相依性。
解決方法
使用 Secrets Manager 更新私有儲存庫憑證
1. 開啟 Secrets Manager 主控台。
2. 選擇您的機密,然後選擇擷取機密值。
3. 選擇編輯。
4. 更新私有登錄檔的儲存憑證,然後選擇儲存。
若要繼續,請依照測試更新的私有儲存庫憑證一節中的步驟執行。
使用環境變數更新私有儲存庫憑證
1. 連線至容器執行個體。
2. 若要瞭解如何向 ECS 容器代理程式提供 Docker 憑證,請執行下列命令:
$ cat /etc/ecs/ecs.config
此命令會傳回 /etc/ecs/ecs.config 檔案的內容。
如果 ECS_ENGINE_AUTH_TYPE 變數設定為 docker,則您將直接以純文字將Docker 憑證傳遞給 ECS 容器代理程式。您應該避免使用這種方法。請改用 Secrets Manager 或取得新的 Docker 驗證值一節中的 dockercfg 格式方法。
如果 ECS_ENGINE_AUTH_TYPE 變數設為 dockercfg,則您將透過 docker login 命令產生的 Docker 產生之驗證值傳遞您的 Docker 憑證。若要繼續此方法,請完成取得新的 Docker 驗證值一節中的步驟。
取得新的 Docker 驗證值
1. 若要在本機登入 Docker,請執行下列命令,然後輸入新的憑證:
$ docker login
2. 若要連接 config.json 檔案,請執行下列命令,然後複製 Docker 產生的驗證金鑰值:
$ cat ~/.docker/config.json
3. 若要更新 ECS_ENGINE_AUTH_DATA 變數,請執行下列命令:
$ sudo vi /etc/ecs/ecs.config
4. 在 vi 編輯器中,將 ECS_ENGINE_AUTH_DATA 變數的值更新為步驟 2 中的 Docker 驗證金鑰值。例如:
ECS_CLUSTER=TestECSCluster
ECS_ENGINE_AUTH_TYPE=dockercfg
ECS_ENGINE_AUTH_DATA={"https://index.docker.io/v1/":{"auth","a2vpdGhhd3M6UGFzc3dvcmQ="}}
若要繼續,請依照重新啟動 ECS 容器代理程式一節中的步驟執行。
重新啟動 ECS 容器代理程式
1. 若要重新啟動 ECS 容器代理程式,請根據執行容器執行個體的 Amazon Machine Image (AMI) 執行下列任一命令。
Amazon Linux ECS 最佳化的 AMI:
$ sudo stop ecs && sudo start ecs
Amazon Linux 2 ECS 最佳化的 AMI:
$ sudo systemctl restart ecs
注意:若要更新 ECS 叢集中其他容器執行個體上的 /etc/ecs/ecs.config 檔案,請返回使用環境變數更新私有儲存庫憑證一節。然後,對每個容器執行個體執行更新程序。
若要繼續,請依照測試更新的私有儲存庫憑證一節中的步驟執行。
測試更新的私有儲存庫憑證
下列步驟假設您正在跨叢集部署更新的映像。
1. 開啟 Amazon ECS 主控台。
2. 在導覽窗格中,選擇叢集,然後選取您的叢集。
3. 選取您的服務,然後選擇更新。
4. 選取強制新部署核取方塊。
5. 對於最小運行狀況百分比,輸入 50。
6. 完成設定精靈中的其餘步驟,然後選擇更新服務。
7. 選擇檢視服務。
8. 在部署索引標籤上,檢視新部署。Amazon ECS 會逐漸停止先前部署下的任務,然後在嘗試提取全新映像時重新啟動新部署下的任務。
**注意:**步驟 8 假設您的叢集有足夠的資源可成功執行滾動更新部署類型。
9. 選擇任務索引標籤,然後檢查每個任務及其狀態。
如果任務狀態設定為執行中,則服務會成功更新此任務,而不會發生錯誤。
如果任務狀態設定為執行中 (CannotPullContainerError),則服務會更新此任務,但發生錯誤。ECS 容器代理程式無法提取新的容器映像,正在使用舊的快取映像。確認您的憑證已更新,然後執行其他服務部署更新。
**注意:**若要顯示任務的完整詳細資料並查看「拒絕提取存取」錯誤訊息,請為您的個別任務狀態選擇下拉式箭頭。例如:
CannotPullContainerError: Error response from daemon: pull access denied for user/reponame, repository does not exist or may require 'docker login'
相關資訊
Amazon ECS 容器代理程式組態
驗證格式