はじめに
AWSのFargateを使ってみたいけど、何から始めていいかわからない...という方へ。
一緒に超シンプルな構成を試して「これがFargateか😃」を体感してみましょう!の第3弾です。
ネットワークもAWSも初学の人が書いているので、どうか温かい目で読んでくださいね。
ちなみに第1弾と第2弾はこちらです。
今回はプライベートサブネットにFargateを置いてALBと接続します
まずは用語をざっくり説明
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があるか確認してください
ecsTaskExecutionRoleがない場合は以下の「ロールを作成」を参考に作成してみてください
ECRにリポジトリを作成し、イメージをプッシュ
1.ECRにリポジトリを作成
Django用とNginx用に2つのリポジトリを作成します。
リポジトリ名はそれぞれ「reverse-proxy-django-app」と「reverse-proxy-django-nginx」にしてください。後で作成するタスク定義に合わせるためです。
2.CloudWatchにロググループを作成する
どの画面でも構いませんので、画面左下にあるCloudShellを開いてください。
CloudShellで下記コマンドを実行します
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で下記コマンドを実行します
git clone https://github.com/free-honda/reverse-proxy-django-prd.git
4.リポジトリにDockerイメージをプッシュする
ECS → リポジトリ → 「reverse-proxy-django-app」をクリック → CloudShellを開き、CloudShell内でdjango_appディレクトリに移動してください
コンソール画面の「プッシュコマンドを表示」をクリックし、4つのコマンドを実行します
更新ボタンを押してみてください
「reverse-proxy-django-app」リポジトリにイメージをプッシュできました
次は「reverse-proxy-django-nginx」リポジトリにイメージをプッシュします
リポジトリ → 「reverse-proxy-django-nginx」をクリック → CloudShellを開き、CloudShell内でreverse-proxy-django-prdディレクトリに移動
再度「プッシュコマンドを表示」のコマンドを実行しますが、
2つ目のコマンドの代わりに下記を実行してください
docker build -t reverse-proxy-django-nginx -f nginx.Dockerfile .
「reverse-proxy-django-nginx」リポジトリにイメージをプッシュできました
VPCを作成する
VPC → VPCを作成
VPCが作成完了するまで、画面遷移やリロードしないでくださいね
ECSにタスク定義を作成
下記の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"
}
}
}
]
}
ECSにクラスター、サービスを作成
ECS → クラスター → クラスターを作成をクリック クラスター名を付けて作成します
「タスク」タブにあるFargateのIPアドレスをコピーします
ターゲットグループを作成
ロードバランサ(ALB)を作成
ALBからECSのセキュリティグループへのアクセスを許可する
Fargateにアクセスしてみよう
Fargateの中に入ってみよう
ECS → タスク → 設定にあるECS Execを確認します
CloudShellを開いて以下のコマンドを使用します
クラスタ名とサービス名は変更してください
aws ecs update-service \
--cluster <ECSクラスタ名> \
--service <ECSサービス名> \
--enable-execute-command
一度タスクを停止し、更新ボタンを押して再度実行中のタスクが表示されるのを確認してください。新たにデプロイされたタスクに対してECS Execが有効になります。
CloudShellで以下のコマンドを使用します
クラスタ名とサービス名、コンテナ名は変更してください
aws ecs execute-command \
--cluster <ECSクラスタ名> \
--task <新しいタスクID> \
--container <コンテナ名> \
--command "/bin/sh" \
--interactive
これでFargateに自由に入れるようになりました🎉
後片付け
お金かかるので不要なら削除しましょう
- VPC
- クラスター、サービス、タスク
- ターゲットグループ
- ALB
まとめ
今回はプライベートサブネットにFargateを置いてALBと接続してみました。
あとはRDSと接続ができればいいですね。
最後までお付き合いくださりありがとうございます。
参考文献