TerraformでAWS App Runnerを構築してみた
AWS App RunnerにTerraformが対応
最近公開されたAWS App RunnerにTerraformが対応したようなので、早速さわってみました。
Djangoアプリを用意する
とりあえずなんでも良いのでWebアプリと、アプリが動く状態のDockerfileを用意します。
今回はstartproject
コマンドで作成した直後のDjangoアプリを用意しました。
注意点として、App Runner作成時にカスタムドメインを指定しない場合は、App runnerで作成されるドメイン名には、AWS側でユニークなドメイン名を付与されます。
DjangoなどのWebアプリケーションフレームワークでは、主にHostヘッダインジェクション対策としてアプリケーションを動かすホスト名を設定する必要がありますが、今回はあくまでTerraformでApp Runnerを構築するのが目的なので、一旦*
を設定しています。
(実際の開発では正しく設定し、セキュリティ対策を行ってください)
ALLOWED_HOSTS = ["*"]
バージョン
AWS App Runnerを構築するには、以下のバージョンを満たす必要があります。
- Terraform v0.12以上
- AWS providerの最新バージョン(3.42.0)
Configuring App Runner in the Terraform AWS Provider
今回は以下のバージョンで構築しました。
$ terraform version
Terraform v0.15.4
on darwin_amd64
AWS providerのバージョンを指定する
AWS App RunnerはAWS providerの最新のバージョンを使う必要があるので、providerの設定を書きます。
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のリポジトリから確認してください)
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.com
とtasks.apprunner.amazonaws.com
を指定するのがキモです。
あとは、AWS側がApp Runner用にポリシーを用意してくれているので、それをIAMロールにアタッチします。
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のプライベートリポジトリを設定します。
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 "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
以上、お疲れさまでした
Discussion