AWS App Runner

コンテナイメージまたはソースコードから Web アプリケーションと API を自動的にビルド・デプロイ・スケーリングするフルマネージドサービス

概要

AWS App Runner は、コンテナ化された Web アプリケーションや API を、インフラの知識なしにデプロイ・運用できるフルマネージドサービスです。ECR のコンテナイメージまたは GitHub リポジトリのソースコードを指定するだけで、ビルド、デプロイ、TLS 終端、ロードバランシング、オートスケーリングが自動的に構成されます。トラフィックがゼロのときはインスタンスを最小数まで縮小し、リクエスト増加時に自動でスケールアウトします。

ECS Fargate や Lambda との選定基準

App Runner、ECSFargateLambda はいずれもサーバーレスにコンテナやコードを実行できますが、抽象度と制御性のトレードオフが異なります。App Runner は最も抽象度が高く、VPC 設定、ロードバランサー構成、タスク定義、サービスディスカバリといった概念を一切意識する必要がありません。Web アプリケーションや REST API を素早くデプロイしたい場合に最適です。ECS Fargate は App Runner より制御性が高く、タスク定義でコンテナの CPU/メモリ、サイドカーコンテナ、ボリュームマウント、ヘルスチェックを細かく設定できます。サービスメッシュ (App Mesh)、サービスディスカバリ (Cloud Map)、Blue/Green デプロイ (CodeDeploy 連携) など、本番運用に必要な機能が揃っています。マイクロサービスアーキテクチャや複雑なネットワーク要件がある場合は Fargate を選択します。Lambda はイベント駆動の関数実行に特化しており、HTTP リクエスト以外のトリガー (S3 イベント、SQS メッセージ、スケジュール) にも対応します。ただし実行時間の上限が 15 分で、WebSocket やストリーミングレスポンスには向きません。選定の目安として、シンプルな Web アプリなら App Runner、本格的なマイクロサービスなら Fargate、イベント駆動処理なら Lambda です。

デプロイパイプラインと自動スケーリングの仕組み

App Runner のデプロイソースは、ECR のコンテナイメージと GitHub リポジトリの 2 種類です。ECR ソースでは、イメージの push をトリガーに自動デプロイする設定が可能で、CI/CD パイプラインで ECR にイメージを push するだけでデプロイが完了します。GitHub ソースでは、App Runner がソースコードを自動的にビルドしてデプロイします。Python、Node.js、Java、Go、.NET、Ruby、PHP のランタイムに対応しており、apprunner.yaml でビルドコマンドと起動コマンドを定義します。オートスケーリングは同時リクエスト数に基づいて動作し、1 インスタンスあたりの最大同時リクエスト数 (デフォルト 100) を超えるとスケールアウトします。最小インスタンス数を 1 に設定すると、トラフィックがゼロでも 1 インスタンスが常時稼働するため、コールドスタートを回避できます。最小インスタンス数を 0 にはできないため、完全なゼロスケールが必要な場合は Lambda を検討してください。デプロイ時はローリングアップデートが自動的に行われ、ヘルスチェックに合格した新バージョンにトラフィックが切り替わります。

VPC 接続とプライベートリソースへのアクセス

App Runner はデフォルトでパブリックなエンドポイントを持ちますが、VPC コネクタを設定することで VPC 内のプライベートリソース (RDSElastiCacheDocumentDB など) にアクセスできます。VPC コネクタは App Runner サービスと VPC の間にネットワーク接続を確立し、指定したサブネットとセキュリティグループを通じてプライベートリソースに到達します。注意点として、VPC コネクタを設定すると、App Runner からのアウトバウンド通信はすべて VPC を経由するため、インターネットへのアクセスには NAT Gateway が必要になります。これは追加コストが発生するため、外部 API を呼び出すアプリケーションでは事前にコスト試算が必要です。受信トラフィックについては、App Runner のプライベートエンドポイント機能を使うことで、VPC 内からのみアクセス可能な内部サービスを構築できます。社内向けの管理画面やマイクロサービス間の通信で、インターネットに公開したくないサービスに適しています。料金はプロビジョニングされたインスタンスの vCPU とメモリに対する時間課金で、アクティブなリクエスト処理中は通常料金、アイドル時は低い待機料金が適用されます。

共有するXB!