何をするのか
前回の記事で ALB から EC2 x 2 にはロードバランスできた。
これはインスタンス指定だった。
IP 指定にすれば、ECS のコンテナでも行けるのではないかと仮説を立てた。
前回から使っている VPC サブネットに ECS を立てて検証する。
- ALB で IP を使って EC2 にアクセスしてみる
- ECS をプライベートで立てる
- 踏み台サーバーに入って IP を使って ECS にアクセスしてみる
- ECS へのアクセスをロードバランサーに投げる
この手順で行う。
IP アドレスでロードバランスできるかを EC2 でテストする
ALB を作成してターゲットの EC2 たちを IP で指定する
https://www.youtube.com/watch?v=Y-Mc2OenReA&t=3006s
参考もとはこの動画。
klein-alb-by-ip のロードバランサー名前以外は
前半は前回の記事と同じ。
ターゲットグループを変更する
- 名前: klein-alb-tg-by-ip
- ターゲットグループ: IP
ターゲットたちを変更する
IP を登録
- 10.1.1.A
- 10.1.1.B
AZ は自動で両方 A だと判断してくれた。
ターゲットを IP で指定した ALB にアクセス
ALB の Public IP にアクセスする。
するとロードバランスされて EC2 のサーバー A, B が表示されているのを確認できた。
Private の ECS クラスターとコンテナを立てて踏み台サーバーから curl する
サブネット作成
これまでは AZ A に本番を作っていた。
今回は AZ C にも本番を作って分散する。
- 名前: klein-private-1c
- VPC: vpc-elb-ec2
- IP: 10.1.3.0/24
- AZ: C
インターネットゲートウェイにはまず接続しない。
クラスター作成
- 名前: klein-cluster
- VPC: vpc-elb-ec2
- サブネット: klein-private-1{a,c}
タスク定義作成
コンテナはこのシリーズの以前の記事で作成した hello-nginx を使う。
- 名前: klein-task-A
- コンテナ名: hello-nginx
- コンテナURL : ****.dkr.ecr.ap-northeast-1.amazonaws.com/hello-nginx
セキュリティグループに設定を追加
現状セキュリティグループの klein-alb-sg のインバウンドルールには
- HTTP: 0.0.0.0
しか登録されていない。
ここに
- Custom TCP: {my.step.server.ip}/32
これを追加して、踏み台サーバーからのアクセスを許可する。
クラスターに実行タスクを作成
- App Type: task
- Family: klein-task-A
- VPC: vpc-elb-ec2
- サブネット: klein-private-1{a,c}
- セキュリティグループ: klein-alb-sg
実行タスクの Private IP に踏み台サーバーから curl
クラスター klein-cluster のタスクタブから実行タスクの詳細が見れる。ここで Private IP をみることができる。
ここでは my-exeTask-ip とする。
同一 VPC 内部に前回作った踏み台サーバーの EC2 がある。
ここに入って先ほど作った実行タスクの Private IP に curl してみる。
curl {my.exeTask.ip}
<h1>hello-nginx</h1r[ec2-user@ip-my-exeTask-ip ~]$
レスポンスが返ってきた!
>
が r になっているけど。
サービスを作成
- クラスター: klein-cluster
- 計算オプション: ローンチタイプ
- ローンチタイプ: FARGATE
- 名前: publicIpOn
- VPC: vpc-elb-ec2
- サブネット: klein-private-1{a,c}
- セキュリティグループ: klein-alb-sg
- public IP: ON
- ロードバランサー: なし
これでアクセス可能なサービスが作られるのでしばらく待つ。
Public IP は使わないが、ON にする必要がある。
理由は Public IP が OFF だと、なぜか Private IP ですらアクセスできないからだ。
サービスのタスクが Pending から進まない。
なぜ Public IP を作らないと行けないかは不明だが、タスクが作られないことから、コンテナの DL に必要なのかと想像している。
サービスの Private IP にアクセス
klein-cluster のサービスタブから、
PublicIpON のサービスに移動
設定とタスクのタブに移動
タスクの画面から、このサービスで動いているタスクに移動
Public IP と Private IP を確認する。
Private IP は 10.pub.ip.on とする。
踏み台サーバーに移動。
curl 10.pub.ip.on
<h1>hello-nginx</h1r[ec2-user@ip-10-pub-ip-on ~]$
このように、ECS のサービスに紐づいているタスクにも、
踏み台サーバーから Private IP を使ってアクセスすることができた。
サービスをもう一つ作成
PublicIpOn2 の名前でもう一つサービスを作成
Private IP からのアクセスを確認
ロードバランサーのターゲットを 1 つずつ入れ替えてみる
既存の ALB のターゲットを変更できなかったので新しく作る。
- 名前: toPublicServices
- サブネット: klein-public-1{a,c}
- SG: klein-alb-sg
- ターゲットグループ: PublicServices
このターゲットグループの設定は下記で作った。
- 名前; PublicServices
- ターゲットの登録
- 10.pub.ip.on1
- 10.pub.ip.on2
ターゲットの登録には直接サービス達の Private IP を書いた
ステータスが Provisioning で作成されるので、しばらく待つ。
ALB の DNS アドレスからコンテナにアクセスできた!
SG に ALB からのアクセス許可は必要なかった。
まとめ
AWS で ALB というロードバランサーから
ECS というコンテナサーバーにロードバランスするためには
- Private サブネットを 2 リージョンに作る
- ECS のクラスターとタスク定義を作る
- ECS のサービスを Public IP ON で 2 つ作る
- サービスたちの Private IP を登録したターゲットグループを作る
- ALB を作ってターゲットグループに向ける。
- ALB の DNS name にアクセスする。
これでできた。
なぜ Public IP を ON にしないと行けないかの考察
Public IP が ON ではないと ENI が作られないためと解釈した。
ENI ( Elastic Network Interface ) とは、
伸縮可能なネットワークのインターフェース
インターフェースなので挟まるものなのは名前からわかる。
https://business.ntt-east.co.jp/content/cloudsolution/column-14.html
NTT の記事によると
VPC に立てたプライベートな EC2 に対して
ネットワークインターフェースを追加できると書いてある。
クリーンアーキテクチャでは
Usecase と Gateway に挟まれる Port がある。
これは
Usecase からの引数
Gateway からのレスポンス
これらの型を定義するものだ
これと同様、プライベートな EC2 を Gateway に見立てて
Usecase から呼ぶ Port を ENI に見立てる。
なので Port 相当の ENI が必要と理解した。
Top comments (0)