使用 Step Functions 函數和 Lambda 代理函數在 AWS 帳戶之間啟動 CodeBuild 專案 - AWS 方案指引

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

使用 Step Functions 函數和 Lambda 代理函數在 AWS 帳戶之間啟動 CodeBuild 專案

由理查德·米爾納瓦特(AWS)和阿米特·安哈勒卡(AWS)創建

程式碼儲存庫:跨帳戶 CodeBuild 代理

環境:生產

技術: DevOps;管理與治理;營運;無伺服器

AWS 服務:AWS CodeBuild;AWS Lambda;AWS Step Functions;AWS X-Ray;AWS CloudFormation

Summary

此模式示範如何使用 AWS 步驟函數和 AWS Lambda 代理函數,跨多個 AWS 帳戶非同步啟動 AWS CodeBuild 專案。您可以使用模式的示例 Step Functions 狀態機來測試 CodeBuild 項目的成功性。

CodeBuild 協助您從完全受管的執行階段環境使用 AWS Command Line Interface (AWS CLI) (AWS CLI) 啟動操作任務。您可以透過覆寫環境變數,在執行階段變更 CodeBuild 專案的行為。此外,您還可以使用 CodeBuild 來管理工作流程。如需詳細資訊,請參閱 AWS 工作坊網站上的 Ser vice Catalog 工具,以及在 AWS 資料庫部落格 EventBridge上使用 AWS CodeBuild 和 Amazon 在 Amazon RDS for PostgreSQL 中安排任務。

先決條件和限制

先決條件

  • 兩個作用中的 AWS 帳戶:使用 Step Functions 函數叫用 Lambda 代理函數的來源帳戶,以及用於建立遠端 CodeBuild 範例專案的目標帳戶

限制

架構

下圖顯示了此模式構建的體系結構。

跨多個 AWS 帳戶啟動 CodeBuild 專案的架構圖

該圖顯示以下工作流程:

  1. Step Functions 數狀態機器會剖析提供的輸入對應,並針對您定義的每個帳戶、區域和專案叫用 Lambda Proxy 函數 (codebuild-proxy-lambda)。

  2. Lambda 代理函數使用 AWS Security Token Service (AWS STS) 假設 IAM 代理角色 (codebuild-proxy-role),該角色與目標帳戶中的 IAM 政策 (codebuild-proxy-policy) 相關聯。

  3. Lambda 函數會使用假定的角色啟動 CodeBuild 專案並傳回 CodeBuild 工作 ID。Step Functions 狀態機器會迴圈並輪詢 CodeBuild 工作,直到收到成功或失敗狀態為止。

狀態機邏輯如下圖所示。

Step Functions 狀態機的工作流程

技術堆疊

  • AWS CloudFormation

  • CodeBuild

  • IAM

  • Lambda

  • Step Functions

  • X-Ray

工具

  • AWS 可 CloudFormation協助您設定 AWS 資源、快速且一致地佈建 AWS 資源,並在 AWS 帳戶和區域的整個生命週期中進行管理。

  • AWS CloudFormation 設計師提供整合的 JSON 和 YAML 編輯器,可協助您檢視和編輯 CloudFormation 範本。

  • AWS CodeBuild 是全受管的建置服務,可協助您編譯原始程式碼、執行單元測試,以及產生準備好部署的成品。

  • AWS Identity and Access Management (IAM) 可透過控制誰經過身份驗證和授權使用 AWS 資源,協助您安全地管理對 AWS 資源的存取。

  • AWS Lambda 是一種運算服務,可協助您執行程式碼,而不需要佈建或管理伺服器。它只會在需要時執行程式碼並自動調整規模,因此您只需為使用的運算時間付費。

  • AWS Step Functions 是一種無伺服器協調服務,可協助您結合 AWS Lambda 函數和其他 AWS 服務來建立關鍵業務應用程式。

  • AWS X-Ray 可協助您收集應用程式所提供請求的相關資料,並提供工具供您檢視、篩選和深入瞭解該資料,以識別問題和優化機會。

Code

此模式的範例程式碼可在 GitHub跨帳戶 CodeBuild Proxy 儲存庫中取得。此模式使用適用於 Python 程式庫的 AWS Lambda Powertools 來提供記錄和追蹤功能。如需此程式庫及其公用程式的詳細資訊,請參閱適用於 AWS Lambda (Python) 的動力工具

最佳實務

  1. 調整「步驟功能」狀態機器中的等待時間值,以盡量減少工作狀態的輪詢請求。使用 CodeBuild 專案的預期執行時間。

  2. 在「Step Functions」中調整地圖的MaxConcurrency屬性,以控制可以 parallel 執行的 CodeBuild 專案數目。

  3. 如有需要,請檢閱生產準備就緒的範例程式碼。考慮解決方案可能會記錄哪些資料,以及預設 Amazon CloudWatch 加密是否足夠。

史诗

任務描述所需技能

記錄 AWS 帳戶 ID。

需要 AWS 帳戶 ID 才能設定跨帳戶的存取權限。

記錄來源和目標帳戶的 AWS 帳戶 ID。如需詳細資訊,請參閱 IAM 文件中的尋找 AWS 帳戶 ID

AWS DevOps

下載 AWS CloudFormation 範本。

  1. GitHub 存放庫下載此 CloudFormation 模式的 sample_target_codebuild_template.yaml AWS 範本。

  2. GitHub 存放庫下載此 CloudFormation 模式的 codebuild_lambda_proxy_template.yaml AWS 範本。

注意:在 AWS CloudFormation 範本中,<SourceAccountId>是來源帳戶的 AWS 帳戶 ID,<TargetAccountId>也是目標帳戶的 AWS 帳戶 ID。

AWS DevOps

建立和部署 AWS CloudFormation 堆疊。

  1. 登入來源帳戶的 AWS 管理主控台,開啟 AWS CloudFormation 主控台,然後選擇「堆疊」。

  2. 選擇 Create stack (建立堆疊),然後選擇 With new resources (standard) (使用新資源 (標準))

  3. 針對 Template source (範本來源),選擇 Upload a template file (上傳範本檔案)。

  4. 在 [上傳範本檔案] 中,選擇 [檔案],然後選擇您下載的codebuild_lambda_proxy_template.yaml檔案。選擇下一步

  5. 對於堆疊名稱,輸入堆疊的名稱 (例如,codebuild-lambda-proxy)。

  6. crossAccountTargetRoleArn參數取代為您的 <TargetAccountId> (例如,<arn:aws:iam::123456789012:role/proxy-lambda-codebuild-role>)。附註:您不需要更新targetCodeBuildProject參數的預設值。

  7. 選擇 [下一步],接受預設堆疊建立選項,然後選擇 [下一步]。

  8. 選擇 [我確認 AWS CloudFormation 可能會使用自訂名稱建立 IAM 資源] 核取方塊,然後選擇 [建立堆疊]。

注意:您必須先為代理 Lambda 函數建立 AWS CloudFormation 堆疊,才能在目標帳戶中建立任何資源。當您在目標帳戶中建立信任政策時,IAM 角色會從角色名稱轉換為內部識別碼。這就是 IAM 角色必須已經存在的原因。

AWS DevOps

確認代理功能和狀態機的創建。

  1. 等待 AWS CloudFormation 堆疊達到建立 _ 完成狀態。這應該需要不到一分鐘的時間。

  2. 開啟 AWS Lambda 主控台,選擇「數」,然後尋找lambda-proxy-ProxyLambda-<GUID>函數。

  3. 開啟 AWS Step Functions 主控台,選擇狀態機器,然後尋找狀sample-crossaccount-codebuild-state-machine態機器。

AWS DevOps
任務描述所需技能

建立和部署 AWS CloudFormation 堆疊。

  1. 登入目標帳戶的 AWS 管理主控台,開啟 AWS CloudFormation 主控台,然後選擇「堆疊」。

  2. 選擇 [建立堆疊],然後選擇 [使用新資源 (標準)]。

  3. 針對 Template source (範本來源),選擇 Upload a template file (上傳範本檔案)。

  4. 在 [上傳範本檔案] 中,選擇 [選擇檔案],然後選擇sample_target_codebuild_template.yaml檔案。選擇下一步

  5. 堆疊名稱中,輸入堆疊的名稱 (例如:sample-codebuild-stack)。

  6. crossAccountSourceRoleArn參數取代為您的 <SourceAccountId> (例如,<arn:aws:iam::123456789012:role/codebuild-proxy-lambda-role>)。

  7. 選擇 [下一步],接受預設堆疊建立選項,然後選擇 [下一步]。

  8. 選擇 [我確認 AWS CloudFormation 可能會使用自訂名稱建立 IAM 資源] 核取方塊,然後選擇 [建立堆疊]。

AWS DevOps

確認範例 CodeBuild 專案的建立。

  1. 等待 AWS CloudFormation 堆疊達到建立 _ 完成狀態。這應該需要不到一分鐘的時間。

  2. 開啟 AWS CodeBuild 主控台,然後尋找sample-codebuild-project專案。

AWS DevOps
任務描述所需技能

啟動狀態機。

  1. 登入來源帳戶的 AWS 管理主控台,開啟 AWS Step Functions 主控台,然後選擇狀態機器

  2. 選擇狀sample-crossaccount-codebuild-state-machine態機,然後選擇開始執行

  3. 入編輯器中,輸入下列 JSON,並以<TargetAccountID>包含 CodeBuild 專案的帳戶的 AWS 帳戶 ID 取代。

    { "crossAccountTargetRoleArns": [ { "arn": "arn:aws:iam::<TargetAccountID>:role/proxy-lambda-codebuild-role", "region": "eu-west-1", "codeBuildProject": "sample-codebuild-project", "SampleValue1": "Value1", "SampleValue2": "Value2" } ] }

    附註:索引鍵值配對會作為環境變數從來源帳戶中的函數傳遞至目標帳戶中的 CodeBuild 專案。

  4. 選擇 Start execution (開始執行)

  5. 在狀態機器頁面的 [詳細資料] 索引標籤上,檢查 [執行狀態] 是否設定為 [成功]。這會確認您的狀態機器正在執行。備註:狀態機器可能需要 30 秒左右的時間才能達到「成功」狀態。

  6. 若要查看狀態機器中某個步驟的輸出和輸入,請在 [執行事件歷程記錄] 區段中展開該步驟。例如,展開 Lambda- CodeBuild 代理-開始步驟。輸出包含有關已覆寫環境變數、原始裝載和 CodeBuild 工作 ID 的詳細資訊。

AWS DevOps

驗證環境變數。

  1. 登入目標帳戶的 AWS 管理主控台。

  2. 開啟 AWS 主 CodeBuild 控台,展開 [建置],然後選擇 [建立專案]。

  3. 選擇sample-codebuild-project專案,然後選擇 [檢視詳細資料]。

  4. 在 [建置歷程記錄] 索引標籤上,選擇專案的最新組建,然後選擇 [檢視記錄]。

  5. 在 log 輸出中,確認列印到 STDOUT 的環境變數是否與 Step Functions 樣本狀態機器中的環境變數相符。

AWS DevOps

故障診斷

問題解決方案

Step Functions 執行所花費的時間比預期更長。

在 Step Function 狀態機器中調整地圖的MaxConcurrency屬性,以控制可以 parallel 執行的 CodeBuild 專案數目。

CodeBuild 工作的執行所花費的時間比預期更長。

  1. 調整「Step Functions」狀態機器中的等待時間值,以盡量減少工作狀態的輪詢請求。使用 CodeBuild 專案的預期執行時間。

  2. 考慮 CodeBuild 是否適合使用的工具。例如,初始化任務所需的 CodeBuild 時間可能會比 AWS Lambda 長得多。如果需要高輸送量和快速完成時間,請考慮將商業邏輯遷移到 AWS Lambda 並使用散發架構。