使用 CodePipeline 部署 Terraform 和 CloudFormation 範本 - AWS 方案指引

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

使用 CodePipeline 部署 Terraform 和 CloudFormation 範本

Notice (注意)

AWS CodeCommit 不再提供給新客戶。的現有客戶 AWS CodeCommit 可以繼續正常使用服務。進一步了解

在 DPA 中,您可以使用 的建置區塊 AWS CodePipeline 來建立 Terraform 和 CloudFormation IaC 的加速器。本節說明此使用案例的下列項目:

  • 標準化管道結構

  • 可重複使用的階段和任務

  • 用於安全掃描的整合工具

DPA 儲存庫包含 TerraformCloudFormation 的資料夾。這些資料夾都包含下列兩個子資料夾:

  • 管道模組 – 此資料夾包含用於部署標準化管道結構的程式碼。

  • 共用 – 此資料夾包含 DPA 階段和任務的ready-to-use buildspec 檔案。

先決條件

  • 作用中 AWS 帳戶

  • 使用 IaC 範本佈建資源的許可

  • 建立 AWS CodeCommit 儲存庫和 CodePipeline 元件的許可

工具

  • cfn-lint 是 linter,可根據AWS CloudFormation 資源規格檢查 CloudFormation YAML 或 JSON 範本。它也會執行其他檢查,例如檢查資源屬性的有效值,以及遵守最佳實務。

  • cfn_nag 是一種開放原始碼工具,可透過搜尋模式來識別 CloudFormation 範本中的潛在安全問題。

  • Checkov 是一種靜態程式碼分析工具,可檢查 IaC 是否設定錯誤的安全性和合規性。

  • TFLint 是 linter,可檢查 Terraform 程式碼是否有潛在錯誤並遵循最佳實務。

  • tfsec 是一種靜態程式碼分析工具,可檢查 Terraform 程式碼是否有潛在的錯誤設定。

指示

建立 CodeCommit 儲存庫

  1. 建立兩個單獨的 CodeCommit 儲存庫,如下所示:

    • common-repo – 此儲存庫包含共用程式庫、buildspec 檔案和相依性。

    • app-repo – 此儲存庫包含部署基礎設施的 Terraform 或 CloudFormation 範本。

    如需說明,請參閱建立 AWS CodeCommit 儲存庫

  2. common-repo儲存庫中,建立名為 的資料夾shared。將 GitHub DPA 儲存庫中 TerraformCloudFormation 共用資料夾的 buildspec 檔案複製到新資料夾。如需說明,請參閱建立檔案或將檔案新增至 AWS CodeCommit 儲存庫

  3. 在儲存app-repo庫中,建立名為 的資料夾entrypoint。將檔案從 GitHub DPA 儲存庫中的 TerraformCloudFormation 進入點資料夾複製到新資料夾。如需這些檔案的詳細資訊,請參閱 了解進入點 JSON 檔案

  4. 檢閱 TerraformCloudFormation 範例目錄,然後根據這些範例建構您的app-repo資料夾。這些目錄包含部署 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體或 Amazon Simple Storage Service (Amazon S3) 儲存貯體的範例。

  5. 繼續前往下列兩個區段之一:

建立管道並定義階段 (Terraform)

  1. DevOps Pipeline Accelerator (DPA) 儲存庫從 GitHub 複製到本機工作站。

  2. 在複製的儲存庫中,導覽至 aws-codepipeline/terraform/pipeline-modules 資料夾。

  3. terraform.tfvars 檔案中,更新並驗證 Terraform 狀態和 AWS Identity and Access Management (IAM) 角色特定變數。

  4. 建立 Docker 映像。如需說明,請參閱在 CodeBuild (GitHub) 中使用 的 Docker 映像建立。 GitHub

  5. 更新 terraform.tfvars 檔案中定義的builder_image變數。

  6. 輸入下列命令:這會透過 Terraform 初始化、預覽和部署基礎設施。

    terraform init terraform plan terraform apply
  7. 登入 AWS 帳戶。在 CodePipeline 主控台中,確認已建立新的管道。

    注意:如果第一次執行處於 failed 狀態,請重複上一個步驟。

  8. 建立新的 CodePipeline 管道時,會自動為 建立新的 IAM 角色 AWS CodeBuild 。此自動建立角色的名稱結尾為 -codebuild-role。使用部署基礎設施所需的許可更新此角色。

建立管道並定義階段 (CloudFormation)

  1. DevOps Pipeline Accelerator (DPA) 儲存庫從 GitHub 複製到本機工作站。

  2. 在複製的儲存庫中,導覽至 aws-codepipeline/cloudformation/pipeline-modules 資料夾。

  3. 部署 pipeline-cft.yaml CloudFormation 範本。以下是您必須傳遞至堆疊的必要參數。

    • ArtifactsBucket – 包含要更新之管道成品的儲存庫名稱

    • EcrDockerRepository – 具有 image標籤之 Amazon ECR 儲存庫的統一資源識別符 (URI)

    • CodeCommitAppRepo – 包含範本的 CodeCommit 儲存庫名稱

    • CodeCommitBaseRepo – 包含共用檔案的 CodeCommit 儲存庫名稱

    • CodeCommitRepoBranch – CodeCommit 儲存庫分支的名稱

    • SNSMailAddress – 將接收管道狀態的 Amazon Simple Notification Service (Amazon SNS) 通知的電子郵件地址

    如需說明,請參閱 CloudFormation 文件中的使用堆疊

  4. 登入 AWS 帳戶。在 CodePipeline 主控台中,確認已建立新的管道。 

  5. 建立新的 CodePipeline 管道時,會自動為 建立新的 IAM 角色 AWS CodeBuild 。此自動建立角色的名稱結尾為 -codebuild-role。使用部署基礎設施所需的許可更新此角色。

了解進入點 JSON 檔案

Terraform 進入點檔案

這是主要組態檔案。在此檔案中,您可以自訂和啟用或停用階段。如果您停用階段,則不會從管道中刪除或移除階段。相反地,在執行時間會略過階段。

{ "build_stage_required" : "true", "test_stage_required" : "true", "predeploy_stage_required": "true", "deploy_stage_required": "true", "postdeploy_stage_required": "true", "destroy_stage_required": "true", "bucket":"tf-state-dpa", # S3 bucket used for Terraform backend "key":"terraform_test.tfstate", # S3 key to be used "region":"us-east-1", "dynamodb_table":"tf-state-dpa" # DynamoDB Table for Terraform backend }

CloudFormation 進入點檔案

這是主要組態檔案。在此檔案中,您可以自訂階段,並啟用或停用它們。如果您停用階段,則不會從管道中刪除或移除階段。相反地,管道會在執行時間略過階段。

{ "init_stage_required" : "true", "test_stage_required" : "true", "createinfra_stage_required": "true", "envType" : "cloudformation", "stage_required" : "true", "cft_s3_bucket" : "pipeline-bucket", #S3 bucket from the destination account to keep CFT templates "stack_name" : "aws-cft-poc", #CloudFormation stack name "account" : "************", #Destination AWS account to deploy stack "roleName" : "codestack-poc-cross-account-role", #Cross-account IAM role name "region" : "us-east-1", "destroy_stack" : "false" #To destroy the provisioned stack, set this value to "true" }