使用Terraform来构建Fargate环境和部署流水线

首先

本文介绍了使用Terraform构建ECS Fargate环境和Docker镜像部署流水线(CodeCommit + CodeBuild + CodePipeline)的步骤。

我们预计初学者和对Hands-On和App Runner感兴趣的开发者会使用它来试用。

使用Terraform构建的整体架构图。

00_terraform_fargate_cicd_pipeline.png

在这个环境中将镜像部署到ECS的方式是通过CodePipeline进行滚动更新。

使用Terraform构建的AWS资源的BlackBelt资料。

虚拟私有云 (VPC)
应用负载均衡器 (ALB)
弹性云服务器 (ECS)
代码仓库 (CodeCommit)
代码构建 (CodeBuild)
代码流水线 (CodePipeline)
云监控时间表 (CloudWatchEvents)
身份和访问管理 (IAM)
证书管理 (ACM)
路由53 (Route53)

Terraform 的代码和配置

$ tree aws-terraform-beginner-fargate-cicd
aws-terraform-beginner-fargate-cicd
├── acm.tf
├── alb.tf
├── aws.tf
├── cloudwatch-event.tf
├── codebuild.tf
├── codecommit.tf
├── codepipeline.tf
├── default-sample-app
│   ├── Dockerfile
│   ├── buildspec.yml
│   └── src
│       └── index.php
├── ecs.tf
├── iam-policy
│   ├── cloudwatch-event-policy.json
│   ├── cloudwatch-event-trust-policy.json
│   ├── codebuild-policy.json
│   ├── codebuild-trust-policy.json
│   ├── codepipeline-policy.json
│   ├── codepipeline-trust-policy.json
│   ├── ecs-task-policy.json
│   └── ecs-task-trust-policy.json
├── iam-role.tf
├── output.tf
├── r53.tf
├── security-group.tf
├── taskdef-default.json
├── terraform.tfvars-
├── variables.tf
└── vpc.tf

使用Terraform构建的每个资源的名称。

リソース名前(デフォルト)アプリ URLhttps://sample-app.example.comCodeCommit リポジトリ名sample-appVPC 名prefix-dev-vpcALB 名prefix-dev-albALB CNAMEsample-app.example.comALB セキュリティグループ名prefix-dev-alb-sgECS クラスタ名prefix-dev-clusterECR リポジトリ名prefix-dev-sample-appタスク定義名prefix-dev-defコンテナ名prefix-dev-sample-appサービス名prefix-dev-sample-app-svcサービス セキュリティグループ名prefix-dev-ecs-sgCodePipeline 名prefix-dev-sample-app-cpArtifact Store名prefix-dev-sample-app-artifactCodeBuild プロジェクト名prefix-dev-sample-app-cbCloudWatch Events名prefix-dev-sample-app-cp-cwe

事前准备

– 安装Docker Desktop
– 安装Terraform
– 安装tfenv
– 为执行Terraform准备IAM访问密钥和秘密密钥
– Git认证信息用于通过HTTPS连接到CodeCommit
– 在Route53上拥有有效的Route 53 Hosted Zone
– 安装AWS CLI

Terraform操作的确认环境

$ terraform -version
Terraform v0.12.31
+ provider.aws v2.70.0
+ provider.template v2.2.0

使用Terraform构建环境的步骤

假设该步骤在Mac环境下进行,请下载Terraform的代码。

$ git clone https://github.com/okubo-t/aws-terraform-beginner-fargate-cicd.git

前往包含Terraform代码的目录。

$ cd aws-terraform-beginner-fargate-cicd/

创建terraform.tfvars文件。

$ cp -p terraform.tfvars- terraform.tfvars

根据环境的需要,您可以选择性地更改 terraform.tfvars 文件中的每个参数。以下键是示例。

# アクセスキー
aws_access_key = "AKIAIOSFODNN7EXAMPLE"

# シークレットキー
aws_secret_key = "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY"
# リージョン
aws_region     = "ap-northeast-1"

# リソース名のプレフィックス
prefix = "prefix"

# リソースの環境
env = "dev"

# ALB の ALIAS レコードを登録する Route53 上のゾーン名
hosted_zone = "example.com"

# ALB への HTTP(S) アクセスを許可するパブリック IP
source_ip = "0.0.0.0/0"

# Codecommit のリポジトリ名
repo_name = "sample-app"

# Codecommit のリポジトリの説明
repo_description = "sample-app for ECS"

使用以下命令来进行 Terraform 的初始配置。

$ terraform init

请使用下面的命令执行环境的部署。

$ terraform apply

部署完成之后,请记录Outputs输出的内容。(以下值为示例。)

Apply complete! Resources: 49 added, 0 changed, 0 destroyed.

Outputs:

codecommit_repository = https://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/sample-app
ecr_repository = 123456789.dkr.ecr.ap-northeast-1.amazonaws.com/prefix-dev-sample-app
url = https://prefix-dev-sample-app.example.com

现在,使用Terraform已经完成了环境的构建。

您可以使用下面的命令来检查构建的AWS环境的组件。

$ terraform state list

在中国的原生环境下,部署Docker镜像。

已确认AWS CLI可用的环境。

$ aws --version
aws-cli/1.18.165 Python/3.7.4 Darwin/18.7.0 botocore/1.19.5

我会设置AWS认证信息。

$ export AWS_ACCESS_KEY_ID=XXXXXXXXXXXXXXXX     # アクセスキー
$ export AWS_SECRET_ACCESS_KEY=XXXXXXXXXXXXXXX  # シークレットアクセスキー
$ export AWS_DEFAULT_REGION=ap-northeast-1      # デフォルトリージョン 

转到Terraform代码中的目录(default-sample-app)。

$ cd default-sample-app/

在AWS CLI中执行命令,用于对注册表进行Docker客户端身份验证。(参考已记录的Outputs中的ecr_repository。)

$ aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin 123456789.dkr.ecr.ap-northeast-1.amazonaws.com

当显示“登录成功”时,表示认证成功。

Login Succeeded

执行构建Docker镜像的命令。(请参考已备忘的输出 ecr_repository。)

$ docker build -t prefix-dev-sample-app .

使用下面的命令,为图像打上标签,以便将其推送到此存储库中(请参考已记下的输出 ecr_repository)。

$ docker tag prefix-dev-sample-app:latest 123456789.dkr.ecr.ap-northeast-1.amazonaws.com/prefix-dev-sample-app:latest

我将把这个映像推送到此存储库中(参考已记录的Outputs中的ecr_repository)。

$ docker push 123456789.dkr.ecr.ap-northeast-1.amazonaws.com/prefix-dev-sample-app:latest

确认图像已推送(参考已记录的输出 ecr_repository)。

$ aws ecr describe-repositories --repository-names prefix-dev-sample-app

{
    "repositories": [
        {
            "repositoryArn": "arn:aws:ecr:ap-northeast-1:123456789:repository/prefix-dev-sample-app",
            "registryId": "123456789",
            "repositoryName": "prefix-dev-sample-app",
            "repositoryUri": "123456789.dkr.ecr.ap-northeast-1.amazonaws.com/prefix-dev-sample-app",
            "createdAt": 123456789.0,
            "imageTagMutability": "MUTABLE",
            "imageScanningConfiguration": {
                "scanOnPush": false
            },
            "encryptionConfiguration": {
                "encryptionType": "AES256"
            }
        }
    ]
}
01_terraform_fargate_cicd_pipeline.png
02_terraform_fargate_cicd_pipeline.png

执行curl命令,确认是否显示“Hello World v1”(请参考记录的Outputs的url值)。

$ curl https://sample-app.example.com
<!DOCTYPE html>
<html lang="ja">
<head>
<title>PHP Sample</title>
  </head>
  <body>
Hello World v1 </body>

请执行以下命令,克隆 CodeCommit 仓库。(请参考记录的 Outputs 中的 codecommit_repository 值。)

# ディレクトリの上へ
$ cd ..
$ git clone https://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/sample-app

将Terraform代码中的目录(default-sample-app)中的每个文件复制到克隆存储库中。

$ cp -r ./default-sample-app/* [クローンしたリポジトリ名]

将index.php文件更改为“Hello World v2”。

$ cd sample-app/
$ vi ./src/index.php

<!DOCTYPE html>
<html lang="ja">
<head>
<title>PHP Sample</title>
  </head>
  <body>
<?php echo "Hello World v2"; ?> </body>
</html>

将代码推送到CodeCommit存储库中。

$ git add -A

$ git status
On branch master

No commits yet

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

    new file:   Dockerfile
    new file:   buildspec.yml
    new file:   src/index.php

$ git commit -m "update index.php"
$ git push
03_terraform_fargate_cicd_pipeline.png

只需一个选项,用汉语重新表达以下内容:
再次运行curl命令,如果显示“Hello World v2”,则环境已经配置完成。

$ curl https://sample-app.example.com
<!DOCTYPE html>
<html lang="ja">
<head>
<title>PHP Sample</title>
  </head>
  <body>
Hello World v2 </body>
</html>

请您在管理控制台上查看每个资源的详细设置。

整理房間

使用以下命令,删除使用Terraform创建的AWS环境。

$ terraform destroy

最后

如果能对初学者的Fargate CI/CD学习有丝毫帮助,我们将感到非常幸福。