昨天看完了路由表與 Internet Gateway,知道 EC2 的流量怎麼走到網際網路。今天回到一開始貼進瀏覽器的那個 Public IP:如果我們試著在練習完後先把 EC2 停止,隔天再啟動,原本的網址還能用嗎?
答案是不行,因為 Start 之後 EC2 會拿到新的 Public IP。
而這個問題對現在的我們來說頂多是重新複製一次網址就好了,但接下來要替網站接上網域,而網域設定裡記的就是 IP;IP 一換,網域就會指到舊位址,每次都得回去改。
所以今天我們就來認識 Elastic IP(彈性 IP,簡稱 EIP),替這台 EC2 保留固定的公網 IPv4 ㄅ!
EC2 有兩種重開的方式:
| 位址 | Reboot | Stop → Start |
|---|---|---|
| 自動指派的 Public IP(目前使用) | 不變 | 取得新的位址 |
| Elastic IP(今天要設定) | 不變 | 不變 |
| Private IP | 不變 | 不變 |
所以等一下要驗證 EIP 有沒有效,一定要用 Stop → Start。只做 Reboot 的話,IP 本來就不會變,看不出差別。
自動指派的 Public IP 跟著 EC2,機器一停就被收回。而Elastic IP 則是保留在你的 AWS 帳號裡,只要不主動釋放,它就一直是你的,要給哪台 EC2 用也是由你決定。
以下是操作時會遇到四個動作:
| 動作 | 做了什麼 |
|---|---|
| Allocate,配置 | 取得一個 EIP,保留在自己的 AWS 帳號中 |
| Associate,關聯 | 把這個 EIP 指定給某台 EC2 使用 |
| Disassociate,解除關聯 | 從 EC2 拆下來,但位址仍保留在帳號中、繼續計費 |
| Release,釋放 | 交還給 AWS,不再保留 |
要注意,Allocate 只是把 IP 領進帳號裡,還要再 Associate 後,這台 EC2 才會真的用上它。另外,EIP 只能在配置它的 Region 裡使用,所以要跟當時建的 EC2 選一樣的 Region。
這裡還有一個容易誤會的地方:這次會取得新的 EIP,並取代 EC2 原本自動指派的 Public IP。 原本的 Public IP 會回到 AWS 的位址池,不能直接把那個位址轉成 EIP。完成後,瀏覽器要改用新位址。
截至目前到今天 AWS 官方文件來看,AWS 一般 Public IPv4 的牌價是每個位址每小時 US$0.005,使用中與閒置的費率相同。這從 Amazon 位址池取得的 EIP 也適用。
| 情況 | Public IPv4 費用 |
|---|---|
| EC2 執行中,使用自動指派的 Public IP | 一個位址,每小時 US$0.005 |
| EC2 執行中,改用 EIP | EIP 取代原本的自動 Public IP;關聯完成後仍是一個位址,每小時 US$0.005 |
| EC2 Stop 後 | 自動 Public IP 已釋放,不再收該位址的費用;保留的 EIP 照常計費 |
| EIP 尚未關聯,或已解除關聯 | EIP 仍計費;若執行中的 EC2 也持有自動 Public IP,兩個位址各自計費 |
因此,若每天練完就 Stop,保留 EIP 代表停機期間也會付 IPv4 的費用。
以一個 EIP 連續保留 30 天估算:
US$0.005 × 24 小時 × 30 天 = US$3.60
以上為未扣抵 credits 的 IPv4 費用估算,不含 EC2、EBS(EC2 的硬碟儲存)、流量與稅費。
先回到 AWS Console → EC2,一樣先確認 Region 後,啟動之前建的 EC2 並等待狀態檢查通過。記下目前的 Public 與 Private IPv4,並沿用之前的方式,用目前的 Public IP 確認網站能開啟,再進行位址切換。
若之前有記下 Public IP,而且之後確實 Stop 過 EC2,也可以和今天的位址對照;沒有記錄就直接往下做。
畫面上的 全域靜態 IP 位址/建立加速器是 AWS Global Accelerator 的介紹,這次配置 EIP 不需要操作它。
完成後,列表會出現新的Elastic IP 位址。
選取剛才的 EIP,按 Actions(動作) 中 Associate Elastic IP address(與彈性 IP 位址建立關聯):
| 欄位 | 這次的設定 |
|---|---|
| Resource type(資源類型) | Instance(執行個體) |
| Instance(執行個體) | 選擇你建立的 Instance ID |
| Private IP address(私有 IP 位址) | 這台 EC2 的主要 Private IPv4,可對照剛才記下的值 |
確認後按 Associate(建立關聯)。EIP 會對應到這台 EC2 的 Private IP,這就是我們之前所說的 Public 與 Private IP 對應。
回到 EC2 中 Instances(執行個體) 看我們這次建的 Instance 重新整理,確認兩個欄位:
在自己的瀏覽器輸入:
http://你的_ELASTIC_IP
把 你的_ELASTIC_IP 換成 Console 顯示的位址。因為沿用之前的 Docker -p 80:3000,這裡仍使用 http://,網址後面不用加 :3000。如果程式沒有寫死原本的 Public IP,換 EIP 也不用重新 build image 或建立容器。
也記得別把新 EIP 填進 Security Group 的 My IP 來源欄位:EIP 是瀏覽器要前往的目的位址,My IP 則是你這邊的對外來源 IP。 如果自己的來源 IP 已改變,例如換了 Wi-Fi 或 VPN,就要更新建立的 Security Group 中 HTTP 80 規則,讓它允許目前的來源。
回到開場的問題:現在再做一次 Stop → Start,網址還能用嗎?停止期間網站會打不開,Session Manager 也會斷線,這是正常的。
http://你的_ELASTIC_IP 開啟網站。sudo systemctl is-active docker
sudo docker ps -a --filter name=my-app
curl -I http://127.0.0.1
curl -I 只看回應標頭,就跟 DevTools Network 裡的 Response Headers 是同一類資訊。systemctl 是 Linux 用來管理 Docker 這類背景服務的指令| 看到什麼 | 下一步 |
|---|---|
Docker 是 inactive 或 failed |
用 sudo systemctl status docker 看原因;沒啟動的話,執行 sudo systemctl enable --now docker |
my-app 是 Exited |
執行 sudo docker start my-app;一直退出的話,看 sudo docker logs --tail 50 my-app |
curl 回 HTTP/1.1 200 OK,瀏覽器卻打不開 |
http 有回應的話,就檢查網址和 Security Group 設定的 My IP |
明天的網域會用到這個 EIP,所以現在先不要 Release。不過只要它還在帳號裡就會計費,整個練習結束後,記得照下面的步驟釋放。
到 Elastic IPs(彈性 IP) 選這個 EIP,先按 Actions(動作) 中 Disassociate Elastic IP address(取消關聯彈性 IP 位址),解除關聯後再一次點選這個 EIP 按 Actions(動作) 中 Release Elastic IP addresses(釋出彈性 IP 位址)。
有三件事要記得:
Release EIP 不會停掉 EC2,不需要執行的 EC2 也記得要 Stop。
現在我們能替 EC2 保留固定的公網位址了。下一篇接著認識網域與 DNS,看看瀏覽器輸入容易記住的名稱後,怎麼找到這個 IP。