はじめに
コンテナアプリケーションをAWSにデプロイする際、ECSやEKSの設定は初学者にとって敷居が高いと感じることがあります。タスク定義、サービス設定、ロードバランサー、ターゲットグループなど、多くのコンポーネントを理解し設定する必要があるためです。
AWS App Runnerは、こうした複雑さを解消するために設計されたフルマネージドサービスです。コンテナイメージまたはソースコードを指定するだけで、数分でWebアプリケーションを公開できます。本記事では、App Runnerの特徴を理解した上で、ECRに保存したコンテナイメージをApp Runnerでデプロイする手順を実践的に解説します。
この記事を読むことで、以下のことができるようになります。
- App RunnerがECSやFargateと異なる点を理解する
- マネジメントコンソールからApp Runnerサービスを作成する
- ECRリポジトリと連携したデプロイを設定する
- 自動デプロイと手動デプロイの使い分けを判断する
App Runnerの概要
App Runnerとは
AWS App Runnerは、Webアプリケーションやapi をコンテナ環境で実行するためのフルマネージドサービスです。2021年5月に一般提供が開始され、インフラストラクチャの専門知識がなくてもコンテナアプリケーションを簡単にデプロイできることを目的としています。
flowchart LR
subgraph Source["ソース"]
GitHub["GitHub<br/>リポジトリ"]
ECR["Amazon ECR<br/>コンテナイメージ"]
end
subgraph AppRunner["AWS App Runner"]
Build["自動ビルド"]
Deploy["自動デプロイ"]
Scale["自動スケーリング"]
LB["ロードバランシング"]
end
subgraph Output["出力"]
URL["HTTPS URL<br/>xxx.awsapprunner.com"]
end
GitHub --> Build
ECR --> Deploy
Build --> Deploy
Deploy --> Scale
Scale --> LB
LB --> URLApp Runnerでは、ソースとして「コンテナイメージ」または「ソースコードリポジトリ」を選択できます。コンテナイメージを選択した場合はECR(またはECR Public)から直接プルしてデプロイします。ソースコードリポジトリを選択した場合は、GitHubと連携してApp Runnerが内部でコンテナイメージをビルドします。
ECSやFargateとの違い
App Runnerは、ECSやFargateよりも高度に抽象化されたサービスです。開発者がインフラを意識せずにアプリケーションのデプロイに集中できるよう設計されています。
| 比較項目 | App Runner | ECS on Fargate | ECS on EC2 |
|---|---|---|---|
| インフラ管理 | 不要 | 最小限 | 必要 |
| ロードバランサー設定 | 自動 | 手動(ALB設定が必要) | 手動 |
| 自動スケーリング | 組み込み済み | 設定が必要 | 設定が必要 |
| ネットワーク設定 | 最小限 | VPC/サブネット設計が必要 | 詳細設計が必要 |
| 学習コスト | 低 | 中 | 高 |
| カスタマイズ性 | 限定的 | 高 | 非常に高 |
| GPUサポート | なし | なし | あり |
App Runnerは「とにかく早くデプロイしたい」「インフラの詳細設定は不要」というユースケースに最適です。一方、細かなネットワーク設計やコンテナ配置の制御が必要な場合は、ECS on Fargateを選択してください。
App Runnerが適しているユースケース
App Runnerは以下のようなケースで特に威力を発揮します。
Webアプリケーションやapi の迅速な公開
プロトタイプや小規模なWebアプリケーションを、インフラの準備に時間をかけずに公開したい場合に最適です。HTTPS対応のURLが自動で発行されるため、すぐにアクセス可能な状態になります。
開発・テスト環境の構築
本番環境はECSで運用しつつ、開発やテスト用の環境をApp Runnerで手軽に立ち上げるパターンも有効です。環境ごとのインフラ設定を省略でき、コストも使用した分だけで済みます。
インフラ専任者がいないチーム
スタートアップやスモールチームで、インフラに詳しいメンバーがいない場合でも、開発者だけでデプロイ環境を構築できます。
App Runnerサービスの作成手順
ここからは、マネジメントコンソールを使ってApp Runnerサービスを作成する手順を解説します。
前提条件
本手順を実行するには、以下の準備が必要です。
- AWSアカウントとマネジメントコンソールへのアクセス権限
- デプロイ対象のコンテナイメージ(ECRにプッシュ済み)
- コンテナイメージがHTTPリクエストを受け付けるポートを公開していること
ECRへのイメージプッシュ手順については、AWS ECRによるコンテナイメージ管理入門を参照してください。
ステップ1: App Runnerサービスの新規作成
マネジメントコンソールにログインし、App Runnerのページに移動します。「サービスを作成」ボタンをクリックして、サービス作成ウィザードを開始します。
flowchart TB
subgraph Step1["ステップ1: ソースとデプロイ"]
Source["ソースタイプ選択"]
Repo["リポジトリ設定"]
DeployConfig["デプロイ設定"]
end
subgraph Step2["ステップ2: ビルド設定"]
Runtime["ランタイム選択"]
BuildCmd["ビルドコマンド"]
StartCmd["起動コマンド"]
end
subgraph Step3["ステップ3: サービス設定"]
Name["サービス名"]
Resource["リソース設定"]
Scaling["スケーリング設定"]
Network["ネットワーク設定"]
end
subgraph Step4["ステップ4: 確認と作成"]
Review["設定確認"]
Create["サービス作成"]
end
Step1 --> Step2
Step2 --> Step3
Step3 --> Step4ステップ2: ソースの設定
「ソースとデプロイ」画面では、ソースタイプとデプロイ設定を行います。
リポジトリタイプ
| タイプ | 説明 |
|---|---|
| コンテナレジストリ | ECRまたはECR Publicからコンテナイメージを取得 |
| ソースコードリポジトリ | GitHubリポジトリからソースコードを取得し、App Runnerがビルド |
本記事では「コンテナレジストリ」を選択してECRからデプロイする手順を解説します。
プロバイダー
「Amazon ECR」を選択します。ECR Publicを使用する場合は「Amazon ECR Public」を選択してください。
コンテナイメージのURI
ECRリポジトリのURIを指定します。形式は以下の通りです。
{アカウントID}.dkr.ecr.{リージョン}.amazonaws.com/{リポジトリ名}:{タグ}
例:
123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/my-web-app:latest
ステップ3: ECRアクセスロールの設定
App RunnerがECRからイメージをプルするには、適切なIAMロールが必要です。
新しいサービスロールを作成する場合
「新しいサービスロールを作成」を選択すると、App Runnerが自動的にAppRunnerECRAccessRoleという名前のIAMロールを作成します。このロールには、ECRからイメージをプルするために必要な最小限の権限が付与されます。
既存のサービスロールを使用する場合
組織のセキュリティポリシーで事前に作成したロールを使用する必要がある場合は、以下の権限を持つIAMロールを用意してください。
|
|
信頼ポリシーでは、App Runnerサービスプリンシパルを許可する必要があります。
|
|
ステップ4: デプロイ設定
デプロイのトリガー方法を選択します。
| 設定 | 説明 | 料金 |
|---|---|---|
| 手動 | コンソール、CLI、APIから手動でデプロイを開始 | 追加料金なし |
| 自動 | ECRへのプッシュを検知して自動デプロイ | 1 USD/月/サービス |
自動デプロイを有効にすると、ECRに新しいイメージがプッシュされるたびにApp Runnerが自動的にデプロイを開始します。CI/CDパイプラインとの連携が容易になりますが、月額1 USDの追加料金が発生します。
開発環境や頻繁にデプロイしないサービスでは「手動」を選択し、本番環境のCI/CDパイプラインでは「自動」を選択するケースが一般的です。
ステップ5: サービスの設定
サービス名
サービスを識別するための名前を入力します。この名前はURLには影響しません。
CPU とメモリ
アプリケーションの要件に応じて、vCPUとメモリの組み合わせを選択します。
| vCPU | 選択可能なメモリ |
|---|---|
| 0.25 | 0.5 GB、1 GB |
| 0.5 | 1 GB |
| 1 | 2 GB、3 GB、4 GB |
| 2 | 4 GB、6 GB |
| 4 | 8 GB、10 GB、12 GB |
最小構成(0.25 vCPU / 0.5 GB)は軽量なapi や開発環境に適しています。本番環境で一定のトラフィックが見込まれる場合は、1 vCPU / 2 GB以上を推奨します。
環境変数
アプリケーションに渡す環境変数を設定できます。データベースの接続情報やAPIキーなど、設定値を外部化する際に使用します。
| 設定方法 | 説明 |
|---|---|
| プレーンテキスト | 値を直接入力(機密情報以外) |
| Secrets Managerから参照 | シークレットのARNを指定(機密情報向け) |
| Systems Manager Parameter Storeから参照 | パラメータのARNを指定 |
機密情報(データベースパスワード、APIキーなど)は、必ずSecrets ManagerまたはParameter Storeを使用してください。
ポート
コンテナがリッスンするポート番号を指定します。デフォルトは8080です。アプリケーションが異なるポートを使用している場合は、ここで変更してください。
ステップ6: 自動スケーリングの設定
App Runnerは、リクエスト数に応じてコンテナインスタンスを自動的にスケールします。
最小インスタンス数
アイドル時でも維持するプロビジョニング済みインスタンスの数です。デフォルトは1です。この値を増やすと、急なトラフィック増加時のレスポンス遅延を軽減できますが、プロビジョニング料金が増加します。
最大インスタンス数
スケールアウト時の上限です。コスト管理のために、適切な上限を設定してください。
最大同時リクエスト数
1つのインスタンスが同時に処理できるリクエスト数です。デフォルトは100です。この値を超えるとスケールアウトがトリガーされます。
flowchart LR
subgraph Requests["リクエスト"]
R1["リクエスト1"]
R2["リクエスト2"]
R3["..."]
R100["リクエスト100"]
R101["リクエスト101"]
end
subgraph Instance1["インスタンス1<br/>(最大同時100)"]
P1["処理中"]
end
subgraph Instance2["インスタンス2<br/>(スケールアウト)"]
P2["処理中"]
end
R1 --> Instance1
R2 --> Instance1
R100 --> Instance1
R101 --> Instance2ステップ7: ネットワーク設定
受信トラフィック
インターネットからアクセス可能な「パブリック」がデフォルトです。内部用途の場合は「プライベート」を選択できます。
送信トラフィック(VPCコネクタ)
App RunnerからVPC内のリソース(RDS、ElastiCacheなど)にアクセスする必要がある場合は、VPCコネクタを設定します。
flowchart LR
subgraph Internet["インターネット"]
User["ユーザー"]
end
subgraph AppRunner["App Runner"]
Service["App Runner<br/>サービス"]
end
subgraph VPC["VPC"]
Connector["VPC<br/>コネクタ"]
RDS["Amazon RDS"]
Cache["ElastiCache"]
end
User --> Service
Service --> Connector
Connector --> RDS
Connector --> CacheVPCコネクタを使用する場合は、事前にApp Runnerコンソールまたはaws cliで作成しておく必要があります。
ステップ8: 確認と作成
設定内容を確認し、「作成とデプロイ」をクリックします。サービスの作成とデプロイには通常2〜5分程度かかります。
デプロイが完了すると、以下の形式のURLが発行されます。
https://{ランダムID}.{リージョン}.awsapprunner.com
このURLにアクセスして、アプリケーションが正常に動作することを確認してください。
ECRとの連携方法
ECRイメージのタグ戦略
App Runnerでは、ECRイメージのタグ指定が重要です。用途に応じて適切なタグ戦略を選択してください。
latestタグを使用する場合
123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/my-app:latest
自動デプロイを有効にしている場合、latestタグへのプッシュで自動的にデプロイが開始されます。開発環境では便利ですが、本番環境では意図しないデプロイのリスクがあります。
バージョンタグを使用する場合
123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/my-app:v1.2.3
バージョン番号やコミットハッシュをタグに使用すると、どのバージョンがデプロイされているか明確になります。ロールバック時にも役立ちます。
イミュータブルタグの活用
ECRリポジトリでイミュータブルタグを有効にすると、一度プッシュしたタグを上書きできなくなります。これにより、v1.0.0タグが指すイメージが変わることを防止できます。
自動デプロイのフロー
ECRプッシュから自動デプロイが完了するまでのフローを示します。
sequenceDiagram
participant Dev as 開発者
participant CI as CI/CD
participant ECR as Amazon ECR
participant AR as App Runner
Dev->>CI: コードをプッシュ
CI->>CI: ビルド & テスト
CI->>ECR: docker push
ECR->>AR: イメージプッシュ通知
AR->>ECR: イメージをプル
AR->>AR: ヘルスチェック
AR->>AR: トラフィック切り替え
Note over AR: デプロイ完了自動デプロイでは、新しいイメージがECRにプッシュされると、App Runnerが自動的にイメージをプルしてデプロイを開始します。ヘルスチェックに成功すると、トラフィックが新しいインスタンスに切り替わります。
クロスアカウントでのECR連携
別のAWSアカウントにあるECRリポジトリからイメージをプルする場合は、追加の設定が必要です。
ECR側(ソースアカウント)の設定
リポジトリポリシーで、App Runnerが動作するアカウントからのアクセスを許可します。
|
|
App Runner側のIAMロール設定
ECRアクセスロールに、クロスアカウントでのイメージプル権限を追加します。
料金とコスト最適化
App Runnerの料金体系
App Runnerの料金は、「プロビジョニング状態」と「アクティブ状態」で異なります。
| 状態 | 課金項目 | 料金(東京リージョン) |
|---|---|---|
| プロビジョニング | メモリのみ | 0.009 USD/GB/時間 |
| アクティブ | vCPU + メモリ | 0.081 USD/vCPU/時間 + 0.009 USD/GB/時間 |
| 自動デプロイ | 月額固定 | 1 USD/サービス/月 |
プロビジョニング状態
アプリケーションがアイドル状態(リクエストを処理していない)のとき、コンテナインスタンスはプロビジョニング状態となります。この状態ではメモリ料金のみ発生し、vCPU料金は発生しません。
アクティブ状態
リクエストを処理しているとき、コンテナインスタンスはアクティブ状態となります。vCPUとメモリの両方に対して課金されます。
料金試算例
例1: 軽量なapi(1日8時間アクティブ、16時間アイドル)
構成: 1 vCPU / 2 GB メモリ
アクティブ時間(8時間/日):
vCPU: 0.081 USD × 1 vCPU × 8h = 0.648 USD
メモリ: 0.009 USD × 2 GB × 8h = 0.144 USD
プロビジョニング時間(16時間/日):
メモリ: 0.009 USD × 2 GB × 16h = 0.288 USD
1日あたり: 約1.08 USD
1ヶ月(30日): 約32.4 USD
例2: 開発環境(1日2時間アクティブ、22時間アイドル)
構成: 0.25 vCPU / 0.5 GB メモリ
アクティブ時間(2時間/日):
vCPU: 0.081 USD × 0.25 vCPU × 2h = 0.041 USD
メモリ: 0.009 USD × 0.5 GB × 2h = 0.009 USD
プロビジョニング時間(22時間/日):
メモリ: 0.009 USD × 0.5 GB × 22h = 0.099 USD
1日あたり: 約0.15 USD
1ヶ月(30日): 約4.5 USD
コスト最適化のポイント
サービスの一時停止
使用していない時間帯が長い場合は、コンソールやCLIからサービスを一時停止できます。一時停止中は料金が発生しません。
|
|
適切なリソースサイジング
アプリケーションの実際の使用量を監視し、過剰なリソース設定を避けてください。CloudWatchメトリクスでCPU使用率とメモリ使用率を確認できます。
最大インスタンス数の制限
予期しないトラフィック増加による料金増加を防ぐため、最大インスタンス数に適切な上限を設定してください。
トラブルシューティング
デプロイが失敗する場合
イメージプルエラー
ECRアクセスロールに適切な権限が付与されているか確認してください。ロールの信頼ポリシーでbuild.apprunner.amazonaws.comが許可されている必要があります。
ヘルスチェック失敗
コンテナが指定されたポートでHTTPリクエストを受け付けているか確認してください。App Runnerは/パスに対してヘルスチェックを実行します。アプリケーションの起動に時間がかかる場合は、ヘルスチェックの猶予期間を延長してください。
アプリケーションが応答しない場合
ポート設定の確認
App Runnerの設定で指定したポートと、コンテナ内でアプリケーションがリッスンしているポートが一致しているか確認してください。
ログの確認
CloudWatch Logsでアプリケーションログを確認できます。App Runnerサービスの詳細画面から「ログ」タブにアクセスしてください。
VPC内リソースに接続できない場合
VPCコネクタの設定を確認してください。
- VPCコネクタが正しいサブネットに関連付けられているか
- セキュリティグループでApp Runnerからの接続が許可されているか
- RDSなどのターゲットリソースのセキュリティグループ設定
まとめ
AWS App Runnerは、コンテナアプリケーションを最小限の設定で迅速にデプロイできるフルマネージドサービスです。本記事では以下のポイントを解説しました。
- App RunnerはECSやFargateよりも抽象化されたサービスで、ロードバランサーや自動スケーリングが組み込まれている
- ECRからのイメージデプロイには、適切なIAMロール設定が必要
- 自動デプロイを有効にすると、ECRへのプッシュで自動的にデプロイが開始される
- 料金は「プロビジョニング状態」と「アクティブ状態」で異なり、アイドル時はメモリ料金のみ
シンプルなWebアプリケーションやapiを素早く公開したい場合、App Runnerは最適な選択肢です。一方、細かなネットワーク設計やコンテナ配置の制御が必要な場合は、ECS on Fargateを検討してください。