column

コラム

App Runnerを使ってWebアプリを簡単にデプロイする

はじめに

こんにちは。BTCクラウドCoEの竹中です。
今回はAWS App Runnerを紹介していきます。

AWSにおいてWebアプリを簡単にデプロイできるPaaSというと、代表的なものはElastic Beanstalkです。こちらはEC2やELBなどのAWSリソースを作成するため、結局それなりにインフラの知識は必要です。

ECS Fargateも広義のPaaSです。こちらもインフラリソースの管理を省力化できますが、タスク定義の作成が必要ですし、実運用を考えるとCI/CDのパイプラインを自作する必要があります。

上記のサービスはいずれも構成の自由度がある程度高い分、ユーザー側のインフラの管理責任は大きくなります。

AWS App Runnerとは

アプリケーションを簡単にデプロイできるサービスで、最も簡単な構成であればソースコードリポジトリさえ設定すればデプロイが可能です。

現在積極的な開発が行われており、2022年にも大きなアップデートがいくつかありました。
今回はそれらの新機能を使って、実際にどれくらい簡単にデプロイできるのか試してみました。

実際に使ってみる

構成

App Runnerの設定は、2022年のアップデート内容を取り入れて以下の通りとしました。

  • ランタイム: Go1.18
  • ソースコードプロバイダー: GitHub
  • シークレット管理: Secrets Manager
  • ネットワーキングモード: VPC
  • データベース: MySQL

GitHubのソースコードをビルドし、Secrets ManagerからDBの接続情報を取得してアプリケーションを起動します。起動後にEC2からcurlコマンドでリクエストし、DBの値を正しく返せているか確認します。

ソースコードはこちらに格納しています。

環境構築

RDS
App Runnerからのインバウンドリクエストを許可するようSecurity Groupを設定しました。
設定の詳細は割愛します。

Secrets Manager
DBの接続情報を格納します。以下の値を設定しました。

Key Value
DB_PORT 3306
DB_USER <ユーザー名>
DB_PASSWORD <パスワード>
DB_HOSTNAME <DB識別子>.xxxxxxxxxxxx.<region>.rds.amazonaws.com
DB_NAME <データベース名>

IAM Role
カスタム信頼ポリシーを以下のように設定します。

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

Roleには以下の権限をもつPolicyを付与します

{
    "Statement": [
        {
            "Action": "secretsmanager:GetSecretValue",
            "Effect": "Allow",
            "Resource": [
                "arn:aws:secretsmanager:<region>:<account-id>:secret:<secret-name>*"
            ]
        }
    ],
    "Version": "2012-10-17"
}

準備が整いました。実際にデプロイをしていきます。
なお、VPC ConnectorとVPC EndpointはApp Runnerの設定の中で作成していきます。

App Runnerによるデプロイ

ソースコードリポジトリの設定
GitHubからソースコードを取得するように設定します。
 

アプリケーションのビルド・実行コマンドの設定
yamlファイルでも設定可能ですが、今回はコンソールから設定しました。

シークレットの設定
以下のように、具体的なキーを指定して取得します。ECSのタスク定義から取得するときと同じ記法です。

arn:aws:secretsmanager:<region>:<account-id>:secret:<secret-name>-xxxxxx:DB_HOSTNAME::

IAMの設定
先ほど作成したIAM Roleを設定します。

ネットワークの設定
VPC内のリソース(RDS)にアクセスできるようにするため、VPC EndpointとVPC Connectorを作成します。

デプロイ完了しました。

動作確認

curlコマンドを実行すると、無事DBの値を取ることができています。
・Secrets Managerからのシークレットの取得
・VPC内部のリソースへの接続
ができていることが確認できました。


せっかくGitHubからコードを取得しているので、mainブランチにマージされたときに自動デプロイされるかも見てみます。

アプリのmodelを書き換えて、レスポンスにdueフィールドを含めるようにします。

PRをマージするとデプロイが始まります。

デプロイ中はレスポンスにdueは含まれませんが、デプロイが完了するとdueフィールドが含まれていることが分かります。

GitHubのmainリポジトリの更新をトリガーにデプロイを実行できることが確認できました。

まとめと今後の課題

Webアプリがとても簡単にデプロイできました。
今後の課題としては主に以下のようなものがあります。

  • Blue/Greenデプロイを完了させる前にGreenの動作確認ができない
  • ECRのコンテナイメージをデプロイする場合、タグを固定する必要がある(※1)
  • WAFがサポートされていない(※2)

※1 筆者の環境で検証したところ、特定のイメージの特定のタグのアップデート契機に自動デプロイすることしかできず、tag immutabilityと自動デプロイの両立のためにはEventBridge + Lambdaのような追加リソースが必要になりそうです。
※2 2023/02/20現在、Comming Soonになっているのでまもなく実現されそうです!

一部不便なところはあるものの、本番環境への導入も考えられるレベルになってきていると思います。
今後のアップデートに期待したいところです。

RECOMMEND

おすすめ記事一覧