Amazon-Web-Services

為什麼自定義 CodeBuild 映像需要 aws configure 而不是託管映像?

  • January 24, 2019

我有一個 AWS CodePipeline,其中包含使用 CodeBuild 的建構步驟。我以前使用託管映像進行此建構作業,並且能夠毫無問題地使用以下命令:

aws ecr get-login --no-include-email --region us-east-1

現在我已經切換到自定義圖像以縮短建構時間。該命令失敗,經過一些故障排除後,我意識到自定義映像沒有安裝 AWS CLI。現在安裝了 AWS CLI,上面的登錄行退出並出現錯誤程式碼 127。我相信這是因為我遵循了這個 aws setup guide中的所有步驟,除了aws configure.

我可以配置,但這很不方便,因為我需要採取額外的步驟來掩蓋秘密等等。

這個問題與那些額外的步驟無關。我只是在詢問解釋機制。在我看來,託管映像將具有可用的環境變數,因此登錄工作,那麼為什麼這些環境變數也不允許自定義映像登錄?在這兩種情況下,我都有相同的建構作業、管道和服務角色,只是圖像不同。

我還要注意,CodeBuild 和 CodePipeline 目前不是 ServerFault 中使用的標籤,所以如果我應該更喜歡不同的 StackExchange,請告訴我。這篇關於 meta 的文章推薦了 ServerFault 。

沒有區別。aws configure如果所有其他建構因素都已正確配置,則無需使用自定義 CodeBuild 容器。

您描述的問題由 ECR 配置解釋,而不是 CodeBuild 差異。

在託管映像上執行以下命令:

 - echo $AWS_ACCESS_KEY_ID
 - echo $AWS_SECRET_ACCESS_KEY
 - echo $AWS_SESSION_TOKEN

 - cd /
 - ls
 - cd ~
 - ls
 - cd ~/.aws
 - ls

請注意,CodeBuild 已鎖定。它不會回顯所需的環境變數,也不會允許您查看物理文件。這可能表明機制不同:您正在嘗試使用環境變數,但託管映像配置了物理文件,因此託管映像不需要執行aws configure.

這似乎表明您也應該使用預配置的 aws 來配置自定義容器,但這意味著您將使用純文字 KEY_ID 和 ACCESS_KEY 送出到 ECR 或其他任何地方,除非非常複雜的解決方法。此外,您不能預先配置 AWS_SESSION_TOKEN,因為它會在一段時間後超時。同樣,您可以將某些系統配置為為固定會話提供無限超時,但這是一種反模式,因為會話令牌超時是一項安全功能。

與其做所有這些,不如檢查 ECR 權限和您的 docker 安裝:

1 - 轉到 ECR 權限並添加新的權限聲明。以前,您可能遵循了授予 ECR 權限的官方教程codebuild.amazonaws.com。除此之外,由於您的建構在管道中,codepipeline.amazonaws.com因此應將添加和涉及的任何其他 IAM 實體添加到權限的 IAM 實體部分。

2 - 對於 docker,只需檢查它是否已安裝。您提到自定義映像缺少 aws cli 並且您添加了該映像,但您的自定義映像也可能缺少 docker,我還沒有看到您確認已安裝。作為錯誤的範例,如果 Ubuntu 上未安裝 docker,您提到的行會拋出如下所示的內容:

/codebuild/output/tmp/script.sh: 4: /codebuild/output/tmp/script.sh: docker: not found

如果安裝了 docker,還要確保它正在執行。

如果您在一個組織工作,最後一個問題可能是存在一個不明顯的 AWS 安全策略來阻止您。例如,啟用萬用字元權限被認為是不安全的,因此我工作的一家公司自動回滾了啟用萬用字元訪問任何 AWS 服務的 IAM 使用者和策略。具有諷刺意味的是,在這種情況下,在啟用所有權限的情況下,為 IAM 使用者指定特定的 ECR 權限仍然有效。

引用自:https://serverfault.com/questions/950579