👁

Step6: コンテナ2

このStepでは、AWS でコンテナを運用する方法(ECR・ECS/Fargate など)を学び、Step 5 でコンテナ化した sns-camp-api をコンテナ実行環境で動かします。

1. 講座の履修

コンテナ講座 の以下の章を実施してください。すでに同等の知識がある場合は、講座の履修はスキップしても構いません。

2. 課題の実施

2.1 目的・背景

Step 5 で作成した Dockerfile を活用し、sns-camp-api をコンテナレジストリにプッシュしたうえで、コンテナ実行環境で動かします。Step 1・Step 2 で組み立てた EC2 ベースの構成から、コンテナベースの運用に切り替えることで、可用性・スケーラビリティを保ったままアプリケーションのデプロイ手順をシンプルにすることが目標です。

💡 ポイント
本課題は、要件定義や設計を自分で考えるスキルを高めるため、要件をあえて抽象的に記載しています。進める中で不明点がある場合は、講師への質問 から事前に相談してください。メンタリング当日に「わからなくて進んでいない」状態になると活用できる時間が限られてしまうため、迷ったら途中段階でもこまめに質問を出すことを推奨します。

2.2 実施要件

使用するサンプルアプリケーション

Step 5 で Dockerfile 化した sns-camp-api を使用してください。

データベース

Step 2(クラウド2)で構築した RDS を使用してください。Step 5 では Docker Compose 内の DB コンテナを使いましたが、本 Step ではクラウド上の RDS に接続する形になります。

コンテナレジストリ

sns-camp-api のコンテナイメージをコンテナレジストリにプッシュしてください。

コンテナ実行環境

sns-camp-api をコンテナ実行環境で動作させ、インターネット経由でアクセスできる状態にしてください。

ロードバランサー

ALB(Application Load Balancer)を配置し、インターネットからのトラフィックをコンテナに振り分けてください。ALB のヘルスチェック機能で異常なコンテナを自動的に切り離す構成にしてください。

可用性

一部のコンテナに障害が起きても、継続的に API が応答できるようにしてください。

スケーリング

需要の変動に合わせて、コンテナの数を自動で増減できるようにしてください。目安として、以下の数値要件を満たすようにしてください。

  • 最小コンテナ数: 2
  • 最大コンテナ数: 6
  • スケールアウトの契機: CPU 使用率が 70% を超えたとき
  • スケールインの契機: CPU 使用率が 30% を下回ったとき

フロントエンドのデプロイ(任意)

Step 2 で Amplify や CloudFront + S3 を採用して sns-camp-front を既にデプロイ済みの場合は、そちらを継続して使用してください。まだデプロイしていない場合は、sns-camp-api と同様に sns-camp-front もコンテナ化・レジストリへのプッシュ・コンテナ実行環境へのデプロイを行い、インターネットからアクセスできる状態にしてください。

対象外

本Stepでは、以下は対象外です。これらは後続のStepで扱います。

  • インフラのコード化(Step 7 で実施します)
  • CI/CDパイプラインの構築(Step 8 で実施します)
  • 非機能要件の実装(Step 10〜12 で実施します)

2.3 判定基準

動作確認

デプロイ後の公開 URL に対して、以下の 3 つの curl コマンドで動作を確認してください。

まず sns-camp-api の疎通確認用エンドポイント GET /health を呼び出します。

curl -i https://<公開URL>/health

以下のようなレスポンスが返ります。

HTTP/1.1 200 OK
Content-Type: application/json

{"status": "ok"}

続いて、POST /api/v1/auth/register でユーザを登録し、API 経由で DB に読み書きできることを確認します。

curl -i -X POST https://<公開URL>/api/v1/auth/register \
  -H "Content-Type: application/json" \
  -d '{"username": "yamada", "email": "yamada@example.com", "password": "password123", "display_name": "山田太郎"}'

以下のようなレスポンスが返ります。

HTTP/1.1 201 Created
Content-Type: application/json

{"data": {"token": "eyJ...", "user": {"id": 1, "username": "yamada", ...}}}

最後に、登録レスポンスに含まれる token を使って GET /api/v1/auth/me を呼び出し、登録したユーザ情報を取得できることを確認します。

curl -i https://<公開URL>/api/v1/auth/me \
  -H "Authorization: Bearer <登録レスポンスの token>"

以下のようなレスポンスが返ります。

HTTP/1.1 200 OK
Content-Type: application/json

{"data": {"id": 1, "username": "yamada", "email": "yamada@example.com", "display_name": "山田太郎", ...}}

sns-camp-front も本Stepでコンテナ実行環境にデプロイした場合は、その公開 URL をブラウザで開き、画面が表示されることを確認してください。

机上確認

以下の内容について、実際の設定画面などを確認し、それがわかるスクリーンショットを取得してください。

  • 可用性: 1つのコンテナに障害が起きた場合に、どのように処理が継続されるか
  • スケーリング: 需要が増減した場合にどのようにコンテナの数が増減するか(想定するスケール条件とあわせて)

2.4 課題提出

下記内容を提出フォームより提出してください(提出はプレミアムプランでご利用いただけます)。

項目 内容
概要 今回追加した構成の特徴・採用したサービスを簡潔に記載する
インフラ構成図 Step 5 の構成を発展させたインフラ構成図を画像ファイルとして添付する
動作確認 デプロイ後の URL に対する 3 つの curl コマンドの実行結果を記載する
机上確認 可用性・スケーリングそれぞれの設定がわかる画面のスクリーンショットを添付し、なぜ合格基準を満たしているかを記載する
まとめ 構築中に苦労したこと、工夫したこと、学んだことを記載する

3. メンタリング報告

以下の内容をメンタリングで報告してください(メンタリングはプレミアムプランでご利用いただけます)。

3.1 講座の振り返り

以下の要素それぞれについて、3つの観点で報告してください。

対象の要素

  • コンテナレジストリ
  • コンテナオーケストレーション
  • サーバレスコンテナ実行環境

報告観点

  • 概要
  • 何ができるのか?
  • どんなリスクがあるのか?

3.2 提出課題の説明

提出したインフラ構成図をもとに、以下の内容を報告してください。

  • どのような意図でこの構成にしたのか
  • Step 1・2 の EC2 ベースの構成と比較したメリット・デメリット
  • 構築中に工夫したこと・苦労したこと

4. 構築のヒント

ECS 上のコンテナに RDS 接続情報や API の URL を渡す方法をまとめます。本課題の本質は ECS によるコンテナ運用の理解にあり、環境変数の渡し方のパターンは本質的な学習対象ではないため、自力で調べて進めていただいて構いませんが、詰まった場合は以下のヒントを適宜参考にしてください。

4.1 バックエンド(sns-camp-api)に RDS 接続情報を渡す方法

展開して設定例を表示する

ECS では、.env ファイルを使わず、タスク定義の containerDefinitions に環境変数を直接書く形になります。接続先ホスト名・ポート・ユーザ名・パスワード・DB 名は environment で渡せます。

タスク定義(JSON 形式)での設定例は以下のようになります。

{
  "containerDefinitions": [
    {
      "name": "sns-camp-api",
      "image": "<ECRのイメージURI>",
      "environment": [
        {"name": "DB_HOST", "value": "sns-camp-db.xxxxx.ap-northeast-1.rds.amazonaws.com"},
        {"name": "DB_PORT", "value": "3306"},
        {"name": "DB_USER", "value": "admin"},
        {"name": "DB_PASSWORD", "value": "(RDSのパスワード)"},
        {"name": "DB_NAME", "value": "sns_camp"}
      ]
    }
  ]
}

あわせて、タスクを配置するサブネットから RDS のセキュリティグループへインバウンド(3306)が許可されていることを確認してください。

💡 ポイント
コンテナ講座では扱っていませんが、DB_PASSWORD のような機密情報は AWS Secrets Manager や Systems Manager Parameter Store に保管し、タスク定義の secrets セクションから参照する方法のほうが安全です。本番運用に近づける場合に検討してみてください。

4.2 ECS Service Auto Scaling の設定方法

展開して補足を表示する

コンテナ講座で扱っているのは ターゲット追跡スケーリング で、「ターゲット値(例: CPU 70%)を維持するようにタスク数を自動で増減する」仕組みです。スケールインの契機は、ターゲット値から少し下回った付近(おおよそ 0.9 × ターゲット値)で自動的に発生し、CPU 30% のような閾値を独立に指定することはできません。

実施要件(最小2・最大6、CPU70%でアウト、CPU30%でイン)のように閾値を独立させたい場合は、ステップスケーリング を使い、CloudWatch アラームを 2 つ用意してそれぞれにスケーリングポリシーを紐付けます。マネジメントコンソールの ECS → クラスター → サービス → 「Auto Scaling」タブから設定できます。

4.3 フロントエンド(sns-camp-front)に API の URL を渡す方法

展開して設定例を表示する

sns-camp-front は NEXT_PUBLIC_API_URL でバックエンド API の URL を指定します。この変数は Next.js のビルド時に埋め込まれるため、ECS のタスク定義で環境変数として渡しても反映されません。イメージをビルドする時点で正しい URL を埋め込む 必要があります。

Dockerfile で外部から値を受け取る命令として ARG(ビルド時の変数)と ENV(ビルド中・ランタイム両方で参照できる環境変数)があります。コンテナ講座では扱っていませんが、ARG でビルド時に値を受け取り、ENV でそれをランタイムまで引き継ぐ、という流れで Next.js の環境変数をイメージに焼き込めます。

sns-camp-front の Dockerfile の冒頭に、以下のように ARG と ENV を追記しておきます(Step 5 でコンテナ化済みであれば同じです)。

ARG NEXT_PUBLIC_API_URL
ENV NEXT_PUBLIC_API_URL=$NEXT_PUBLIC_API_URL

ECR にプッシュするイメージをビルドする際に、--build-arg で ALB の公開 URL を渡してください。

docker build \
  --build-arg NEXT_PUBLIC_API_URL=https://<ALBのドメイン>/api/v1 \
  -t sns-camp-front .

ビルド後のイメージを ECR にプッシュして、ECS のタスク定義で参照する形になります。API の URL が変わる場合は、イメージを再ビルドして再デプロイする必要がある点に注意してください。

設計・構築課題の伴走はプレミアムプランでご利用いただけます。

プランのアップグレード

この教材は役に立ちましたか?

いいねをたくさんいただけると、制作者の励みになり、より多くのセクションが作れるようになります。

感想を一言(任意)

いただいたコメントは次の制作のヒントになります。ぜひお気軽にご投稿ください。

このコメントは他の受講生には公開されません。DevOps Camp運営が、教材改善のために確認します。

0 / 2000