3
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のFargateを使ってみたいけど、何から始めていいかわからない...という方へ。
一緒に超シンプルな構成を試して「これがFargateか😃」を体感してみましょう!の第3弾です。
ネットワークもAWSも初学の人が書いているので、どうか温かい目で読んでくださいね。

ちなみに第1弾と第2弾はこちらです。


今回はプライベートサブネットにFargateを置いてALBと接続します
インフラ図練習-ページ4 (1).jpg

まずは用語をざっくり説明

VPC(Virtual Private Cloud) :

論理的に隔離されたプライベートスペースです。
「進撃の巨人」で例えると、冒頭で巨人に壁を破壊されたシガンシナ区です。
このエリアの中にFargate(エレンの家)やALB(交通整理の人)を置きます。

ECR(Elastic Container Registry):

Dockerイメージを安全に保存・共有するためのツールです。
想像ですが、シガンシナ区の外にある秘密の食糧庫みたいなものですかね。

ECS(Elastic Container Service):

複数のコンテナを効率的に管理、運用できるツールです。
今回の役割としては、ECRのDockerイメージをFargateの中で起動させます。
例えると、村の外にある食糧庫から冷凍肉まんを取ってくる人です。

Fargate:

コンテナに対しサーバレスで実行できる環境を提供してくれるサービスです。
ECRがとってきたDockerイメージをコンテナとして起動します。
例えるなら、エレンの家の電子レンジです。
食糧庫から取ってきた冷凍肉まんをホカホカに温めます。

ALB(Application Load Balancer):

ALBには「交通整理」と「安全確認」の2つの役割があります。

1つ目の「交通整理」について。
ALBは、2つのAZ(アベイラビリティーゾーン)をまたぐ場所にあり、
ユーザーからのアクセスをどちらかのAZにバランス良く振り分けます。
今回は一方のAZにのみ、Fargateを置くので振り分けはありません。

2つ目の「安全確認」について。
アクセス先が安全かを確認するヘルスチェックを、60秒おきに行います。

これでエレンは渋滞に巻き込まれることなく安全に家まで辿りつけるのですね。

NAT(Network Address Translation):

FargateのIPアドレスをグローバルIPアドレスに変換します。

エレンの家は、村人の間で「エレンんち」と呼ばれているけど
公的には「シガンシナ区2丁目9番地」と呼ばれている感じですね、多分。

ちなみに、NATはIPアドレスとグローバルIPアドレスを1対1に変換しますが、
NAPT(Network Address Port Translation)は複数のIPアドレスを1つのグローバルIPアドレスに変換します。
会社としてのグローバルIPアドレスは1つ、会社内のネットワークにあるPCのIPアドレスは複数ある、という状態です。
グローバルIPアドレスからIPアドレスに変換する際はポートを見て識別します。

NATとNAPT
IPアドレス⇆グローバルIPアドレス
NATは1対1、NAPTは多対1で、IPアドレス+ポート番号で識別する。

やってみよう

以下の手順で進めます
- Fargateに入るためのIAMロールを作成
- ECRにリポジトリを作成し、イメージをプッシュ
- VPCを作成
- ECSにタスク定義を作成
- ECSにクラスター、サービスを作成
- ターゲットグループを作成
- ロードバランサ(ALB)を作成
- Fargateにアクセスしてみよう
- Fargateの中に入ってみよう

Fargateに入るためのIAMロールを作成

CloudShellで下記コマンドを実行します。

aws iam create-role \
  --role-name ecsTaskRole \
  --assume-role-policy-document '{
    "Version": "2012-10-17",
    "Statement": [
      {
        "Effect": "Allow",
        "Principal": {
          "Service": "ecs-tasks.amazonaws.com"
        },
        "Action": "sts:AssumeRole"
      }
    ]
  }'

引用:https://qiita.com/free-honda/items/53884ea680031be839b9


ecsTaskExecutionRoleとecsTaskRoleがあるか確認してください

スクリーンショット 2025-04-06 14.53.25.png

ecsTaskExecutionRoleがない場合は以下の「ロールを作成」を参考に作成してみてください

ECRにリポジトリを作成し、イメージをプッシュ

1.ECRにリポジトリを作成

Django用とNginx用に2つのリポジトリを作成します。
リポジトリ名はそれぞれ「reverse-proxy-django-app」と「reverse-proxy-django-nginx」にしてください。後で作成するタスク定義に合わせるためです。

スクリーンショット 2025-04-05 8.20.47.png

2.CloudWatchにロググループを作成する

どの画面でも構いませんので、画面左下にあるCloudShellを開いてください。

スクリーンショット 2025-04-05 8.41.54.png

CloudShellで下記コマンドを実行します

CloudWatch にロググループが存在するか確認
aws logs describe-log-groups --query "logGroups[*].logGroupName"
ロググループが存在しない場合は下記コマンドで作成
aws logs create-log-group --log-group-name "/aws/ecs/reverse-proxy-cluster"

3.GitHubから簡易アプリをクローンする

以下のGitHubリポジトリを使用させていただきます

CloudShellで下記コマンドを実行します

GitHubからリポジトリをクローンする
git clone https://github.com/free-honda/reverse-proxy-django-prd.git

4.リポジトリにDockerイメージをプッシュする

ECS → リポジトリ → 「reverse-proxy-django-app」をクリック → CloudShellを開き、CloudShell内でdjango_appディレクトリに移動してください

スクリーンショット 2025-04-05 8.44.33.png

コンソール画面の「プッシュコマンドを表示」をクリックし、4つのコマンドを実行します

スクリーンショット 2025-04-05 8.44.59.png

スクリーンショット 2025-04-05 15.30.35.png

更新ボタンを押してみてください
「reverse-proxy-django-app」リポジトリにイメージをプッシュできました

スクリーンショット 2025-04-05 8.55.05.png


次は「reverse-proxy-django-nginx」リポジトリにイメージをプッシュします

リポジトリ → 「reverse-proxy-django-nginx」をクリック → CloudShellを開き、CloudShell内でreverse-proxy-django-prdディレクトリに移動

スクリーンショット 2025-04-05 8.52.01.png

再度「プッシュコマンドを表示」のコマンドを実行しますが、
2つ目のコマンドの代わりに下記を実行してください

Nginx のビルド
docker build -t reverse-proxy-django-nginx -f nginx.Dockerfile .

「reverse-proxy-django-nginx」リポジトリにイメージをプッシュできました

スクリーンショット 2025-04-05 8.54.54.png

VPCを作成する

VPC → VPCを作成

スクリーンショット 2025-04-06 10.31.18.png

スクリーンショット 2025-04-06 11.14.17.png

スクリーンショット 2025-04-06 11.14.31.png

スクリーンショット 2025-04-06 11.14.38.png

VPCが作成完了するまで、画面遷移やリロードしないでくださいね
スクリーンショット 2025-04-06 11.17.33.png

ECSにタスク定義を作成

ECS → タスク定義
スクリーンショット 2025-04-06 11.28.28.png

下記のJSONを使います。[xxx]をご自身のAWSアカウントIDに置き換えてください。

{
  "family": "reverse-proxy-task",
  "taskRoleArn": "arn:aws:iam::xxx:role/ecsTaskRole",
  "executionRoleArn": "arn:aws:iam::xxx:role/ecsTaskExecutionRole",
  "networkMode": "awsvpc",
  "requiresCompatibilities": ["FARGATE"],
  "cpu": "1024",
  "memory": "2048",
  "containerDefinitions": [
      {
          "name": "django",
          "image": "xxx.dkr.ecr.ap-northeast-1.amazonaws.com/reverse-proxy-django-app",
          "cpu": 512,
          "memory": 1024,
          "portMappings": [
              {
                  "containerPort": 8000,
                  "protocol": "tcp"
              }
          ],
          "essential": true,
          "environment": [
              {
                  "name": "DJANGO_SETTINGS_MODULE",
                  "value": "mysite.settings"
              },
              {
                  "name": "DJANGO_SECRET_KEY",
                  "value": "your-secret-key"
              },
              {
                  "name": "STATIC_ROOT",
                  "value": "/app/staticfiles"
              }
          ],
          "logConfiguration": {
              "logDriver": "awslogs",
              "options": {
                  "awslogs-group": "/aws/ecs/reverse-proxy-cluster",
                  "awslogs-region": "ap-northeast-1",
                  "awslogs-stream-prefix": "ecs"
              }
          }
      },
      {
          "name": "nginx",
          "image": "xxx.dkr.ecr.ap-northeast-1.amazonaws.com/reverse-proxy-django-nginx",
          "cpu": 512,
          "memory": 1024,
          "portMappings": [
              {
                  "containerPort": 80,
                  "protocol": "tcp"
              }
          ],
          "essential": true,
          "logConfiguration": {
              "logDriver": "awslogs",
              "options": {
                  "awslogs-group": "/aws/ecs/reverse-proxy-cluster",
                  "awslogs-region": "ap-northeast-1",
                  "awslogs-stream-prefix": "ecs"
              }
          }
      }
  ]
}

スクリーンショット 2025-04-06 11.30.22.png

ECSにクラスター、サービスを作成

ECS → クラスター → クラスターを作成をクリック クラスター名を付けて作成します
スクリーンショット 2025-04-06 11.26.15.png

クラスターができました
スクリーンショット 2025-04-06 11.26.48.png

サービスを作成します
スクリーンショット 2025-04-06 11.27.08.png

スクリーンショット 2025-04-06 11.34.15.png

スクリーンショット 2025-04-06 11.34.29.png

スクリーンショット 2025-04-06 11.34.58.png

サービスができました
スクリーンショット 2025-04-06 11.36.29.png

タスクが実行しているか確認してください
スクリーンショット 2025-04-06 11.36.07.png

「タスク」タブにあるFargateのIPアドレスをコピーします
スクリーンショット 2025-04-06 16.50.36.png

ターゲットグループを作成

スクリーンショット 2025-04-06 12.57.06.png

スクリーンショット 2025-04-06 12.58.06.png

スクリーンショット 2025-04-06 12.58.21.png

先ほどコピーしたFargateのIPアドレスを貼り付けます
スクリーンショット 2025-04-06 13.00.39.png

スクリーンショット 2025-04-06 13.00.56.png

ロードバランサ(ALB)を作成

スクリーンショット 2025-04-06 13.01.19.png

スクリーンショット 2025-04-06 13.01.50.png

スクリーンショット 2025-04-06 13.03.12.png

「新しいセキュリティグループを作成」をクリック
スクリーンショット 2025-04-06 13.06.46のコピー.png

スクリーンショット 2025-04-06 17.06.53.png

ロードバランサの作成に戻ります
スクリーンショット 2025-04-06 13.06.46.png

スクリーンショット 2025-04-06 13.08.17.png

ALBからECSのセキュリティグループへのアクセスを許可する

スクリーンショット 2025-04-06 17.08.38.png

スクリーンショット 2025-04-06 17.09.39.png

Fargateにアクセスしてみよう

EC2 → ロードバランサ → DNS名をクリック
スクリーンショット 2025-04-06 17.19.31.png

ブラウザからhttpでアクセス
スクリーンショット 2025-04-06 13.09.36.png
スクリーンショット 2025-04-06 12.29.00.png

Fargateの中に入ってみよう

ECS → タスク → 設定にあるECS Execを確認します
スクリーンショット 2025-04-06 17.24.36.png

CloudShellを開いて以下のコマンドを使用します
クラスタ名とサービス名は変更してください

aws ecs update-service \
  --cluster <ECSクラスタ名> \
  --service <ECSサービス名> \
  --enable-execute-command

一度タスクを停止し、更新ボタンを押して再度実行中のタスクが表示されるのを確認してください。新たにデプロイされたタスクに対してECS Execが有効になります。

スクリーンショット 2025-04-06 17.32.51.png

タスク内へシェル接続します
スクリーンショット 2025-04-06 17.39.12.png

CloudShellで以下のコマンドを使用します
クラスタ名とサービス名、コンテナ名は変更してください

aws ecs execute-command \
  --cluster <ECSクラスタ名> \
  --task <新しいタスクID> \
  --container <コンテナ名> \
  --command "/bin/sh" \
  --interactive

これでFargateに自由に入れるようになりました🎉

後片付け

お金かかるので不要なら削除しましょう

  • VPC
  • クラスター、サービス、タスク
  • ターゲットグループ
  • ALB

まとめ

今回はプライベートサブネットにFargateを置いてALBと接続してみました。
あとはRDSと接続ができればいいですね。
最後までお付き合いくださりありがとうございます。

参考文献

3
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
3
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?