🌟

TerraformでAWS App Runnerを構築してみた

2021/05/23に公開

AWS App RunnerにTerraformが対応

最近公開されたAWS App RunnerにTerraformが対応したようなので、早速さわってみました。

Djangoアプリを用意する

とりあえずなんでも良いのでWebアプリと、アプリが動く状態のDockerfileを用意します。
今回はstartprojectコマンドで作成した直後のDjangoアプリを用意しました。
注意点として、App Runner作成時にカスタムドメインを指定しない場合は、App runnerで作成されるドメイン名には、AWS側でユニークなドメイン名を付与されます。
DjangoなどのWebアプリケーションフレームワークでは、主にHostヘッダインジェクション対策としてアプリケーションを動かすホスト名を設定する必要がありますが、今回はあくまでTerraformでApp Runnerを構築するのが目的なので、一旦*を設定しています。
(実際の開発では正しく設定し、セキュリティ対策を行ってください)

settings.py
ALLOWED_HOSTS = ["*"]

バージョン

AWS App Runnerを構築するには、以下のバージョンを満たす必要があります。

今回は以下のバージョンで構築しました。

$ terraform version
Terraform v0.15.4
on darwin_amd64

AWS providerのバージョンを指定する

AWS App RunnerはAWS providerの最新のバージョンを使う必要があるので、providerの設定を書きます。

main.tf
 terraform {
  required_providers {
    aws = {
      version = ">= 3.42.0"
      source  = "hashicorp/aws"
    }
  }
} 

ECRにイメージをpushする

AWS App Runnerはソースコードまたはコンテナイメージを元にアプリをできますが、今回はコンテナイメージを使います。
AWS App Runnerを作成するより前にECRにコンテナイメージを置く必要があるので、先にTerraformでECRを作成し、手元で作成したDjangoアプリが動くコンテナイメージをpushします。
pushコマンドはいつものやつです(ECRのリポジトリから確認してください)

ecr.tf
resource "aws_ecr_repository" "app_runner_image" {
  name                 = "app-runner-sample"
  image_tag_mutability = "MUTABLE"

  image_scanning_configuration {
    scan_on_push = true
  }
}

App Runnerに付与するIAMロールを作成する

AWS App Runnerを構築するために、IAMロールを設定します。
AssumeRoleの割当先のサービスにbuild.apprunner.amazonaws.comtasks.apprunner.amazonaws.comを指定するのがキモです。
あとは、AWS側がApp Runner用にポリシーを用意してくれているので、それをIAMロールにアタッチします。

iam.tf
resource "aws_iam_role" "role" {
  name = "test-role"

  assume_role_policy = <<EOF
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": "sts:AssumeRole",
      "Principal": {
        "Service": [
          "build.apprunner.amazonaws.com",
          "tasks.apprunner.amazonaws.com"
        ]
      },
      "Effect": "Allow",
      "Sid": ""
    }
  ]
}
EOF
}

resource "aws_iam_role_policy_attachment" "test-attach" {
  role       = aws_iam_role.role.name
  policy_arn = "arn:aws:iam::aws:policy/service-role/AWSAppRunnerServicePolicyForECRAccess"
}

App Runnerを作成する

最後にApp RunnerのリソースをTerraformで作成します。
いくつかApp Runner関連のresourceがあるのですが、実際にApp Runnerを作成するためのメインのリソースとなるのがaws_apprunner_serviceです。
source_configurationに作成するApp Serviceの作成に使うソースコード or コンテナイメージ等を設定していきます。
今回はECRのプライベートリポジトリを設定します。

app-runner.tf
resource "aws_apprunner_service" "example" {
  service_name = "example"

  source_configuration {
    # 作成したIAMロールを指定
    authentication_configuration {
      access_role_arn = aws_iam_role.role.arn
    }
    # 事前に作成・pushしておいたECRリポジトリを指定
    image_repository {
      image_configuration {
        port = "8000"
      }
      image_identifier      = "${aws_ecr_repository.app_runner_image.repository_url}:latest"
      image_repository_type = "ECR"
    }
  }

  tags = {
    Name = "example-apprunner-service"
  }
}

applyして作成されたApp RunnerのURLを確認する

applyコマンドの実行結果として、作成されたApp RunnerのURLを確認したいので、outputを設定します。

output.tf
output "app_runner_url" {
  value = aws_apprunner_service.example.service_url
}

あとはapplyするだけで、よしなに作ってくれます。
実行完了するまでに2~3分かかるのでコーヒーブレイクしてください。
実行が完了すると、以下のようにURLが表示されるのでアクセスしてみましょう。

app_runner_url = "xxxxxxxxx.ap-northeast-1.awsapprunner.com"

Djangoのページが見えたら完了です。楽ちんですね。

お掃除

作ったリソースは最後にきちんと削除しましょう~

$ terraform destroy

以上、お疲れさまでした

GitHubで編集を提案

Discussion