0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【AWSコンテナ入門】超初心者がAWS Fargateでhello-worldしてみた!

0
Last updated at Posted at 2025-06-17

まずは 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サーバを作ってみます。

イメージ図はこんな感じです:

Image.jpg

ざっくり流れ

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)はいろんな場所の受け取り先のことで、
誰でも必要な場所(サーバ)で、その箱を開けて中身(アプリ)を使えます。


ハンズオン

構成図

下記の通りの構成で進めていきたいです。
ECS-Webapp.drawio.png

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」
IAM-01.png
ポリシー:「AmazonEC2ContainerRegistryFullAccess」をアタッチ IAM-02.png
ロール名を入力してそのまま作成 IAM-03.png

Step1. EC2サーバを用意する

EC2 = 自分の家と考えてもよいでしょう!

下記手順でEC2を作成しました。

手順内容 参考画像 
EC2 >インスタンス >インスタンスを起動
名前入力:EC2_Test
AMI選択:Amazon Linux 2023 AMI
ec2-01.png
キーペアを選択(新規作成も可)
サブネット:Public Subnet 1a
パブリック IP の自動割り当て:有効化
セキュリティグループ:EC2用セキュリティグループ
ec2-02.png
IAMインスタンスプロフィール:EC2用のIAMロールを選択
それ以外の設定はデフォルトのまま
ec2-03.png

Step2. DockerのインストールとDockerfileを作る

EC2へ接続

EC2用セキュリティグループの設定で、EC2 Instance ConnectサービスからのインバウンドSSHトラフィックをすでに許可済みですので、
インスタンス画面の「接続」ボタンから、EC2 Instance Connectで直接EC2へ接続できます。

ec2-04.png

下記の画面が表示されれば、無事に接続できています。
ec2-05.png

Dockerのインストール

家に“箱詰めマシン(Docker)”を設置しましょう!

下記コマンドでDockerをインストールし、起動します。

Dockerのインストール
sudo yum install -y docker
Dockerの起動
sudo service docker start 
Dockerの自動起動設定
sudo systemctl enable docker
ec2-userをdockerグループに追加
sudo usermod -a -G docker ec2-user 
Dockerのグループ権限の即時反映
sudo newgrp docker

上記のコマンドで、Dockerが使えるようになり、「ec2-user」ユーザーでdockerコマンドが実行できます。

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ファイルの作成

Webページ用フォルダの作成
mkdir src
HTMLファイル用ファイルの作成
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イメージのビルドとコンテナの起動

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サーバの構築ができました。

ec2-06.png

Step4. ECRリポジトリを作成する

AWS上で「コンテナイメージの倉庫(ECR)」を作ります。
EC2で作成したDockerイメージを、ECR(Amazon Elastic Container Registry)にアップロードして、ECSから利用できるようにします。

下記手順でECRを作成しました。

手順内容 参考画像 
ECRの画面で「作成」ボタンを押す ECR-01.png
ECRの名前を入力
その他の設定はデフォルトのまま
ECR-02.png

Step5. イメージをECRにプッシュする

いよいよ荷物(イメージ)をAWS倉庫(ECR)に運びます!
先ほど作成したECRリポジトリに、EC2でビルドしたイメージをPush(アップロード)します。。

下記手順でECRにいメールをPushしました。

手順内容 参考画像 
プッシュコマンドの表示

作成したECRを選択し、「プッシュコマンドの表示」ボタンからPush用コマンドを確認
ECR-03.pngECR-04.png
手順①AWS ECRにログイン

認証トークンを取得し、レジストリへDockerクライアントを認証。

*セキュリティに関するWarningが出ましたが、次の操作に進んで問題ありません
ECR-05.png
手順②Docker イメージを再度構築する

*注意点:このステップはecs_testのディレクトリの配下に実施する必要があります
ECR-06.png
手順③イメージにタグを付ける

この手順で、イメージにECRリポジトリ用の「latest」のタグを付与
ECR-07.png
手順④イメージをプッシュ

タグを付けたイメージをAWSのECR(倉庫)にアップロードする
ECR-08.png
ECRにてPush結果を確認

作成したECRの配下に、「latest」というイメージタグが付いたイメージがあることを確認できる
また、このイメージ名をクリックすると、イメージ専用のURIを確認できる
ECR-09.png
taskdifine-05.png

Step6. ECS(Fargate)でコンテナを起動する

ここまでで、「AWSのいろんな場所で倉庫(ECR)の荷物(イメージ)を開封・利用できる」状態になりました!
今回は、ECSのFargate(サーバーレス)に荷物を送り、常時2個の荷物(タスク=2)が開封されている状態に設定します。

下記、実際のECSにて構築の流れです:

Farget-01.png

「クラスター」「タスク定義」「サービス」「タスク」という用語がありますが、最初は違いが分かりにくいですよね。私はこれらを「宅配便」に例えて覚えています。

例えば、クラスターはAWSの「宅配センター」のようなものです。
タスク定義で「我々がAWSに持ってきた荷物の配達方法(CPUやメモリなど)」を決めた後、サービス作成で「常に2個の荷物が届くようにして!」と宅配センターにお願いしておくイメージです。

タスクは、実際に配達されて各地で開封・利用されている荷物、つまり実際に稼働しているアプリ本体を指します。

クラスター作成

手順内容 参考画像 
Amazon Elastic Container Service > クラスター > 「クラスターの作成」 claster-01.png
クラスター名を入力し、「AWS Fargate(サーバーレス)」を選択
その他の設定はデフォルトのまま
claster-02.png
クラスターが表示されましたら成功 claster-03.png

タスク定義作成

手順内容 参考画像 
Amazon Elastic Container Service > タスク定義 > 「新しいタスク定義の作成」 taskdifine-01.png
タスク定義ファミリーの名前を入力
起動タイプ:AWS Fargate
taskdifine-02.png
タスクサイズについて、今回はコスト削減のため最小のものを
CPU:.25 vCPU、メモリ:.5GB
taskdifine-03.png
タスクロールにいて、アプリがDynamoDBなど他AWSサービスに直接アクセスしないですので不要
タスク実行ロールは、AWS側で作成してくれますのでデフォルトで大丈夫
taskdifine-04.png
ECSが動かす「アプリケーションの箱」(Dockerコンテナ)の名前を入力する

イメージURI欄にECRでPushしたイメージのURIを入力

その他の設定はデフォルト
taskdifine-07.pngtaskdifine-06.png

上記のステップで、タスク定義が正常に作成され、このタスク定義を使用して、サービスをデプロイしたり、タスクを実行したりできます。

サービス作成

いよいよ、ECS上で実際にアプリ(コンテナ)を運用していくための「サービス」を作成します。
サービスは、「どのタスク定義を使って、いくつのコンテナを動かすか」「ALBでどう振り分けるか」などをまとめて管理する役割です。

ここでは、先ほど作成したタスク定義をもとに、Fargate(サーバーレス)で2つのコンテナを常時稼働させ、ALB(ロードバランサー)でアクセスできるように構成します。

手順内容 参考画像 
タスク定義ファミリー:タスク定義作成のステップで作成したものを選択 service-01.png
コンピューティングオプションについては、今回は起動タイプを使用 service-02.png
必要なタスク数:2 service-03.png
今回はパブリックIP持たせるので、パブリックサブネットに置く
ECS用のセキュリティグループを選択し、パブリック IP の自動割り当てをオンにする
service-04.png
ロードバランサー(ALB)をここで新規作成
ロードバランサー名を入力
service-05.png
リスナーとターゲットグループも新規作成。
ターゲットグループ名を入力し、その他の設定はデフォルト
service-06.png

動作確認

サービスの作成・デプロイが完了したら、最後に実際にアプリが正しく動いているか確認しましょう。

手順内容 参考画像 
デプロイがが成功後、「サービス」の数が1になり、サービスをクリックすると、図のように詳細を確認することができる finish-01.png
EC2 >ロードバランサー >ALB の画面にて、作成されたALBの詳細を確認することができる finish-02.png
ECSに紐づくALBのDNS名でアクセスし、「Hello World」画面が表示されれば成功 finish-03.png
起動されたタスクの詳細については、ECS >クラスター >該当のクラスター >タスク の画面にて確認できる finish-04.png
各タスクのパブリックIPからも、「Hello World」画面が表示される finish-05.png

まとめ&今後について

ここまで、AWS ECSを使って「Hello World!」を表示するWebサーバをゼロから構築する流れを紹介しました。

最初は「コンテナって何?」という状態から、
EC2の準備、Dockerによるアプリ作成、ECRへのイメージ登録、
そしてECS(Fargate)とALBを組み合わせて本番さながらの構成まで体験できました!

今後チャレンジしたいこと

今回はシンプルなWebサーバ構成で、他のAWSサービスとは連携しませんでしたが、
今後は「データベースと連携するWebアプリ」や「S3と連携してファイルをアップロード・ダウンロードできる仕組み」などにも挑戦してみたいと思っています。

また、ECSを使って「定期的にジョブを実行する(バッチ処理)」といった使い方にもトライしてみたいです!

これからも、チャレンジした内容をどんどん記事としてアップデートしていく予定ですので、ぜひご期待ください!

0
1
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
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?