本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
使用 CodePipeline 部署 Terraform 和 CloudFormation 範本
Notice (注意)
AWS CodeCommit 不再提供給新客戶。的現有客戶 AWS CodeCommit 可以繼續正常使用服務。進一步了解
在 DPA 中,您可以使用 的建置區塊 AWS CodePipeline 來建立 Terraform 和 CloudFormation IaC 的加速器。本節說明此使用案例的下列項目:
-
標準化管道結構
-
可重複使用的階段和任務
-
用於安全掃描的整合工具
DPA 儲存庫包含 Terraform
-
管道模組 – 此資料夾包含用於部署標準化管道結構的程式碼。
-
共用 – 此資料夾包含 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 儲存庫
-
建立兩個單獨的 CodeCommit 儲存庫,如下所示:
-
common-repo
– 此儲存庫包含共用程式庫、buildspec 檔案和相依性。 -
app-repo
– 此儲存庫包含部署基礎設施的 Terraform 或 CloudFormation 範本。
如需說明,請參閱建立 AWS CodeCommit 儲存庫。
-
-
在
common-repo
儲存庫中,建立名為 的資料夾shared
。將 GitHub DPA 儲存庫中 Terraform或 CloudFormation 共用資料夾的 buildspec 檔案複製到新資料夾。如需說明,請參閱建立檔案或將檔案新增至 AWS CodeCommit 儲存庫。 -
在儲存
app-repo
庫中,建立名為 的資料夾entrypoint
。將檔案從 GitHub DPA 儲存庫中的 Terraform或 CloudFormation 進入點資料夾複製到新資料夾。如需這些檔案的詳細資訊,請參閱 了解進入點 JSON 檔案。 -
檢閱 Terraform
或 CloudFormation 範例目錄,然後根據這些範例建構您的 app-repo
資料夾。這些目錄包含部署 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體或 Amazon Simple Storage Service (Amazon S3) 儲存貯體的範例。 -
繼續前往下列兩個區段之一:
建立管道並定義階段 (Terraform)
-
將 DevOps Pipeline Accelerator (DPA) 儲存庫
從 GitHub 複製到本機工作站。 -
在複製的儲存庫中,導覽至
aws-codepipeline/terraform/pipeline-modules
資料夾。 -
在 terraform.tfvars 檔案中,更新並驗證 Terraform 狀態和 AWS Identity and Access Management (IAM) 角色特定變數。
-
建立 Docker 映像。如需說明,請參閱在 CodeBuild (GitHub) 中使用 的 Docker 映像建立
。 GitHub -
更新 terraform.tfvars 檔案中定義的
builder_image
變數。 -
輸入下列命令:這會透過 Terraform 初始化、預覽和部署基礎設施。
terraform init terraform plan terraform apply
-
登入 AWS 帳戶。在 CodePipeline 主控台
中,確認已建立新的管道。 注意:如果第一次執行處於
failed
狀態,請重複上一個步驟。 -
建立新的 CodePipeline 管道時,會自動為 建立新的 IAM 角色 AWS CodeBuild 。此自動建立角色的名稱結尾為
-codebuild-role
。使用部署基礎設施所需的許可更新此角色。
建立管道並定義階段 (CloudFormation)
-
將 DevOps Pipeline Accelerator (DPA) 儲存庫
從 GitHub 複製到本機工作站。 -
在複製的儲存庫中,導覽至
aws-codepipeline/cloudformation/pipeline-modules
資料夾。 -
部署 pipeline-cft.yaml CloudFormation 範本。以下是您必須傳遞至堆疊的必要參數。
-
ArtifactsBucket
– 包含要更新之管道成品的儲存庫名稱 -
EcrDockerRepository
– 具有image
標籤之 Amazon ECR 儲存庫的統一資源識別符 (URI) -
CodeCommitAppRepo
– 包含範本的 CodeCommit 儲存庫名稱 -
CodeCommitBaseRepo
– 包含共用檔案的 CodeCommit 儲存庫名稱 -
CodeCommitRepoBranch
– CodeCommit 儲存庫分支的名稱 -
SNSMailAddress
– 將接收管道狀態的 Amazon Simple Notification Service (Amazon SNS) 通知的電子郵件地址
如需說明,請參閱 CloudFormation 文件中的使用堆疊。
-
-
登入 AWS 帳戶。在 CodePipeline 主控台
中,確認已建立新的管道。 -
建立新的 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" }