AWS入門 - App Runner 使ってみる

2021/11/18に公開

AWSを使う必要が出てきたので、色々と試してみる。
ここでは、App Runner を試す。

AWS App Runner

https://docs.aws.amazon.com/ja_jp/apprunner/latest/dg/what-is-apprunner.html

App Runner は CaaS と PaaS をミックスしたようなもの。
Dockerイメージを元にアプリケーションをデプロイできるし、PaaSのように指定された形式のソースコードを元にアプリケーションをデプロイできる。

ECSにデプロイする環境を抽象化したようなイメージ。
Elastic Beanstalkの方がイメージとしては近いのかもしれない。

サービス

1つのイメージorソースコードを元に、1つのサービスが作成される。
パイプラインとかロードバランサーとか実行環境とかを1つにまとめたもの。

App Runnerを使ってみる

サービス作成

まずは、サービスを作成する。
ここでは、ECRにあるイメージを元に作ってみる。

DockerイメージはCodePipelineを試したときのやつを流用する。
https://zenn.dev/umatoma/articles/285a3980bb6dc6

適当にサービス名を指定し、80番ポートを指定する。
他は特に設定せず、これで作成してみる。

数分でサービスの作成が完了した。
裏側でデプロイ用のパイプラインを作ったりしているようなので、最初は少し時間がかかってしまうのだろう。

速攻でインターネットからアクセス可能なアプリケーションが作成できた。
アプリケーションログはCloudWatchへと流れるようになっているし、リクエスト数などのメトリクスも確認できる。

その他にも、オートスケーリング・ヘルスチェック・カスタムドメインなどが簡単に設定できるっぽいので、多くのケースで必要となる要素は揃ってる感じ。
ただし、VPCを指定する箇所はないので、VPCに依存した何かが必要な場合は、今の所は選択肢から外れてしまいそう。

再デプロイ

サービスを作成したので、イメージを更新して再デプロイしてみる。
Deployment trigger を Automatic にしてあるので、ECRにPushすれば自動的にデプロイが開始されるはず。

Pushしたらデプロイが開始された。

数分でデプロイが完了した。
最初に発行された awsapprunner.com のドメインは変わらずそのまま。

Event log に↓が出ているので、おそらく内部的にはBlue/Greenデプロイが行われているのだろう。
ECSを使った場合はCodePipelineとかALBとか色々と設定しないといけないので、それらが全て隠蔽されているのは楽で良い。

11-17-2021 10:11:59 PM [AppRunner] Health check is successful. Routing traffic to application.
11-17-2021 10:11:11 PM [AppRunner] Performing health check on port '80'.

サービス削除

コンソール画面から削除するだけで、きれいに消え去ってくれる。

Terraform で App Runner 環境を構築してみる

Terraformを使ってAppRunner環境を構築してみたいと思う。

https://zenn.dev/umatoma/articles/9fb6e2b8481838

サービス作成

Provider は hashicorp/aws でOK。
App Runner もサポートされている。

https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/apprunner_service

IAMロールはコンソール画面から作成した物と同じ内容を設定しておいた。
また、ロール作成直後にサービス作成を行うと、ロールが取得できず失敗してしまうので、間で5秒待つようにした。

main.tf
terraform {
  required_providers {
    aws = {
      source = "hashicorp/aws"
      version = "~> 3.0"
    }
    time = {
      source = "hashicorp/time"
    }
  }
}

provider "aws" {
  region = "ap-northeast-1"
}

resource "aws_iam_role" "AppRunnerECRAccessRole" {
  name = "AppRunnerECRAccessRole1117"
  assume_role_policy = jsonencode({
    Version = "2012-10-17"
    Statement = [
      {
        Effect = "Allow"
        Principal = {
          Service = "build.apprunner.amazonaws.com"
        }
        Action = "sts:AssumeRole"
      }
    ]
  })
  managed_policy_arns = [
    "arn:aws:iam::aws:policy/service-role/AWSAppRunnerServicePolicyForECRAccess"
  ]
}

resource "time_sleep" "wait_create_roles" {
  create_duration = "5s"
  depends_on = [
    aws_iam_role.AppRunnerECRAccessRole
  ]
}

resource "aws_apprunner_service" "mynginx" {
  service_name = "service-terraform-1117"
  source_configuration {
    authentication_configuration {
      access_role_arn = aws_iam_role.AppRunnerECRAccessRole.arn
    }
    image_repository {
      image_configuration {
        port = "80"
      }
      image_identifier = "xxxxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/mynginx:latest"
      image_repository_type = "ECR"
    }
  }
  depends_on = [
    time_sleep.wait_create_roles
  ]
}

ちなみに、VSCodeのExtensionを入れておくと、自動補完が可能になるので、ドキュメント読まなくても詰まること無く記述していけるのが非常に良い。

https://marketplace.visualstudio.com/items?itemName=HashiCorp.terraform

これで、init・applyする。

$ terraform init

Initializing the backend...

Initializing provider plugins...
- Reusing previous version of hashicorp/time from the dependency lock file
- Reusing previous version of hashicorp/aws from the dependency lock file
- Using previously-installed hashicorp/aws v3.65.0
- Using previously-installed hashicorp/time v0.7.2
...
$ terraform apply

Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
  + create

Terraform will perform the following actions:

  # aws_apprunner_service.mynginx will be created
  + resource "aws_apprunner_service" "mynginx" {
...
    }

  # aws_iam_role.AppRunnerECRAccessRole will be created
  + resource "aws_iam_role" "AppRunnerECRAccessRole" {
...
    }

  # time_sleep.wait_create_roles will be created
  + resource "time_sleep" "wait_create_roles" {
...
    }

Plan: 3 to add, 0 to change, 0 to destroy.

Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value: yes

aws_iam_role.AppRunnerECRAccessRole: Creating...
aws_iam_role.AppRunnerECRAccessRole: Creation complete after 5s [id=AppRunnerECRAccessRole1117]
time_sleep.wait_create_roles: Creating...
time_sleep.wait_create_roles: Creation complete after 5s [id=2021-11-17T15:26:35Z]
aws_apprunner_service.mynginx: Creating...
...
aws_apprunner_service.mynginx: Creation complete after 3m55s [id=arn:aws:apprunner:ap-northeast-1:438113357318:service/service-terraform-1117/8c0f5328dc014297bd8cb304b56cd09f]

Apply complete! Resources: 3 added, 0 changed, 0 destroyed.

作成された。

サービス削除

terraform destroyするだけ。
サービス・ロールともに削除された。

まとめ

使いづらいCodePipelineとか、面倒くさいVPCやALBをまとめて隠蔽してくれているのは、とても良い。
欲しかったのは、こういうのである。
(一周回ってPaaS的なやつに戻ってきた感じがする)

ただし、RDSとかIAMベースでの認証・認可に制約があるものとの連携が難しい面もある。

また、AWS Copilot というものがあるらしく、
それを使うと App Runner や ECS・Fargate の環境構築を簡単に行うことができるらしい。
なので、AWS Copilot を次回は試してみたいと思う。

Discussion