0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【30日でAWSをマスターするハンズオン問題集】Day10:ECSにコンテナをデプロイしよう!

Last updated at Posted at 2025-12-04

こちらの投稿は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のボタンを押すと以下のようなターミナル画面が出てきます。

CloudShellの画面

ここでコマンドを実行していきますが、ECRの30days-handson-nginxリポジトリに表示されているプッシュコマンドを参考にしていきます(アカウントID部分は伏せています)。

ECRのプッシュコマンドの画面

まず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はご自身のものに変えてください)

ECSのタスク定義 コンテナの部分

その他はデフォルトで作成します。


先程のクラスターの画面に戻り、次にサービスの作成へ進みます。

30days-handson-clusterのリンク→サービスタブ→作成ボタンを押します。

  • タスク定義ファミリー: 30days-handson-taskdef
  • サービス名: 30days-handson-service
  • ネットワーキング
    • VPC: 30days-handson-vpc
    • セキュリティグループ: 新しいセキュリティグループの作成
      • セキュリティグループ名: 30days-handson-ecs-sg
      • セキュリティグループのインバウンドルール
        • タイプ: HTTP
        • ソース: Anywhere
  • ロードバランシング
    • ☑ロードバランシングを使用
    • ☑新しいロードバランサーの作成
    • ロードバランサー名: 30days-handson-alb
    • ターゲットグループ名: 30days-handson-target

この状態で作成します。

サービスが作成され、以下のように「デプロイとタスク」のゲージが緑色になるまで数分待ちます。

ECSのタスクが起動された様子

✅ ステップ5:動作確認

EC2ロードバランサー30days-handson-albのリンクをクリックします。

画面に「DNS名」という項目があるので、これをコピーします。

ALBのDNS名が書いてある部分

ブラウザで、http://<コピーしたALBのDNS名>の形でアクセスし、以下のようにnginxの画面が出ていれば成功です!

ブラウザでnginxが表示されたことを確認

🧹 片付け(リソース削除)

まず、クラスターを削除します。

ECSクラスター30days-handson-clusterのリンクをクリックし、クラスターの削除ボタンを押します。

一度エラーになりますが再試行ボタンを押すと正常に削除できます。


次にロードバランサーを削除します。

EC2ロードバランサー30days-handson-albのリンク→アクションロードバランサーの削除ボタンを押します。

同様に、EC2ターゲットグループ30days-handson-targetのリンク→アクション削除ボタンをクリックし、ターゲットグループも削除します。


ECRのリポジトリを削除します。

ECRRepositoriesタブ→☑30days-handson-nginx削除ボタンをクリックします。


タスク定義を削除します。

ECSタスク定義タブ→30days-handson-taskdefのリンク→タスク定義にチェックをつけ、登録解除ボタンをクリック

タスク定義の登録解除画面


最後にVPCを削除します。

VPCお使いのVPCタブ→☑30days-handson-vpcアクションVPCの削除ボタンをクリックします。

リソースが残っていて削除できないことがあるので、その場合は数分待ってから再度削除します。

🏁 おつかれさまでした!

この課題では、自身でコンテナイメージを用意し、それをAWS上にデプロイ・公開する方法について学びました。

今回は簡単のために、セキュリティレベルを落とした実装となっています。

より実践的には、今回扱っていない以下の項目にもチャレンジしてみてください。

  • ECSとALBのセキュリティグループを修正
    • 今回は両者で同じセキュリティグループを共有しています
    • ECSはALBからのみアクセス可能になるよう修正してみましょう
  • ECSをプライベートサブネットへ移動
    • ECSはインターネットから直接アクセスする必要がないので、プライベートサブネットにあるのが望ましいです
    • その場合はNAT GatewayやVPCエンドポイントなどの併用も必要です

上記のポイントを加味したアーキテクチャ図のサンプルを紹介して、この課題は終わりにしたいと思います。

セキュリティ面を改善したアーキテクチャ図

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?