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


# まずは AWS ECS についての自己勉強
こんにちは！AWS大好き4人チームIJHSのメンバー、sakitsuです。
コンテナ初心者の私が、AWSのECSを使ってWebサーバを構築し、コンテナ入門にチャレンジしてみたいと思います。

**そもそもECSとは？**
AWSのホームページ「[Amazon Elastic Container Service](https://aws.amazon.com/jp/ecs/)」にはこう書いてあります：
> Amazon Elastic Container Service (Amazon ECS) は、
フルマネージドコンテナオーケストレーションサービスであり、コンテナ化されたアプリケーションをより効率的にデプロイ、管理、スケールするのに役立ちます。

つまり簡単に言うと、「コンテナ」という“アプリを入れて運ぶ箱”をAWSで動かすためのサービスです。
手順を押さえれば、初心者でもWebサーバを構築できそうです！

ここでは、ECS上で「Hello World!」と表示する超シンプルなWebサーバを作ってみます。

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

![Image.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3673885/55502794-0faf-426f-9f66-cacc0bc3d009.jpeg)



# ざっくり流れ

**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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3673885/ecb00b84-dee0-4f47-8d57-ba05baa2e897.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/16   | ルートテーブルで外部向け通信は IGW を指定|
| Public Subnet 1c     | 192.168.20.0/16   | ルートテーブルで外部向け通信は IGW を指定|
| Private Subnet 1a    | 192.168.30.0/16   | ルートテーブルで外部向け通信は NAT を指定|
| Private Subnet 1c    | 192.168.40.0/16   | ルートテーブルで外部向け通信は 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＞ロール＞ロールを作成<br>信頼されたエンティティタイプ →「AWSのサービス」<br>ユースケース →「EC2」|![IAM-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3673885/97a53c54-22d5-4dcd-b334-b91f833a1afc.png)
|ポリシー：「AmazonEC2ContainerRegistryFullAccess」をアタッチ|![IAM-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3673885/96d25c93-7ad5-4a61-8778-fb21a75806fd.png)
|ロール名を入力してそのまま作成|![IAM-03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3673885/6282a0c9-6164-4ae1-a6ed-40a77c97a250.png)|

  ## Step1. EC2サーバを用意する
  EC2 = 自分の家と考えてもよいでしょう！
  
下記手順でEC2を作成しました。
| 手順内容                          | 参考画像　                                      |
|:---------------------------------|:------------------------------------------------|
|EC2 ＞インスタンス ＞インスタンスを起動<br>名前入力：EC2_Test<br>AMI選択：Amazon Linux 2023 AMI |![ec2-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3673885/71969a9b-f9f4-4f61-b097-1201dc889467.png)
|キーペアを選択（新規作成も可）<br>サブネット：Public Subnet 1a<br>パブリック IP の自動割り当て：有効化<br>セキュリティグループ：EC2用セキュリティグループ|![ec2-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3673885/ad3e08a6-1194-4288-bfb6-52e32ae7c2d0.png)|
|IAMインスタンスプロフィール：EC2用のIAMロールを選択<br>それ以外の設定はデフォルトのまま|![ec2-03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3673885/9200b18b-875b-45bf-a510-5f1e7d2d2a46.png)|

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

![ec2-04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3673885/9a3c696f-606f-47f5-80a4-b492ec68c435.png)

下記の画面が表示されれば、無事に接続できています。
![ec2-05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3673885/861e8206-bb39-473e-88a9-daa93b1a4ca4.png)


 ### Dockerのインストール
家に“箱詰めマシン（Docker）”を設置しましょう！

下記コマンドでDockerをインストールし、起動します。
 ```ruby:Dockerのインストール
sudo yum install -y docker
```
 ```ruby:Dockerの起動
sudo service docker start 
 ```
  ```ruby:Dockerの自動起動設定
 sudo systemctl enable docker
  ```
 ```ruby:ec2-userをdockerグループに追加
sudo usermod -a -G docker ec2-user 
 ```

```ruby:Dockerのグループ権限の即時反映
sudo newgrp docker
```
 
 上記のコマンドで、Dockerが使えるようになり、「ec2-user」ユーザーでdockerコマンドが実行できます。
 ```ruby: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ファイルの作成
 ```ruby:Webページ用フォルダの作成
mkdir src
 ```
 ```ruby: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イメージのビルドとコンテナの起動
 ```ruby:Dockerイメージのビルド
cd /home/ec2-user/ecs_test
docker build -t my-nginx-test .
 ```
 ```ruby:コンテナの起動（ポート公開）
 docker run -d -p 80:80 my-nginx-test
 ```


### アクセス確認
ここで一旦、箱を開けて、外から荷物（アプリ）が見えるかどうかを確認したいです！
この時点で、外部からWebサーバ（アプリ）が正しく見えるか確認します。
http://<EC2のPublic IP>/ へアクセスし、Hello World画面が表示されればOKです。

**動作確認の方法**
http://\<EC2のPublic IP>/でアクセスし、Webサーバの公開テストができます。

下記画面が表示されましたら、問題なくEC2でWebサーバの構築ができました。

![ec2-06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3673885/febdc0e6-8809-4ec9-8957-559b0de81544.png)


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

下記手順でECRを作成しました。
| 手順内容                          | 参考画像　                                      |
|:---------------------------------|:------------------------------------------------|
|ECRの画面で「作成」ボタンを押す|![ECR-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3673885/b0da850a-5bfa-4ff4-8719-bf5392a857b2.png)|
|ECRの名前を入力<br>その他の設定はデフォルトのまま|![ECR-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3673885/12ce2765-a40c-45fa-a3fe-ab29bc811b40.png)|
 
 ## Step5. イメージをECRにプッシュする
いよいよ荷物（イメージ）をAWS倉庫（ECR）に運びます！
先ほど作成したECRリポジトリに、EC2でビルドしたイメージをPush（アップロード）します。。

 下記手順でECRにいメールをPushしました。
| 手順内容                          | 参考画像　                                      |
|:---------------------------------|:------------------------------------------------|
|**プッシュコマンドの表示**<br><br>作成したECRを選択し、「プッシュコマンドの表示」ボタンからPush用コマンドを確認|![ECR-03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3673885/b26788a2-c003-40dd-aac3-155630f3a556.png)![ECR-04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3673885/7bf12404-8e20-42d6-b41a-47fdff3504be.png)|
|**手順①AWS ECRにログイン**<br><br>認証トークンを取得し、レジストリへDockerクライアントを認証。<br><br>*セキュリティに関するWarningが出ましたが、次の操作に進んで問題ありません|![ECR-05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3673885/d38ea03b-e8b5-4fdc-b7b9-93b8ca7fe8b6.png)|
|**手順②Docker イメージを再度構築する**<br><br>*注意点：このステップはecs_testのディレクトリの配下に実施する必要があります|![ECR-06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3673885/802d3169-a957-4baf-a5f1-9b5a00adb6de.png)|
|**手順③イメージにタグを付ける**<br><br>この手順で、イメージにECRリポジトリ用の「latest」のタグを付与|![ECR-07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3673885/4cd9e984-6170-4f29-b846-90a31a7a3769.png)|
|**手順④イメージをプッシュ**<br><br>タグを付けたイメージをAWSのECR（倉庫）にアップロードする|![ECR-08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3673885/92dc93c9-9ff0-4335-9770-68637b9f0f71.png)|
|**ECRにてPush結果を確認**<br><br>作成したECRの配下に、「latest」というイメージタグが付いたイメージがあることを確認できる<br>また、このイメージ名をクリックすると、イメージ専用のURIを確認できる|![ECR-09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3673885/29d92405-fb8a-45dd-be29-3c4871aae639.png)<br>![taskdifine-05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3673885/32e4c8a0-cd6d-49ec-b76a-095146c75471.png)|

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

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

![Farget-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3673885/652878e7-b223-44b6-9ecc-035cd4d86c62.png)


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

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

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




### クラスター作成
 | 手順内容                          | 参考画像　                                      |
|:---------------------------------|:------------------------------------------------|
|Amazon Elastic Container Service > クラスター > 「クラスターの作成」|![claster-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3673885/cdb3285a-2862-488c-b870-c3ddce303245.png)|
|クラスター名を入力し、「AWS Fargate（サーバーレス）」を選択<br>その他の設定はデフォルトのまま|![claster-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3673885/c48ad155-ad6c-4ba6-95ca-b7c984bdcc46.png)|
|クラスターが表示されましたら成功|![claster-03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3673885/4c30791f-4948-4d40-a508-d21041b7bf4d.png)|


### タスク定義作成
 | 手順内容                          | 参考画像　                                      |
|:---------------------------------|:------------------------------------------------|
|Amazon Elastic Container Service > タスク定義 > 「新しいタスク定義の作成」|![taskdifine-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3673885/d1c6c8bf-e5d1-4ab4-be24-1e682986e883.png)|
|タスク定義ファミリーの名前を入力<br>起動タイプ：AWS Fargate|![taskdifine-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3673885/20ed61a2-ac60-4600-9871-5d4c3acba414.png)|
|タスクサイズについて、今回はコスト削減のため最小のものを<br>CPU：.25 vCPU、メモリ：.5GB|![taskdifine-03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3673885/362024e3-1f4e-4576-a295-28de8b59d651.png)|
|タスクロールにいて、アプリがDynamoDBなど他AWSサービスに直接アクセスしないですので不要<br>タスク実行ロールは、AWS側で作成してくれますのでデフォルトで大丈夫|![taskdifine-04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3673885/46c73b4b-587a-41bc-9c7c-a7709a59fc83.png)|
|ECSが動かす「アプリケーションの箱」（Dockerコンテナ）の名前を入力する<br><br>イメージURI欄にECRでPushしたイメージのURIを入力<br><br>その他の設定はデフォルト|![taskdifine-07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3673885/561b0d0d-0a10-4cf8-924f-04012c0d3cd2.png)![taskdifine-06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3673885/c22cf530-51c8-4f01-9521-e8c06a980c3d.png)|

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

### サービス作成

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

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

 | 手順内容                          | 参考画像　                                      |
|:---------------------------------|:------------------------------------------------|
|タスク定義ファミリー：タスク定義作成のステップで作成したものを選択|![service-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3673885/35bffc98-bbeb-4249-b55c-77e55fca1753.png)|
|コンピューティングオプションについては、今回は起動タイプを使用|![service-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3673885/6e47158b-2a9b-4e79-b062-09f8012b57e9.png)|
|必要なタスク数：2|![service-03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3673885/be49d778-e09e-4a37-b468-51c5f403f420.png)|
|今回はパブリックIP持たせるので、パブリックサブネットに置く<br>ECS用のセキュリティグループを選択し、パブリック IP の自動割り当てをオンにする|![service-04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3673885/968573db-5aca-4f34-8ee1-9ddc49aeeadd.png)|
|ロードバランサー（ALB）をここで新規作成<br>ロードバランサー名を入力|![service-05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3673885/b58e040c-1b8d-4475-9dd7-9628dea5b427.png)|
|リスナーとターゲットグループも新規作成。<br>ターゲットグループ名を入力し、その他の設定はデフォルト|![service-06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3673885/849a24f1-f849-472a-94fe-63f659aeeb9d.png)|


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

 | 手順内容                          | 参考画像　                                      |
|:---------------------------------|:------------------------------------------------|
|デプロイがが成功後、「サービス」の数が1になり、サービスをクリックすると、図のように詳細を確認することができる|![finish-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3673885/9751b60e-2c77-4872-b467-e84ac4a6a020.png)|
|EC2 ＞ロードバランサー ＞ALB の画面にて、作成されたALBの詳細を確認することができる|![finish-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3673885/6879aaff-972e-4538-81a3-9bea32e6b08e.png)|
|ECSに紐づくALBのDNS名でアクセスし、「Hello World」画面が表示されれば成功|![finish-03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3673885/9271c1e4-ade9-4298-b13a-3c546aaa59d1.png)|
|起動されたタスクの詳細については、ECS ＞クラスター ＞該当のクラスター ＞タスク の画面にて確認できる|![finish-04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3673885/6a06433b-8b98-4efc-a466-d437ad28dcdd.png)|
|各タスクのパブリックIPからも、「Hello World」画面が表示される|![finish-05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3673885/39694ab4-d046-4265-ade3-e014b88ed6e4.png)|

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

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

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

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

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

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