AWS EC2對外請求透過NAT Gateway轉譯IP
需求
很多第三方服務(像是金流、物流、簡訊等)都會要求限制請求的IP
如果Web架構是單台EC2的話還算好處理
把EC2設定好固定IP即可
但如果是比較大型或是高流量的架構通常都會用Auto Scaling
這時候EC2的數量跟IP變成不固定
隨時都可能異動
因此我們需要把所有EC2內對外的請求連線
做出一些處理
讓這些請求到達第三方服務的時候
IP永遠是固定的
Nat Gateway
About NAT
Network Address Translation
字面上意思就是它可以轉換IP
AWS官方提供的架構圖
這邊可以看到
DB Server是設定在Private Subnet裡面
並不能直接連到外網
但透過Route table的設定可以連到Public Subnet的Nat Gateway
再透過Nat Gateway轉換IP並透過Public Subnet的Internet Gateway連到Internet
簡易Demo架構
知道原理之後可以設定下列AWS資源
然後EC2對外驗證請求是否正常且IP為Nat Gateway的IP
需要的資源
- Public Subnet
- Nat Gateway
- Route table: 設定所有請求導向Internet Gateway(也就是導向外網)
- Private Subnet
- Route table: 設定所有請求導向Public Subnet的Nat Gateway
- EC2一台
- 設定在Private Subnet
- 任一可接收請求並且Log請求IP的Web Server: 這邊使用laravel
在這些資源下
假設可接收請求的Web Server提供一支簡易API(https://foobar.com/api)
只call這隻API Web Server就會紀錄請求IP寫入log
這樣就可以透過log知道請求的IP是否為Nat Gateway
請求的話就登入Private Subnet的EC2簡單使用curl即可
Subnet
設定一個Public Subnet、一個Private Subnet
確認Public Subnet的Route table有連接Internet Gateway(這樣才能接到外網)
設定Nat Gateway
設定一個Nat Gateway
並且配一個固定IP
這個IP就是到時候對外請求的IP
也就是要交給第三方服務設定的允許IP
設定Route table
將所有請求(0.0.0.0/0)都導向剛才設定的Nat Gateway
調整Private Subnet的Route table
將Private Subnet的Route Table改為剛才設定的那個Route table(點選Edit route table association即可設定)
這樣Private Subnet內發起的請求
就會經過那組Route table導向Nat Gateway
開啟測試的EC2
將EC2放到Private Subnet中
另外要確認Security Group傳入/傳出請求是否能正常
這邊可以先允許所有的傳出規則
開好EC2後就會看到Private IP
可以先登入同一個VPC內的Public EC2
再跳到這台Demo的EC2
從Private EC2中發測試請求
登入Private EC2後
使用curl發先前說的測試API請求(https://foobar.com/api)
curl https://foobar.com/api
接著看這個對外API Server Log到的IP
比對一下前面設定的Nat Gateway
確認都是一樣的IP175.41.154.121
其他參考資源
這些影片看完會對架構、操作比較了解
Troubleshooting