Terraformで AWS App Runner + CodeCommit + CodeBuild + CodePipeline のデプロイ環境を構築する


#はじめに
本記事では、Terraform で AWS App Runner + CodeCommit + CodeBuild + CodePipeline のデプロイ環境を構築する手順を記載しています。

下記の記事を読ませていただいて、自分も試行してみようと思いたって、この環境を構築してみました。

[TerraformでAWS App Runnerを爆速構築してみる](https://qiita.com/neruneruo/items/e75b19b945acfd2ae56c?utm_campaign=popular_items&utm_medium=feed&utm_source=popular_items)

#Terraform で構築する全体構成図
![00_terraform_apprunner.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283246/e2f60de9-7b07-3b44-8837-817e89912c0e.png)

#Terraform のコードと構成

https://github.com/okubo-t/aws-terraform-app-runner-deploy

```
$ tree aws-terraform-app-runner-deploy
aws-terraform-app-runner-deploy
├── apprun.tf
├── cloudwatch-event.tf
├── codebuild.tf
├── codecommit.tf
├── codepipeline.tf
├── default-sample-apprun
│   ├── Dockerfile
│   ├── buildspec.yml
│   └── src
│       └── index.php
├── ecr.tf
├── iam-policy
│   ├── apprunner-trust-policy.json
│   ├── cloudwatch-event-policy.json
│   ├── cloudwatch-event-trust-policy.json
│   ├── codebuild-policy.json
│   ├── codebuild-trust-policy.json
│   ├── codepipeline-policy.json
│   └── codepipeline-trust-policy.json
├── iam-role.tf
├── output.tf
├── terraform.tf
├── terraform.tfvars-
└── variables.tf
```

#事前準備
・Terraform のインストール
・tfenv のインストール
・[Terraform を実行するための IAM のアクセスキーとシークレットキー](https://aws.amazon.com/jp/premiumsupport/knowledge-center/create-access-key/)
・[CodeCommit への HTTPS 接続用の Git 認証情報](https://docs.aws.amazon.com/ja_jp/codecommit/latest/userguide/setting-up-gc.html#setting-up-gc-iam)

#Terraform の動作確認環境

```
$ terraform -version
Terraform v0.15.4
on darwin_amd64
+ provider registry.terraform.io/hashicorp/aws v3.42.0
```

#Terrraform で CodePipeline + CodeCommit + CodeBuild の環境を構築する

本手順は、Mac環境で実施することを想定しています。
Terraformのコードをダウンロードします。

```
$ git clone https://github.com/okubo-t/aws-terraform-app-runner-deploy.git
```

Terraform のコードがあるディレクトへ移動します。

```
$ cd aws-terraform-app-runner-deploy/
```
     
terraform.tfvars ファイルを作成します。

```
$ cp -p terraform.tfvars- terraform.tfvars
```

作成した terraform.tfvars 内の各パラメータを環境に応じて、任意で変更します。(下記のキーはサンプルです。)

```terraform.tfvars
# アクセスキー
aws_access_key = "AKIAIOSFODNN7EXAMPLE"

# シークレットキー
aws_secret_key = "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY"

# リージョン
aws_region     = "ap-northeast-1"

# Docker ファイルを Push する Codecommit のリポジトリ名
repo_name = "sample-apprun"

# Codecommit のリポジトリの説明
repo_description = "App for App Runner"

# AWS App Runner のサービス名
service_name = "sample-apprun"
```

下記コマンドで、Terraform の初期設定をします。

```
$ terraform init
```

下記コマンドで、環境のデプロイを実行します。

```
$ terraform apply
```

デプロイ後に出力される Outputsの内容をメモします。(下記の値は例です。)

```
Apply complete! Resources: 19 added, 0 changed, 0 destroyed.

Outputs:

codecommit_repository = "https://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/sample-apprun"
ecr_repository = "123456789.dkr.ecr.ap-northeast-1.amazonaws.com/sample-apprun"
```

下記コマンドで、構築されたAWS環境のコンポーネントを確認できます。

```
$ terraform state list
```

**これで、CodePipeline + CodeCommit + Codebuild の環境の構築が完了です。**

# Docker イメージ構築用のパイプラインの実行
下記コマンドを実行して、CodeCommit のリポジトリをクローンします。（メモしたOutputsの codecommit_repository の値を参照します。）

```
$ git clone https://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/sample-apprun
```

クローンしたリポジトリに、構築したい Docker イメージのファイル群を作成します。
（※ここで記載している手順では、Terraform のコード内のディレクトリ（default-sample-app）のDocker ファイル群を使用しています。）

```
$ tree default-sample-apprun
sample-apprun
├── Dockerfile
├── buildspec.yml
└── src
    └── index.php

1 directory, 3 files
```

```Dockerfile.file
FROM php:7.4.0-apache
COPY src/ /var/www/html/
```

```./src/index.php 
<!DOCTYPE html>
<html lang="ja">
<head>
<title>PHP Sample</title>
  </head>
  <body>
<?php echo "Hello World v1"; ?> </body>
```

<font color="Red">ここでは、CodeBuild 実行用の buildspec.yml を下記のように記載しています。</font>

```buildspec.yml
version: 0.2

phases:
  pre_build:
    commands:
      - echo Logging in to Amazon ECR...
      - aws --version
      - echo $AWS_DEFAULT_REGION
      - $(aws ecr get-login --region $AWS_DEFAULT_REGION --no-include-email)
      - REPOSITORY_URI=$AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME
      - COMMIT_HASH=$(echo $CODEBUILD_RESOLVED_SOURCE_VERSION | cut -c 1-7)
      - IMAGE_TAG=${COMMIT_HASH:=latest}
  build:
    commands:
      - echo Build started on `date`
      - echo Building the Docker image...
      - docker build -t $REPOSITORY_URI:latest .
      - docker tag $REPOSITORY_URI:latest $REPOSITORY_URI:$IMAGE_TAG
  post_build:
    commands:
      - echo Build completed on `date`
      - docker push $REPOSITORY_URI:latest
      - docker push $REPOSITORY_URI:$IMAGE_TAG
```

CodeCommit のリポジトリに にDocker ファイル群をプッシュします。

```
$ git push
```

CodePipeline の管理コンソールからデプロイパイプラインが成功していることを確認します。
![01_terraform_apprunner.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283246/77638b3b-74a4-0a8d-47a2-8a2698bae755.png)

ECR の管理コンソールからイメージがプッシュされていることを確認します。
![02_terraform_apprunner.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283246/d1454306-a812-af25-3476-ddafd95788c9.png)

**これで、Docker イメージ構築のパイプラインが実行され、ECR へのアップロードが完了です。**

# Terraform でAWS App Runner のサービスを構築する
下記コマンドで、App Runnerのサービスの構築用の tfファイルの拡張子を変更します。(tfファイルを有効にします。)

```
$ mv apprun.tf- apprun.tf
```

下記コマンドで、App Runnerのサービスを構築します。

```
$ terraform apply
```

コマンドを実行後、App Runnerの管理コンソールから、サービスの構築のステータスが **in progress** となっていることを確認します。
![03_terraform_apprunner.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283246/f9cd4c12-55a0-9b08-1a33-29da710d3e4c.png)
ステータスが、 **Suceeded** になったことを確認したら、デフォルトドメインをクリックします。
![04_terraform_apprunner.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283246/ba9ae43f-f90b-31d1-6b1c-9ee43c6f9410.png)
**下記のようにブラウザで表示されることを確認できれば、App Runneのサービスの構築は完了です。**
![05_terraform_apprunner.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283246/eafe861d-e510-6e48-2eda-79d14cf4e6ab.png)

**これで**
**コードのCodeCommit へのプッシュ**
↓
**Dockerイメージの CodeBuild による構築**
↓
**イメージのECRへのプッシュ**
↓
**App Runnerへのデプロイ**

**のパイプラインの構築が完了です。**

#後片付け
下記コマンドで、Terraform で作成したAWS環境を削除します。

```
$ terraform destroy
```
#さいごに
需要があるか分からないですが、何かの助けになれば幸いです。
AWS App Runner サービスの今後に期待大ですね。