まずは AWS ECS についての自己勉強
こんにちは!AWS大好き4人チームIJHSのメンバー、sakitsuです。
コンテナ初心者の私が、AWSのECSを使ってWebサーバを構築し、コンテナ入門にチャレンジしてみたいと思います。
そもそもECSとは?
AWSのホームページ「Amazon Elastic Container Service」にはこう書いてあります:
Amazon Elastic Container Service (Amazon ECS) は、
フルマネージドコンテナオーケストレーションサービスであり、コンテナ化されたアプリケーションをより効率的にデプロイ、管理、スケールするのに役立ちます。
つまり簡単に言うと、「コンテナ」という“アプリを入れて運ぶ箱”をAWSで動かすためのサービスです。
手順を押さえれば、初心者でもWebサーバを構築できそうです!
ここでは、ECS上で「Hello World!」と表示する超シンプルなWebサーバを作ってみます。
イメージ図はこんな感じです:
ざっくり流れ
Step1. EC2サーバを用意する
→ AWSで仮想サーバ(EC2)を1台作成します。
Step2. Dockerのインストール
→ 用意したEC2にDockerをインストールし、Dockerイメージ(アプリの箱)を置く場所を作ります。
Step3. アプリ(例:Hello World)とDockerfileを作る
→ EC2上で、Hello Worldなどの簡単なhtmlファイルとDockerfileを用意します。
↑ ここまでは、自宅で荷物(アプリ)を箱(コンテナイメージ)に詰めるイメージです。箱詰めがきちんとできているか(=テスト)もここで確認します。
Step4. ECRリポジトリを作成する
→ AWSコンソール上で、コンテナイメージを保存するためのECRリポジトリを作成します。
Step5. イメージをECRにプッシュ(アップロード)する
→ Dockerコマンドで、作成したイメージをECRにアップロードします。
Step6. ECS(Fargate)でコンテナを起動する
→ AWSでECS(Fargate)の設定を行い、ECRのイメージを使ってWebサーバを動かします。
↑ 上記のステップで、荷物(イメージ)をAWSの倉庫(ECR)に送ります。
ECS(Fargate)はいろんな場所の受け取り先のことで、
誰でも必要な場所(サーバ)で、その箱を開けて中身(アプリ)を使えます。
ハンズオン
構成図
Step0. VPC、サブネットなどのAWS環境準備
自分の家で荷物(アプリ)を整理するために、家の土地を区画整理しましょう!
VPC、サブネットなど
今回は、パブリックサブネットにALBと作業用EC2を置き、プライベートサブネットにWebサーバを配置します。
アベイラビリティゾーン1aと1cに、それぞれパブリックサブネットとプライベートサブネットを作成しました。
| AWSサービス | IP | 備考 |
|---|---|---|
| VPC | 192.168.0.0/16 | |
| Public Subnet 1a | 192.168.10.0/24 | ルートテーブルで外部向け通信は IGW を指定 |
| Public Subnet 1c | 192.168.20.0/24 | ルートテーブルで外部向け通信は IGW を指定 |
| Private Subnet 1a | 192.168.30.0/24 | ルートテーブルで外部向け通信は NAT を指定 |
| Private Subnet 1c | 192.168.40.0/24 | ルートテーブルで外部向け通信は NAT を指定 |
ルートテーブルについて
| ルートテーブル | 送信先 | ターゲット | 備考 |
|---|---|---|---|
| Public Route Table | 0.0.0.0/0 | IGW(インターネットゲートウェイ) | Public Subnetと関連付け |
| Private Route Table | 0.0.0.0/0 | NATゲートウェイ | Private Subnetと関連付け |
セキュリティグループについて
EC2用セキュリティグループ
| ルール | タイプ | プロトコル | ポート範囲 | ソース | 備考 |
|---|---|---|---|---|---|
| インバウンドルール | SSH | TCP | 22 | プレフィックスリスト名: com.amazonaws.ap-northeast-1.ec2-instance-connect | EC2 Instance ConnectのIPアドレス範囲からのSSHを許可 |
| インバウンドルール | HTTP | TCP | 80 | 0.0.0.0/0 | Webサーバ公開テスト用 |
ALB用セキュリティグループ
| ルール | タイプ | プロトコル | ポート範囲 | ソース | 備考 |
|---|---|---|---|---|---|
| インバウンドルール | HTTP | TCP | 80 | 0.0.0.0/0 |
ECS用セキュリティグループ
| ルール | タイプ | プロトコル | ポート範囲 | ソース | 備考 |
|---|---|---|---|---|---|
| インバウンドルール | HTTP | TCP | 80 | 0.0.0.0/0 | |
| インバウンドルール | HTTPS | TCP | 443 | 0.0.0.0/0 |
EC2用のIAMロール
下記手順でEC2用のIAMロールを作成しました。
今回はPublicサブネットにEC2を作成したため、インターネットゲートウェイ(IGW)経由で「ECR」へ直接イメージをPushできます。
もしEC2をプライベートサブネットに置く場合は、別途「VPCエンドポイント」が必要です。
| 手順内容 | 参考画像 |
|---|---|
| IAM>ロール>ロールを作成 信頼されたエンティティタイプ →「AWSのサービス」 ユースケース →「EC2」 |
![]() |
| ポリシー:「AmazonEC2ContainerRegistryFullAccess」をアタッチ | ![]() |
| ロール名を入力してそのまま作成 | ![]() |
Step1. EC2サーバを用意する
EC2 = 自分の家と考えてもよいでしょう!
下記手順でEC2を作成しました。
Step2. DockerのインストールとDockerfileを作る
EC2へ接続
EC2用セキュリティグループの設定で、EC2 Instance ConnectサービスからのインバウンドSSHトラフィックをすでに許可済みですので、
インスタンス画面の「接続」ボタンから、EC2 Instance Connectで直接EC2へ接続できます。
Dockerのインストール
家に“箱詰めマシン(Docker)”を設置しましょう!
下記コマンドでDockerをインストールし、起動します。
sudo yum install -y docker
sudo service docker start
sudo systemctl enable docker
sudo usermod -a -G docker ec2-user
sudo newgrp docker
上記のコマンドで、Dockerが使えるようになり、「ec2-user」ユーザーでdockerコマンドが実行できます。
sudo docker info
Dockerが正常に動いていれば、「Containers」や「Server Version: 25.0.8」などの情報が表示されます。
Step3. アプリ(例:Hello World)とDockerfileを作る
このステップでは、「箱詰めする荷物(Hello Worldアプリ)」と「箱詰め手順書(Dockerfile)」を用意します。
作業用フォルダの作成
まず、作業用ディレクトリを作成します。
ここでは /home/ec2-user 配下に「ecs_test」というフォルダを作成します。
cd /home/ec2-user
mkdir ecs_test
cd ecs_test
Dockerfileの作成
「ecs_test」フォルダ内に「Dockerfile」というファイルを新規作成します。
vi Dockerfile
以下の内容を「Dockerfile」に記載してください。
# 公式nginxイメージをベースに使用
FROM nginx:latest
# 自分のWebページ(後ほど作成するHTMLファイル)をnginxの公開ディレクトリにコピー
COPY ./src /usr/share/nginx/html
HTMLファイルの作成
mkdir src
cd src
vi index.html
下記内容を「index.html」に記載します。
*グラデーション背景とアニメーションを使っていますのでhtmlの内容は若干長いです。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>Hello World</title>
<link href="https://fonts.googleapis.com/css2?family=Orbitron:wght@600&display=swap" rel="stylesheet">
<style>
body {
margin: 0;
padding: 0;
background: linear-gradient(135deg, #6a0dad, #4b0082);
color: white;
font-family: 'Orbitron', sans-serif;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
height: 100vh;
text-align: center;
overflow: hidden;
}
h1 {
font-size: 4em;
margin-bottom: 0.2em;
animation: fadeIn 2s ease-in-out;
}
p {
font-size: 1.5em;
animation: fadeIn 3s ease-in-out;
}
.glow {
text-shadow: 0 0 10px #fff, 0 0 20px #ff00ff, 0 0 30px #ff00ff;
}
@keyframes fadeIn {
from { opacity: 0; transform: translateY(20px); }
to { opacity: 1; transform: translateY(0); }
}
@media (max-width: 600px) {
h1 { font-size: 2.5em; }
p { font-size: 1.2em; }
}
</style>
</head>
<body>
<h1 class="glow">Hello World!</h1>
</body>
</html>
Dockerイメージのビルドとコンテナの起動
cd /home/ec2-user/ecs_test
docker build -t my-nginx-test .
docker run -d -p 80:80 my-nginx-test
アクセス確認
ここで一旦、箱を開けて、外から荷物(アプリ)が見えるかどうかを確認したいです!
この時点で、外部からWebサーバ(アプリ)が正しく見えるか確認します。
http:/// へアクセスし、Hello World画面が表示されればOKです。
動作確認の方法
http://<EC2のPublic IP>/でアクセスし、Webサーバの公開テストができます。
下記画面が表示されましたら、問題なくEC2でWebサーバの構築ができました。
Step4. ECRリポジトリを作成する
AWS上で「コンテナイメージの倉庫(ECR)」を作ります。
EC2で作成したDockerイメージを、ECR(Amazon Elastic Container Registry)にアップロードして、ECSから利用できるようにします。
下記手順でECRを作成しました。
| 手順内容 | 参考画像 |
|---|---|
| ECRの画面で「作成」ボタンを押す | ![]() |
| ECRの名前を入力 その他の設定はデフォルトのまま |
![]() |
Step5. イメージをECRにプッシュする
いよいよ荷物(イメージ)をAWS倉庫(ECR)に運びます!
先ほど作成したECRリポジトリに、EC2でビルドしたイメージをPush(アップロード)します。。
下記手順でECRにいメールをPushしました。
Step6. ECS(Fargate)でコンテナを起動する
ここまでで、「AWSのいろんな場所で倉庫(ECR)の荷物(イメージ)を開封・利用できる」状態になりました!
今回は、ECSのFargate(サーバーレス)に荷物を送り、常時2個の荷物(タスク=2)が開封されている状態に設定します。
下記、実際のECSにて構築の流れです:
「クラスター」「タスク定義」「サービス」「タスク」という用語がありますが、最初は違いが分かりにくいですよね。私はこれらを「宅配便」に例えて覚えています。
例えば、クラスターはAWSの「宅配センター」のようなものです。
タスク定義で「我々がAWSに持ってきた荷物の配達方法(CPUやメモリなど)」を決めた後、サービス作成で「常に2個の荷物が届くようにして!」と宅配センターにお願いしておくイメージです。
タスクは、実際に配達されて各地で開封・利用されている荷物、つまり実際に稼働しているアプリ本体を指します。
クラスター作成
| 手順内容 | 参考画像 |
|---|---|
| Amazon Elastic Container Service > クラスター > 「クラスターの作成」 | ![]() |
| クラスター名を入力し、「AWS Fargate(サーバーレス)」を選択 その他の設定はデフォルトのまま |
![]() |
| クラスターが表示されましたら成功 | ![]() |
タスク定義作成
上記のステップで、タスク定義が正常に作成され、このタスク定義を使用して、サービスをデプロイしたり、タスクを実行したりできます。
サービス作成
いよいよ、ECS上で実際にアプリ(コンテナ)を運用していくための「サービス」を作成します。
サービスは、「どのタスク定義を使って、いくつのコンテナを動かすか」「ALBでどう振り分けるか」などをまとめて管理する役割です。
ここでは、先ほど作成したタスク定義をもとに、Fargate(サーバーレス)で2つのコンテナを常時稼働させ、ALB(ロードバランサー)でアクセスできるように構成します。
動作確認
サービスの作成・デプロイが完了したら、最後に実際にアプリが正しく動いているか確認しましょう。
まとめ&今後について
ここまで、AWS ECSを使って「Hello World!」を表示するWebサーバをゼロから構築する流れを紹介しました。
最初は「コンテナって何?」という状態から、
EC2の準備、Dockerによるアプリ作成、ECRへのイメージ登録、
そしてECS(Fargate)とALBを組み合わせて本番さながらの構成まで体験できました!
今後チャレンジしたいこと
今回はシンプルなWebサーバ構成で、他のAWSサービスとは連携しませんでしたが、
今後は「データベースと連携するWebアプリ」や「S3と連携してファイルをアップロード・ダウンロードできる仕組み」などにも挑戦してみたいと思っています。
また、ECSを使って「定期的にジョブを実行する(バッチ処理)」といった使い方にもトライしてみたいです!
これからも、チャレンジした内容をどんどん記事としてアップデートしていく予定ですので、ぜひご期待ください!









































