DEV Community

kaede
kaede

Posted on • Updated on

AWS 基礎 Part 10 -- ALB や踏み台サーバーから Private IP を使って EC2 や ECS にアクセスする

何をするのか

前回の記事で ALB から EC2 x 2 にはロードバランスできた。
これはインスタンス指定だった。
IP 指定にすれば、ECS のコンテナでも行けるのではないかと仮説を立てた。
前回から使っている VPC サブネットに ECS を立てて検証する。

  1. ALB で IP を使って EC2 にアクセスしてみる
  2. ECS をプライベートで立てる
  3. 踏み台サーバーに入って IP を使って ECS にアクセスしてみる
  4. 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 にアクセス

Image description

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 ~]$
Enter fullscreen mode Exit fullscreen mode

レスポンスが返ってきた!
> が 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 ~]$ 
Enter fullscreen mode Exit fullscreen mode

このように、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 で作成されるので、しばらく待つ。

Image description

ALB の DNS アドレスからコンテナにアクセスできた!

SG に ALB からのアクセス許可は必要なかった。



まとめ

AWS で ALB というロードバランサーから
ECS というコンテナサーバーにロードバランスするためには

  1. Private サブネットを 2 リージョンに作る
  2. ECS のクラスターとタスク定義を作る
  3. ECS のサービスを Public IP ON で 2 つ作る
  4. サービスたちの Private IP を登録したターゲットグループを作る
  5. ALB を作ってターゲットグループに向ける。
  6. 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)