使用Terraform来构建Fargate环境和部署流水线
首先
本文介绍了使用Terraform构建ECS Fargate环境和Docker镜像部署流水线(CodeCommit + CodeBuild + CodePipeline)的步骤。
我们预计初学者和对Hands-On和App Runner感兴趣的开发者会使用它来试用。
使用Terraform构建的整体架构图。
在这个环境中将镜像部署到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构建的每个资源的名称。
事前准备
– 安装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"
}
}
]
}
执行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
只需一个选项,用汉语重新表达以下内容:
再次运行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学习有丝毫帮助,我们将感到非常幸福。