Day 29: 卒業試験!実際にサービスをデプロイし、トラブルシューティングしてみよう 🎓
皆さん、こんにちは!30日集中講座、Day 29へようこそ。
いよいよ最終章です。これまでの28日間で、皆さんはDockerの基本から、CI/CD、セキュリティ、そしてAWSのECS/EKSを使ったコンテナオーケストレーションまで、モダンなアプリケーション開発に必要な知識を網羅的に習得しました。
今日は、その集大成として「卒業試験」に挑戦します。これまでの学びを総動員して、実際に簡単なアプリケーションをデプロイし、意図的に仕組まれたトラブルを自力で解決してみましょう。この挑戦を乗り越えれば、皆さんのスキルは「知識」から「現場で通用する実践的な力」へと進化します。
1. 試験の概要
試験は、以下の3つのステップで構成されます。
- 環境構築: Day 6で作成したPythonアプリケーションを、AWS ECRとECS on Fargateにデプロイします。
- トラブルシューティング: デプロイ中に発生する(ように設定された)エラーを、自力で解決します。
- 高可用性の検証: 複数のタスクを起動し、サービスが正しく機能していることを確認します。
試験に必要なファイルは、Day 6で作成したアプリケーションと、これまでの講座で学んだコマンドです。
2. 事前準備
まず、必要な環境を整えましょう。
前提条件
- AWS CLIが設定済み
- Dockerがインストール済み
- 適切なIAMポリシーが設定されたAWSアカウント
必要なIAMポリシー
以下のポリシーがアタッチされたIAMユーザーまたはロールが必要です:
AmazonECS_FullAccess
AmazonEC2ContainerRegistryFullAccess
CloudWatchLogsFullAccess
3. 卒業試験:ステップ・バイ・ステップ
ステップ1: ローカルでの準備
アプリケーションのコードをGitHubからローカルにクローンし、Dockerイメージをビルドします。
# GitHubからコードをクローン
git clone https://github.com/your-username/my-web-app.git
cd my-web-app
# Dockerイメージをビルド
docker build -t my-web-app:v1.0.0 .
# ローカルでのテスト実行(オプション)
docker run -d -p 5000:5000 my-web-app:v1.0.0
ステップ2: ECRリポジトリの作成とイメージプッシュ
AWS CLIを使ってECRリポジトリを作成し、ビルドしたイメージをプッシュします。
# ECRリポジトリを作成
aws ecr create-repository --repository-name my-web-app --region ap-northeast-1
# アカウントIDを取得
ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)
ECR_URI="$ACCOUNT_ID.dkr.ecr.ap-northeast-1.amazonaws.com"
# ECRにログイン
aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin $ECR_URI
# イメージにタグを付け、プッシュ
docker tag my-web-app:v1.0.0 $ECR_URI/my-web-app:v1.0.0
docker push $ECR_URI/my-web-app:v1.0.0
ステップ3: ECSへのデプロイ
ECSコンソールを使って、以下の設定でサービスをデプロイします。
⚠️ 注意: ここでは、意図的にいくつか不正確な設定をします。エラーが発生したら、皆さんの出番です。
タスク定義の設定
-
イメージ:
my-web-app:latest
(注意:v1.0.0
タグをプッシュしましたが、ここではlatest
タグを指定) -
ポートマッピング: コンテナポート
5000
、ホストポート5000
- CPU/メモリ: 0.25 vCPU / 512 MiB
- ログ設定: CloudWatch Logsを有効にする
サービスの設定
-
必要なタスク数:
1
- VPC: デフォルトVPC
- サブネット: プライベートサブネットのみ選択 (問題の原因となる設定)
- パブリックIPの自動割り当て: 無効 (問題の原因となる設定)
- セキュリティグループ: ポート5000を許可
4. トラブルシューティングの課題
デプロイを開始すると、以下の2つの問題に直面するはずです。
課題1: タスクが STOPPED
になる
デプロイを開始すると、タスクがPENDING
からRUNNING
にならず、すぐにSTOPPED
になってしまいます。
解決のヒント
- CloudWatch Logsでコンテナのログを確認しましょう
- ECSがECRからイメージを正常に取得できたかを確認しましょう
-
タスク定義
で指定したイメージ
のタグが存在するかを再確認しましょう
解決方法
# ECRにプッシュされているイメージタグを確認
aws ecr describe-images --repository-name my-web-app --region ap-northeast-1
# タスク定義でイメージURIを正しく設定
# 正しい形式: <ACCOUNT_ID>.dkr.ecr.ap-northeast-1.amazonaws.com/my-web-app:v1.0.0
課題2: アプリケーションにアクセスできない
最初の課題を解決し、タスクが正常にRUNNING
になっても、外部からアプリケーションにアクセスできません。
解決のヒント
- タスクにパブリックIPが割り当てられているか確認しましょう
- VPCのネットワーク構成を見直しましょう。特に、コンテナがインターネットに接続できるかどうかが鍵です
-
サービス
のネットワーク設定を見直しましょう
解決方法
サブネット設定を見直し、以下のいずれかの方法を選択します:
方法1: パブリックサブネット + パブリックIP有効
- サブネット: パブリックサブネットを選択
- パブリックIPの自動割り当て: 有効
方法2: Application Load Balancer (ALB) を使用
- ALBを作成してパブリックサブネットに配置
- プライベートサブネットのタスクをALBのターゲットグループに登録
5. 高可用性の検証
すべての問題を解決し、アプリケーションにアクセスできるようになったら、サービス
の必要なタスク数
を**2
**に変更し、タスクが2つ起動することを確認しましょう。
# ECS CLIでタスク数を更新(オプション)
aws ecs update-service \
--cluster default \
--service my-web-app-service \
--desired-count 2 \
--region ap-northeast-1
これにより、サービスが冗長化され、1つのタスクが停止しても別のタスクがリクエストを処理できることを確認できます。
6. セキュリティのベストプラクティス
実際の本番環境では、以下の点も考慮しましょう:
- 最小権限の原則: タスクロールには必要最小限のIAMポリシーを付与
- シークレット管理: AWS Systems Manager Parameter StoreやAWS Secrets Managerを使用
- ネットワーク分離: プライベートサブネット + ALBの構成を推奨
- セキュリティグループ: 必要なポートのみを開放
7. トラブルシューティングのチェックリスト
今後同様の問題に遭遇した際は、以下のチェックリストを活用してください:
イメージ関連
- ECRリポジトリにイメージがプッシュされているか
- タスク定義のイメージURIが正しいか
- 指定したタグが存在するか
ネットワーク関連
- サブネットの種類(パブリック/プライベート)
- パブリックIPの割り当て設定
- セキュリティグループのルール
- NATゲートウェイの設定(プライベートサブネットの場合)
ログとモニタリング
- CloudWatch Logsでエラーメッセージを確認
- ECSコンソールでタスクの状態を確認
- CloudTrailでAPI呼び出しの記録を確認
8. まとめ:卒業と次のステップ
卒業試験、お疲れ様でした!この試験を通して、皆さんは以下のスキルを実践的に証明できたはずです:
- コンテナのデプロイメント: ECRからECSへのイメージプッシュとデプロイ
- トラブルシューティング: ログやネットワーク設定から問題の原因を特定する能力
- 高可用性の構築: 複数タスクによるサービス冗長化
- AWS環境での実践的な問題解決: 現場で遭遇する典型的な問題への対処法
これらのスキルは、実際の開発現場で必ず役に立ちます。今後も継続的な学習を続け、より高度なアーキテクチャパターンやDevOpsプラクティスにも挑戦してみてください。
次回の予告
Day 30: 30日講座の振り返りとキャリアアップへの道
それでは、また明日お会いしましょう!