はじめに
クラウドネイティブな環境でアプリケーションをデプロイする際、インフラストラクチャの設定や管理は大きな負担となることがあります。特に、コンテナ化されたアプリケーションを本番環境で運用するためには、コンテナオーケストレーション、ネットワーキング、セキュリティ、スケーリングなど多くの側面を考慮する必要があります。
AWS App Runnerは、そんな課題を解決するために2021年5月にAWSが発表した比較的新しいサービスです。この記事では、AWS App Runnerの概要、主な特徴、利用シナリオ、そして実際のデプロイ手順について詳しく解説します。
AWS App Runnerとは
AWS App Runnerは、コードやコンテナイメージから直接、スケーラブルで安全なWebアプリケーションをAWS上に素早くデプロイできるフルマネージドサービスです。開発者はインフラストラクチャの知識がなくても、数クリックまたは数行のコマンドでアプリケーションを本番環境にデプロイできます。
App Runnerの大きな特徴は、コンテナの構築からデプロイ、負荷分散、スケーリング、トラフィック暗号化に至るまで、すべてのインフラストラクチャを自動的に管理してくれることです。デベロッパーはアプリケーションコードに集中し、インフラストラクチャの詳細に悩む必要がありません。
AWS App Runnerの主な特徴
1. シンプルな開発者体験
- コンソールからワンクリックデプロイ: AWSマネジメントコンソールから数クリックでデプロイ可能
- CLIサポート: AWS CLIを使用した自動化にも対応
- ソースコードまたはコンテナイメージから直接デプロイ: GitHubリポジトリやECRコンテナイメージを直接指定可能
2. フルマネージドインフラストラクチャ
- 自動プロビジョニング: 必要なインフラストラクチャを自動的に構築
- 自動スケーリング: トラフィックに応じて自動的にスケールアップ/ダウン
- 高可用性: 複数のアベイラビリティゾーンにわたる冗長構成
- ロードバランシング: インバウンドトラフィックの自動分散
3. セキュリティと接続性
- HTTPS対応: デフォルトでHTTPS通信を有効化
- VPC接続: プライベートVPCリソースへの安全なアクセス
- IAM統合: きめ細かいアクセス制御
4. 継続的デリバリーの自動化
- ソースリポジトリとの連携: コード変更時の自動デプロイ
- コンテナレジストリとの統合: イメージ更新時の自動デプロイ
5. 運用の可視性
- ログ統合: CloudWatch Logsとの統合
- モニタリング: リアルタイムメトリクスの確認
- ヘルスチェック: アプリケーションの状態監視
AWS App Runnerと他のAWSサービスとの比較
AWS App Runnerを適切に利用するためには、他のAWSコンテナサービスとの違いを理解することが重要です。
サービス | 主な用途 | 複雑さ | 柔軟性 | 管理負荷 |
---|---|---|---|---|
App Runner | シンプルなWebアプリケーション | 低 | 中 | 最小 |
ECS/Fargate | 複雑なコンテナアプリケーション | 中 | 高 | 低~中 |
EKS | 大規模なKubernetesワークロード | 高 | 最高 | 中~高 |
Elastic Beanstalk | 様々なタイプのアプリケーション | 中 | 中 | 中 |
Lambda | サーバーレス関数 | 低 | 中 | 最小 |
App Runnerは、ECSやEKSほどの細かい設定はできませんが、その分シンプルでデプロイが容易です。Lambdaよりも長時間実行されるWebアプリケーションに適しており、Elastic Beanstalkよりもコンテナに特化しています。
AWS App Runnerの料金体系
App Runnerの料金は主に以下の2つの要素で構成されています:
- 計算料金: アプリケーションが実行されている間の仮想CPUとメモリの使用量
- プロビジョンドインスタンス料金: アイドル状態でもアプリケーションを利用可能にする場合の追加料金
料金は使用したリソースに応じて課金され、リージョンによって異なります。例えば、東京リージョン(ap-northeast-1)では、1 vCPUあたり約$0.064/時間、1GBメモリあたり約$0.007/時間という料金体系となっています(2023年時点、正確な料金はAWS公式サイトで確認してください)。
自動スケーリングを有効にすると、トラフィックがない時間はコストを削減できます。ただし、アプリケーションの起動には数秒から数十秒かかる場合があります。
Docker イメージを AWS App Runner にデプロイする手順
では、実際にDocker イメージをAWS App Runnerにデプロイする手順を見ていきましょう。
前提条件
- AWSアカウント
- Docker イメージ(Amazon ECRまたは公開リポジトリに格納されたもの)
- AWSコンソールへのアクセス権限
手順1: Amazon ECRへのイメージプッシュ(必要な場合)
まず、プライベートイメージを使用する場合は、Amazon ECRにプッシュします。
# ECRリポジトリの作成
aws ecr create-repository --repository-name my-app-runner-app
# ECRへのログイン
aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin <YOUR_AWS_ACCOUNT_ID>.dkr.ecr.ap-northeast-1.amazonaws.com
# イメージのタグ付け
docker tag my-app:latest <YOUR_AWS_ACCOUNT_ID>.dkr.ecr.ap-northeast-1.amazonaws.com/my-app-runner-app:latest
# イメージのプッシュ
docker push <YOUR_AWS_ACCOUNT_ID>.dkr.ecr.ap-northeast-1.amazonaws.com/my-app-runner-app:latest
手順2: App Runnerサービスの作成
AWSコンソールを使用する場合:
- AWSマネジメントコンソールにログインし、「App Runner」サービスに移動します
- 「Create service」ボタンをクリックします
- 「Source and deployment」セクションで以下を設定します:
- ソースタイプ: 「Container registry」を選択
- プロバイダー: 「Amazon ECR」を選択
- コンテナイメージURI: 先ほどプッシュしたイメージのURIを入力
- デプロイメント設定: 「Manual」または「Automatic」を選択
- 「Service settings」セクションで以下を設定します:
- サービス名: わかりやすい名前を入力
- ポート: コンテナが公開するポート番号(通常は80や8080)
- CPU: アプリケーションに必要なCPU量
- メモリ: アプリケーションに必要なメモリ量
- 「Auto scaling」セクションで自動スケーリングの設定を行います
- 最後に「Create & deploy」ボタンをクリックします
AWS CLIを使用する場合:
aws apprunner create-service --service-name my-app-runner-service \
--source-configuration '{ \
"ImageRepository": { \
"ImageIdentifier": "<YOUR_AWS_ACCOUNT_ID>.dkr.ecr.ap-northeast-1.amazonaws.com/my-app-runner-app:latest", \
"ImageConfiguration": { "Port": "8080" }, \
"ImageRepositoryType": "ECR" \
}, \
"AutoDeploymentsEnabled": false, \
"AuthenticationConfiguration": { \
"AccessRoleArn": "arn:aws:iam::<YOUR_AWS_ACCOUNT_ID>:role/AppRunnerECRAccessRole" \
} \
}' \
--instance-configuration '{ \
"Cpu": "1 vCPU", \
"Memory": "2 GB" \
}' \
--tags Key=Environment,Value=Development
手順3: サービスの確認
デプロイが完了すると、App Runnerコンソールにサービスのステータスが表示されます。「Running」ステータスになれば、自動的に作成されたドメイン名を通じてアプリケーションにアクセスできます。
https://<service-id>.ap-northeast-1.awsapprunner.com
App Runnerのベストプラクティス
1. 効率的なDockerイメージ作成
- マルチステージビルド: 最終イメージを軽量化
- 軽量ベースイメージ: Alpine Linuxなどの軽量イメージを使用
- キャッシュの最適化: レイヤー順序を工夫
# マルチステージビルドの例
FROM node:16-alpine AS build
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
FROM node:16-alpine
WORKDIR /app
COPY --from=build /app/dist ./dist
COPY --from=build /app/node_modules ./node_modules
COPY package*.json ./
EXPOSE 8080
CMD ["npm", "start"]
2. 環境変数の活用
App Runnerでは、環境変数を使用してアプリケーション設定を外部化できます。機密情報はSSM Parameter StoreやSecrets Managerに保存することをお勧めします。
aws apprunner update-service --service-arn <YOUR_SERVICE_ARN> \
--source-configuration '{ \
"ImageRepository": { \
"ImageIdentifier": "<YOUR_IMAGE_URI>", \
"ImageConfiguration": { \
"Port": "8080", \
"RuntimeEnvironmentVariables": { \
"NODE_ENV": "production", \
"API_URL": "https://api.example.com" \
} \
} \
} \
}'
3. ヘルスチェックの設定
アプリケーションの状態を適切に監視するために、ヘルスチェックエンドポイントを実装しましょう。
aws apprunner update-service --service-arn <YOUR_SERVICE_ARN> \
--health-check-configuration '{ \
"Protocol": "HTTP", \
"Path": "/health", \
"Interval": 10, \
"Timeout": 5, \
"HealthyThreshold": 3, \
"UnhealthyThreshold": 3 \
}'
4. 自動スケーリングの最適化
トラフィックパターンに応じて自動スケーリングを設定します。
aws apprunner update-service --service-arn <YOUR_SERVICE_ARN> \
--auto-scaling-configuration-arn <YOUR_AUTO_SCALING_CONFIG_ARN>
よくある課題とトラブルシューティング
1. デプロイの失敗
- イメージアクセス権限: ECRアクセスロールが正しく設定されているか確認
- イメージビルドエラー: Dockerfileの問題を確認
- リソース不足: CPUやメモリの設定を見直す
2. アプリケーションの起動失敗
- ポート設定: App RunnerとDockerコンテナで公開ポートが一致しているか確認
- 環境変数: 必要な環境変数がすべて設定されているか確認
- ヘルスチェック: ヘルスチェックエンドポイントが正しく応答しているか確認
3. ネットワーク接続の問題
- VPC接続: VPC Connectorの設定を確認
- セキュリティグループ: アウトバウンドルールが適切に設定されているか確認
- プライベートリソースアクセス: IAM権限を確認
実際のユースケース
1. マイクロサービスのデプロイ
小規模なマイクロサービスを個別にデプロイし、各サービスが独自にスケールできるようにします。App Runnerの自動スケーリング機能により、各サービスは独自のトラフィックパターンに応じて適切にスケールします。
2. Webアプリケーションのホスティング
ReactやVue.jsなどのフロントエンドアプリケーションを、Nginxコンテナを使ってホスティングします。App Runnerのグローバルエッジネットワークを活用して、低レイテンシーでコンテンツを提供できます。
3. APIバックエンドのデプロイ
Node.js、Python、RubyなどのAPIバックエンドをコンテナ化してデプロイします。App Runnerは、トラフィックの増加に応じて自動的にスケールし、APIの可用性を確保します。
結論
AWS App Runnerは、Dockerコンテナのデプロイと運用を劇的に簡素化するサービスです。インフラストラクチャの詳細を気にすることなく、アプリケーションの開発に集中できるようになります。
特に以下のような場合にApp Runnerの使用を検討すると良いでしょう:
- インフラストラクチャの管理より、アプリケーション開発に集中したい場合
- シンプルなWebアプリケーションやAPIをすばやくデプロイしたい場合
- コンテナオーケストレーションの複雑さを避けたい場合
- 自動スケーリングと高可用性を簡単に実現したい場合
AWS App Runnerを活用することで、開発チームの生産性向上、運用コストの削減、市場投入までの時間短縮が期待できます。ぜひ、あなたの次のプロジェクトでAWS App Runnerを試してみてください。
コメント