使用 AWS 程式碼管線、AWS 程式碼提交和 AWS CodeBuild 在多個 AWS 區域中部署程式碼 - AWS Prescriptive Guidance

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

使用 AWS 程式碼管線、AWS 程式碼提交和 AWS CodeBuild 在多個 AWS 區域中部署程式碼

由拉瑪·阿南德·克里希納瓦拉那西創作 (AWS)

建立者:AWS

環境:PoC 或試驗

技能:管理與治理;DevOps

AWS 服務:AWS CodeCommit; AWS CodePipeline; AWS CodeBuild

Summary

此模式示範如何使用 AWS AWS CloudFormation 跨多個 Amazon Web Services (AWS) 區域建置基礎設施或架構。它包括跨多個 AWS 區域的持續整合 (CI)/持續部署 (CD),以加快部署速度。 此模式中的步驟已經過測試,以建立 AWS CodePipeline 作業以部署到三個 AWS 區域做為範例。您可以根據使用案例來變更區域數目。

先決條件和限制

先決條件

  • 作用中的 AWS 帳戶

  • 適用於 AWS CodeBuild 和 AWS CloudFormation 的兩個 AWS 身分和存取管理 (IAM) 角色,其中包含適當的 CodeBuild 政策,可執行測試、捆綁、封裝工件以及並行部署到多個 AWS 區域的 CI 任務。請注意:交叉檢查由 CodePipeline 創建的政策,以驗證 CodeBuild 和 AWS CloudFormation 在 CI 和 CD 階段具有適當的權限。

    • 一個 CodeBuild 角色與AmazonS3FullAccessCloudWatchFullAccess政策。這些政策可讓 CodeBuild 存取,讓您能夠透過 Amazon CloudWatch 觀看 AWS CodeCommit 事件,並且能夠將 Amazon Simple Storage Service (Amazon S3) 當成成品存放區。

    • 具有下列政策的 AWS CloudFormation 角色,可讓 AWS CloudFormation 在最終組建階段,能夠建立或更新 AWS Lambda 函數、推送或觀看 Amazon CloudWatch 日誌,以及建立和更新變更集。 

      • AWSLambdaFullAccess

      • AWS 部署完整存取

      • CloudWatchFullAccess

      • AWS 雲端格式完整存取

      • AWSCodePipelineFullAccess

Architecture

這種模式的多區域架構和工作流程包括以下步驟。

  1. 您將代碼發送到 CodeCommit 存儲庫。

  2. 在收到任何程式碼更新或認可時,CodeCommit 會叫用 CloudWatch 事件,這又會啟動 CodePipeline 工作。

  3. CodePipeline 從事由 CodeBuild 處理的 CI。將執行下列工作。

    • AWS CloudFormation 範本的測試 (可選)

    • 針對部署中包含的每個區域封裝 AWS CloudFormation 範本。例如,此模式平行部署到三個 AWS 區域,因此 CodeBuild 會將 AWS CloudFormation 範本封裝成三個 S3 儲存貯體,每個指定區域都有一個。S3 存儲桶僅由 CodeBuild 用作工件存儲庫。

  4. CodeBuild 將工件打包為下一個部署階段的輸入,該階段在三個 AWS 區域中並行運行。如果您指定不同數量的區域,CodePipeline 將部署到這些區域。

Tools

工具

  • AWS CodePipeline— CodePipeline 是一種持續交付的服務,讓您能夠將持續發行軟體變更所需的步驟模型化、視覺化和自動化。

  • AWS CodeBuild— CodeBuild 是全受管組建服務,可編譯原始碼、執行單位測試,並產生可立即部署的成品。

  • AWS CodeCommit— CodeCommit 是 Amazon Web Services 託管的版本控制服務,可讓您用來以私有方式在雲端存放和管理資產 (例如來源碼和二進位檔案)。

  • AWS CloudFormation— AWS CloudFormation 是一項服務,能幫助您模型化與設定 Amazon Web Services 資源,讓您花較少的時間管理這些資源,並且有更多時間專注在 AWS 中執行的應用程式上。

  • AWS Identity and Access Management— AWS Identity and Access Management (IAM) 是一種 Web 服務,可協助您安全地控制 AWS 資源的存取。

  • Amazon S3— Amazon Simple Storage Service (Amazon S3) 是網際網路儲存服務。此服務旨在降低開發人員進行網路規模運算的難度。

Code

下列範例程式碼適用於BuildSpec.yaml文件(構建階段)。

--- artifacts: discard-paths: true files: - packaged-first-region.yaml - packaged-second-region.yaml - packaged-third-region.yaml phases: build: commands: - echo "********BUILD PHASE - CF PACKAGING**********" - "aws cloudformation package --template-file sam-template.yaml --s3-bucket $S3_FIRST_REGION --output-template-file packaged-first-region.yaml --region $FIRST_REGION" - "aws cloudformation package --template-file sam-template.yaml --s3-bucket $S3_SECOND_REGION --output-template-file packaged-second-region.yaml --region $SECOND_REGION" - "aws cloudformation package --template-file sam-template-anand.yaml --s3-bucket $S3_THIRD_REGION --output-template-file packaged-third-region.yaml --region $THIRD_REGION" install: commands: - echo "********BUILD PHASE - PYTHON SETUP**********" runtime-versions: python: 3.8 post_build: commands: - echo "********BUILD PHASE - PACKAGING COMPLETION**********" pre_build: commands: - echo "********BUILD PHASE - DEPENDENCY SETUP**********" - "npm install --silent --no-progress" - echo "********BUILD PHASE - DEPENDENCY SETUP DONE**********" version: 0.2

Epics

任務描述所需技能
選取部署的主要 AWS 區域。

登入您的 AWS 帳戶,並選擇部署的主要區域。CodeCommit 存儲庫將位於主要區域。

DevOps
建立 CodeCommit 儲存庫。

創建 CodeCommit 存儲庫,並將所需的代碼推入其中。程式碼通常包含 AWS CloudFormation 格式或 AWS SAM 範本、Lambda 程式碼 (如果有的話),以及 CodeBuildbuildspec.yaml文件作為輸入到 AWS CodePipeline。

DevOps
將程式碼推送至 CodeCommit 儲存庫。

在 中附件區段中,下載此範例的程式碼,然後將所需的程式碼推入其中。一般而言,程式碼可以包含 AWS CloudFormation 或 AWS SAM 範本、Lambda 程式碼和 CodeBuildbuildspec.yaml文件作為輸入到管道。

DevOps
任務描述所需技能
建立 CodePipeline 工作。

在 CodePipeline 主控台上,選擇建立管道

DevOps
命名 CodePipeline 工作,然後選擇服務角色設定。

輸入工作的名稱,並保留預設服務角色設定,以便 CodePipeline 建立具有附加必要原則的角色。

DevOps
指定成品存放區的位置。

UDER進階設定,請保留默認選項,以便 CodePipeline 創建一個 S3 存儲桶來用於代碼成品存儲。如果您改用現有的 S3 儲存貯體,則儲存貯體必須位於您在第一個史詩中指定的主要區域。

DevOps
指定加密金鑰。

請保留預設選項,預設 AWS 受管金鑰,或選擇使用您自己的 AWS Key Management Service (AWS KMS) 客戶受管金鑰。

DevOps
指定來源供應商。

UDER來源供應商中,選擇AWS CodeCommit

DevOps
指定儲存庫。

選擇您在第一個史詩中創建的 CodeCommit 存儲庫。如果您將程式碼放在分支中,請選擇分支。

DevOps
指定如何偵測程式碼變更。

請保留預設值,Amazon CloudWatch Events,作為變更觸發程式 CodeCommit 以啟動 CodePipeline 工作。

DevOps
任務描述所需技能
指定建置提供者。

針對建置供應商,請選擇AWS CodeBuild

DevOps
指定 AWS 區域。

選擇您在第一首史詩中指定的主要區域。

DevOps
任務描述所需技能
建立專案

選擇建立專案,並輸入專案名稱。

DevOps
指定環境影像。

對於此模式示範,請使用預設的 CodeBuild 管理映像。您也可以選擇使用自訂 Docker 映像 (如果您有)。

DevOps
指定作業系統。

選擇亞馬遜 Linux 2 或 Ubuntu。

DevOps
指定服務角色。

在開始建立 CodePipeline 工作之前,選擇您為程式碼建立所建立的角色。(請參閱《》先決條件區段)。

DevOps
設定額外選項。

適用於Timeout (逾時)佇列中的逾時,請保留預設值。對於憑證,除非您有要使用的自訂憑證,否則請保留預設值。

DevOps
建立環境變數。

對於您要部署的每個 AWS 區域,透過提供 S3 儲存貯體名稱和區域名稱 (例如 us-east-1) 來建立環境變數。

DevOps
提供構建規格文件名,如果它不是構建規格 .yml。

如果檔案名稱為預設值,請將此欄位保持空白。buildspec.yaml。如果您重新命名 buildspec 檔案,請在此輸入名稱。請確定它符合 CodeCommit 存放庫中的檔案名稱。

DevOps
指定記錄日誌。

若要查看 Amazon CloudWatch Events 日誌,請保留預設設定。或者你可以定義任何特定的組或記錄器名稱。

DevOps
任務描述所需技能
略過部署階段並完成管線的建立。

當您設定管線時,CodePipeline 可讓您在「部署」階段中只建立一個階段。若要部署到多個 AWS 區域,請略過此階段。管道建立之後,您可以新增多個部署階段。

DevOps
任務描述所需技能
新增階段至 [部署] 階段。

編輯管道,並選擇新增階段在 [部署] 階段中。這個第一階段適用於主要區域。

DevOps
提供階段的動作名稱。

輸入反映第一個 (主要) 階段和區域的唯一名稱。例如,輸入主要 _ <region> 部署 (_A)

DevOps
指定動作提供者。

適用於動作供應商,請選擇 AWS CloudFormation。

DevOps
設定第一階段的「區域」。

選擇第一個(主要)區域,代碼管線和代 CodeBuild 設置相同的區域。這是您要部署堆疊的主要區域。

DevOps
指定輸入成品。

選擇BuildArtifact。這是構建階段的輸出。

DevOps
指定要採取的動作

適用於Action mode (動作模式)中,選擇建立或更新堆疊

DevOps
輸入 CloudFormation 堆疊的名稱。DevOps
指定第一個區域的樣板。

選擇由 CodeBuild 打包並轉儲到第一個(主)區域的 S3 存儲桶中的區域特定軟件包名稱。

DevOps
指定功能。

如果堆疊範本包含 IAM 資源,或您直接從包含巨集的範本建立堆疊,則此功能為必要。對於此模式,請使用「功能 _ IAM」、「功能 _ 名稱為 IAM」、「功能 _ 自動展開」。

DevOps
任務描述所需技能
將第二個階段新增至 [部署] 階段。

若要為第二個區域新增階段,請編輯管線並選擇新增階段在 [部署] 階段中。重要:創建第二個區域的過程與第一個區域的過程相同,除了以下值。

DevOps
提供第二個階段的動作名稱。

輸入反映第二階段和第二個區域的唯一名稱。

DevOps
設定第二階段的「區域」。

選擇您要部署堆疊的第二個區域。

DevOps
指定第二個區域的樣板。

選擇由 CodeBuild 打包並轉儲到第二個區域的 S3 存儲桶中的特定區域的軟件包名稱。

DevOps
任務描述所需技能
將第三個階段新增至 [部署] 階段。

若要為第三個區域新增階段,請編輯管線並選擇新增階段在 [部署] 階段中。重要:建立第二個「區域」的過程與前兩個「區域」的過程相同,但下列值除外。

DevOps
提供第三個階段的動作名稱。

輸入反映第三階段和第三區域的唯一名稱。

DevOps
設定第三階段的「區域」。

選擇您要部署堆疊的第三個區域。

DevOps
指定第三個區域的樣板。

選擇由 CodeBuild 打包並轉儲到第三個區域的 S3 存儲桶中的特定區域的軟件包名稱。

DevOps
任務描述所需技能
刪除 AWS 資源。

若要清理部署,請刪除每個區域中的 CloudFormation 堆疊。然後從主要區域刪除程式 CodeCommit 可、CodeBuild 和 CodePipeline 資源。

DevOps

相關資源

Attachments

attachment.zip