こちらの投稿は2025 Japan AWS Jr.Championsの有志メンバーで作成した『30日間で主要AWSサービスを構築できるようになる』をテーマにした初学者向けのハンズオン問題集のDAY10になります!
問題集の趣旨や作成に至るまでの経緯は以下の記事をご覧いただければと思います。
https://qiita.com/satosato_kozakana/items/446971c2deca7e27d0aa
📝 概要
| 項目 | 内容 |
|---|---|
| 所要時間 | 約1時間 |
| メインサービス | ECS、ECR |
| 学べること | ECR上に構築したコンテナイメージをECS上にデプロイする基礎 |
| 想定費用 | 約10円 (ALBとECSのタスクを1時間起動) |
今回のハンズオンでは放置しておくと費用が発生するため、必ず最後の削除手順まで実行してください
🎯 課題内容
nginxのコンテナイメージを題材に、ECS上にコンテナをデプロイする手順について学びます。
ECRやALBも合わせて触れていきます。
📊 アーキテクチャ図
🔧 実装機能
- AWSコンソールでECRにnginxのコンテナイメージを登録
- AWSコンソールでECSタスクを起動し、ブラウザからnginxにアクセス
💡 実装のヒント
ネットワークの設計について
今回は簡単のため、すべて「パブリックサブネット」に配置することとします。
また、nginxは80番ポートで起動することに注意してください。
解答では、セキュリティグループのインバウンドルールを、HTTP:80への接続を全て許可しています。
余力のある方は、ぜひセキュリティの向上を目指してみてください!
作業環境
ローカルにAWS CLIやDocker CLIがある方はそれを使って良いです。
おすすめは、AWSコンソールから利用できるCloudShellを使う方法です。
ここにはAWS CLIやDocker CLIがデフォルトで用意されており非常に便利です。
✅ 完成後のチェックポイント
- ECRにnginxのイメージが登録されている
- ECSのクラスターが作成されている
- ECSのサービスが作成されている
- ECSのnginx用タスクが起動している
- ALBが起動している
- ALBのDNSを使用して、HTTPでnginxの画面が見られる
🔗 リファレンスリンク
🛠️ 解答・構築手順(クリックで開く)
解答と構築手順を見る
以下、リージョンはap-northeast-1で作業していきます。他リージョンで実行する場合は適宜読み替えてください。
✅ ステップ1:ECR作成
AWSコンソールにて、registryと検索してECRの画面に遷移し、「リポジトリを作成」ボタンを押します。
リポジトリ名は 30days-handson-nginx とします。
その他の設定はデフォルトでOKです。
✅ ステップ2:コンテナイメージをECRにpush
今回は簡単のため、CloudShellを使っていきます。AWSコンソールにてCloudShellと検索して画面遷移し、Open ap-northeast-1 environmentのボタンを押すと以下のようなターミナル画面が出てきます。
ここでコマンドを実行していきますが、ECRの30days-handson-nginxリポジトリに表示されているプッシュコマンドを参考にしていきます(アカウントID部分は伏せています)。
まずECRのリポジトリにpushするための認証を通します。
# アカウントIDはご自身のものに変えてください
aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin <アカウントID>.dkr.ecr.ap-northeast-1.amazonaws.com
次に、今回はイメージをビルドするのではなく、nginx公式のイメージを使います。
# 執筆時のstableのイメージを使用しています
docker pull nginx:1.28.0-bookworm
今取得したイメージにタグを付けます。
# アカウントIDはご自身のものに変えてください
docker tag nginx:1.28.0-bookworm <アカウントID>.dkr.ecr.ap-northeast-1.amazonaws.com/30days-handson-nginx:latest
最後に、ECRのリポジトリにpushします。
# アカウントIDはご自身のものに変えてください
docker push <アカウントID>.dkr.ecr.ap-northeast-1.amazonaws.com/30days-handson-nginx:latest
✅ ステップ3:VPC作成
AWSコンソールでVPCと検索し、VPCを作成画面へ遷移します。
そこで、以下のように設定を変更してください。
- 作成するリソース: VPCなど
- 名前:
30days-handson(デフォルトでは「プロジェクト」となっています) - プライベートサブネットの数: 0
その他はデフォルトで作成します。
✅ ステップ4:ECS作成
AWSコンソールでECS→クラスター→クラスターの作成画面へ移動します。
クラスター名は30days-handson-clusterとし作成します。
(アカウントで初回作成時はエラーになるようですので、その場合は別名で作成し直すか、余裕のある人はCloudFormationから該当のスタックを削除してから作成し直してください。)
作成ができたら、次は「タスク定義」の作成を行います。
ECS画面の左のタブから、タスク定義→新しいタスク定義の作成ボタンを押します。
「タスク定義ファミリー名」は30days-handson-taskdefとします。
下にスクロールし、「コンテナ - 1」のブロックで以下のように設定します。
- 名前:
nginx - イメージURI:
<アカウントID>.dkr.ecr.ap-northeast-1.amazonaws.com/30days-handson-nginx:latest(アカウントIDはご自身のものに変えてください)
その他はデフォルトで作成します。
先程のクラスターの画面に戻り、次にサービスの作成へ進みます。
30days-handson-clusterのリンク→サービスタブ→作成ボタンを押します。
- タスク定義ファミリー:
30days-handson-taskdef - サービス名:
30days-handson-service - ネットワーキング
- VPC:
30days-handson-vpc - セキュリティグループ: 新しいセキュリティグループの作成
- セキュリティグループ名:
30days-handson-ecs-sg - セキュリティグループのインバウンドルール
- タイプ:
HTTP - ソース:
Anywhere
- タイプ:
- セキュリティグループ名:
- VPC:
- ロードバランシング
- ☑ロードバランシングを使用
- ☑新しいロードバランサーの作成
- ロードバランサー名:
30days-handson-alb - ターゲットグループ名:
30days-handson-target
この状態で作成します。
サービスが作成され、以下のように「デプロイとタスク」のゲージが緑色になるまで数分待ちます。
✅ ステップ5:動作確認
EC2→ロードバランサー→30days-handson-albのリンクをクリックします。
画面に「DNS名」という項目があるので、これをコピーします。
ブラウザで、http://<コピーしたALBのDNS名>の形でアクセスし、以下のようにnginxの画面が出ていれば成功です!
🧹 片付け(リソース削除)
まず、クラスターを削除します。
ECS→クラスター→30days-handson-clusterのリンクをクリックし、クラスターの削除ボタンを押します。
一度エラーになりますが再試行ボタンを押すと正常に削除できます。
次にロードバランサーを削除します。
EC2→ロードバランサー→30days-handson-albのリンク→アクション→ロードバランサーの削除ボタンを押します。
同様に、EC2→ターゲットグループ→30days-handson-targetのリンク→アクション→削除ボタンをクリックし、ターゲットグループも削除します。
ECRのリポジトリを削除します。
ECR→Repositoriesタブ→☑30days-handson-nginx→削除ボタンをクリックします。
タスク定義を削除します。
ECS→タスク定義タブ→30days-handson-taskdefのリンク→タスク定義にチェックをつけ、登録解除ボタンをクリック
最後にVPCを削除します。
VPC→お使いのVPCタブ→☑30days-handson-vpc→アクション→VPCの削除ボタンをクリックします。
リソースが残っていて削除できないことがあるので、その場合は数分待ってから再度削除します。
🏁 おつかれさまでした!
この課題では、自身でコンテナイメージを用意し、それをAWS上にデプロイ・公開する方法について学びました。
今回は簡単のために、セキュリティレベルを落とした実装となっています。
より実践的には、今回扱っていない以下の項目にもチャレンジしてみてください。
- ECSとALBのセキュリティグループを修正
- 今回は両者で同じセキュリティグループを共有しています
- ECSはALBからのみアクセス可能になるよう修正してみましょう
- ECSをプライベートサブネットへ移動
- ECSはインターネットから直接アクセスする必要がないので、プライベートサブネットにあるのが望ましいです
- その場合はNAT GatewayやVPCエンドポイントなどの併用も必要です
上記のポイントを加味したアーキテクチャ図のサンプルを紹介して、この課題は終わりにしたいと思います。









