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


はじめに

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

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

TerraformでAWS App Runnerを爆速構築してみる

Terraform で構築する全体構成図

Terraform のコードと構成

$ 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 のアクセスキーとシークレットキー
CodeCommit への HTTPS 接続用の Git 認証情報

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>

ここでは、CodeBuild 実行用の buildspec.yml を下記のように記載しています。

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 の管理コンソールからデプロイパイプラインが成功していることを確認します。

ECR の管理コンソールからイメージがプッシュされていることを確認します。

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

Terraform でAWS App Runner のサービスを構築する

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

$ mv apprun.tf- apprun.tf

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

$ terraform apply

コマンドを実行後、App Runnerの管理コンソールから、サービスの構築のステータスが in progress となっていることを確認します。

ステータスが、 Suceeded になったことを確認したら、デフォルトドメインをクリックします。

下記のようにブラウザで表示されることを確認できれば、App Runneのサービスの構築は完了です。

これで
コードのCodeCommit へのプッシュ

Dockerイメージの CodeBuild による構築

イメージのECRへのプッシュ

App Runnerへのデプロイ

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

後片付け

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

$ terraform destroy

さいごに

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