AWS 基礎 Part 10 -- ALB や踏み台サーバーから Private IP を使って EC2 や ECS にアクセスする
Tags: aws, ecs, ec2, alb
Published: 2023-02-01 07:06:20


## 何をするのか

前回の記事で 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](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/szbmioywcj64narfr8if.png)

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 してみる。

```php
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 とする。

踏み台サーバーに移動。

```php
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 で作成されるので、しばらく待つ。



![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/406246d7cy4h3bo6oyq0.png)



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 が必要と理解した。