使用 Step Functions 和 Lambda Proxy 函數跨AWS帳戶啟動 CodeBuild 專案 - AWS 方案指引

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

使用 Step Functions 和 Lambda Proxy 函數跨AWS帳戶啟動 CodeBuild 專案

由 Richard Milner-Watts (AWS) 和 Amit Anjarlekar (AWS) 建立

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

環境:生產

技術: DevOps;管理與治理;操作;無伺服器

AWS 服務:AWS CodeBuild;AWSLambda;AWSStep Functions;AWSX-Ray; AWS CloudFormation

Summary

此模式示範如何使用 AWS Step Functions 和 AWS Lambda Proxy 函數,在多個AWS帳戶中非同步啟動AWS CodeBuild 專案。您可以使用模式的範例 Step Functions 狀態機器來測試 CodeBuild 專案的成功。

CodeBuild 可協助您從完全受管的執行期環境使用AWS命令列介面 (AWS CLI) 啟動操作任務。您可以覆寫環境變數,在執行階段變更 CodeBuild 專案的行為。此外,您可以使用 CodeBuild 管理工作流程。如需詳細資訊,請參閱AWS研討會網站上的 Service Catalog Tools,以及AWS資料庫部落格上的使用 Amazon RDS for PostgreSQL AWS CodeBuild 和 Amazon 的排程任務 EventBridge

先決條件和限制

先決條件

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

限制

  • 此模式無法用來在帳戶之間複製成品

架構

下圖顯示此模式建置的架構。

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

該圖顯示以下工作流程:

  1. Step Functions 狀態機器會剖析提供的輸入映射,並叫用您定義的每個帳戶、區域和專案的 Lambda 代理函數 (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 CloudFormation 設計工具提供整合JSON和YAML編輯器,可協助您檢視和編輯 CloudFormation 範本。

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

  • AWS Identity and Access Management (IAM) 可協助您安全地管理 AWS 資源的存取,方法是控制誰經過身分驗證並獲授權使用。

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

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

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

Code

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

最佳實務

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

  2. 在步驟函數中調整地圖的MaxConcurrency屬性,以控制可以平行執行的 CodeBuild 專案數量。

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

史詩

任務描述所需的技能

記錄AWS帳戶 IDs。

AWS 需要 帳戶IDs才能跨帳戶設定存取權。

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

AWS DevOps

下載 AWS CloudFormation 範本。

  1. 從儲存GitHub 庫下載此模式的sample_target_codebuild_template.yamlAWS CloudFormation 範本。

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

注意:在 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的檔案。選擇 Next (下一步)

  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 堆疊達到 CREATE_COMPLETEstatus。這應該需要不到一分鐘的時間。

  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檔案。選擇 Next (下一步)

  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 堆疊達到 CREATE_COMPLETE 狀態。這應該需要不到一分鐘的時間。

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

AWS DevOps
任務描述所需的技能

啟動 狀態機器。

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

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

  3. 輸入編輯器中,輸入下列 JSON,並以包含 CodeBuild 專案之帳戶的帳戶 <TargetAccountID> 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 Proxy – 開始步驟。輸出包含覆寫環境變數、原始承載和 CodeBuild 任務 ID 的詳細資訊。

AWS DevOps

驗證環境變數。

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

  2. 開啟AWS CodeBuild 主控台 ,展開組建 ,然後選擇組建專案

  3. 選擇sample-codebuild-project專案,然後選擇檢視詳細資訊

  4. 建置歷史記錄索引標籤上,選擇專案的最新建置,然後選擇檢視日誌

  5. 在日誌輸出中,驗證列印的環境變數STDOUT是否符合 Step Functions 範例狀態機器的環境變數。

AWS DevOps

故障診斷

問題解決方案

Step Functions 執行時間超過預期。

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

CodeBuild 任務的執行時間比預期長。

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

  2. 考慮 CodeBuild 是否使用適當的工具。例如,初始化 CodeBuild 任務所需的時間可能遠比 AWS Lambda 長。如果要求高輸送量和快速完成時間,請考慮將業務邏輯遷移至 AWS Lambda 並使用扇出架構。