今天開始進入使用 Gitlab pipeline deploy 的部份,我們要把「手動 build docker image 並 push 上 ECR repository」這部份自動化、交給 Gitlab pipeline 做。不過使用 Gitlab pipeline 前,要先準備一台機器好安裝 Gitlab Runner。
需要一台機器?我們不是準備用 AWS 嗎?到 AWS EC2 開台機器吧!EC2 是個可以讓我們啟動機器的服務。機器需要有個網路環境才能啟動,所以我們今天先設置好它需要的網路環境,也就是 VPC 與 Subnet。(有種要做的事的 stack 一直被 push 的 fu 絕對不是錯覺!)
開始前先保護一下自己的荷包~(這很重要!)
前兩天提到除非還有免費使用期並且使用 free tier 的 resource,不然使用 AWS 服務會被收費、會被收費、會被收費(很重要說三次),要注意自己的資源使用狀況與費用(不然荷包會哭哭)。AWS 有個功能可以在花費達到設定的金額時寄 email 通知,可以用這個功能來注意費用有沒有超過太多。
這個功能是 Billing 裡 Cost Management 的 Budgets,用 root email 登入可以進到 Billing,從左邊選單進到 Budgets:
點選右上角 Create budget。
我們用 template 簡化設定:
如果是使用 Free tier 的朋友可以用 Zero spend budget,有花費時 AWS 就會通知。像筆者已經超過免費使用期,會用 Monthly cost budget 來注意每個月的費用。後面設定很簡單,訂個名字、設定每個月的預算費用。Email recipients 輸入要通知的 email,按下 Create Budget 即可。
AWS 會在以下三種狀況寄信通知:實際花費達到設定的 85%、實際花費達到設定的 100% 以及預期花費達到設定的 100%。
這樣就能避免沒注意到費用、月底收到帳單才發現荷包要破洞惹。
保護好荷包,開始今天的主題:AWS 的網路 VPC & Subnet。
VPC 可以想成在 AWS 裡的區域網路(LAN),每個 VPC 底下能夠再劃分多個 Subnet。VPC 是抽象概念上的區域網路並不是真的有一個實體網路,是 AWS 管理了許多實體網路並透過某些我們不知道的方式 (俗稱魔法) 組成抽象的 VPC 給我們使用,類似軟體開發裡的抽象化。
一個 Subnet 屬於某個 Availability Zone(簡寫 AZ)。EC2 機器則開在某個 Subnet 裡,所以我們要先建立 VPC、Subnet 及相關的網路 resource。咦?Availability Zone 是什麼?好的~這裡介紹一下 Region、Availability Zone 以及它們跟 Subnet 的關係~
AWS 的基礎硬體設施,像是機房、網路跟機器等等遍佈全世界(不管是 AWS 自己的還是租的)。AWS 把這樣全球性基礎建設大致分成三個層級:Global(全球)、Region(區域)以及 Availability Zone(可用區域)。AWS 提供的服務有各自所屬的層級,層級決定了我們啟動某個層級的服務時,那個服務實際上會開在哪些實體地理位置上。
Region 翻成中文是「區域」也就是「實體地理位置上的某個地方」,選擇某個 Region(例如東京)後,Region 層以下的服務實體上會開在東京,像是我們在東京 Region 使用 EC2,這些相關機器會開在東京。通常我們會以使用者(可能是客戶,也可能是開發團隊)所在的地理位置選擇比較靠近的 Region,地理位置越靠近通常網路傳輸的 latency 就越小嘛~
「EC2 機器開在東京」的意思是「在東京有個屬於 AWS 的機房,在裡面啟動一台 EC2 虛擬機器(Virtual Machine)」那麼東京只有一個機房嗎?如果那個機房所在的建築剛好停電,不就整個東京 Region 的服務都掛掉了?這樣就沒有 high availability 了啊~
所以 Region 底下還有一個層級是 AZ,可以簡單想成一個 AZ 就是一個機房。我們不知道 AWS 具體的劃分單位是什麼,它可能是某棟大樓或某個園區,總之相較 AZ 之間,AZ 內機器間物理距離是很近的。一個 Region 會有多個 AZ,AZ 彼此在地理上有隔一段距離,藉由這樣物理上的區隔來達到 Region 內的 high availability。如果一個地方有什麼問題(像是停電)只會讓一個 AZ 掛掉,但 Region 內還有其他 AZ 可以正常運作,不會整個 Region 的服務都掛掉。當然啦,如果出現 Region 等級的問題,還是會整個 Region 掛掉…這就要回到成本考量:建跨 Region 的 service 成本會比單一 Region 高很多,是否要付出更高成本讓服務擁有更高等級的 high availability?
最後一個層級是 Global,顧名思義是全球性的服務,例如 CDN(Content Delivery Network 或 Content Distribution Network)。使用 Global 層級的服務,AWS 會在全世界部屬相關機器跟設定等等,讓使用者們可以使用離他最近的機器取得服務。像是部屬 CDN 後,使用者瀏覽網頁會到離他所在位置最靠近的 AWS CDN server 來取得 cache。
EC2 機器跟 Subnet 是 AZ 層級的功能。機器比較好想像,一台虛擬機器當然要有個機房啟動,所以它要開在一個 AZ 內。一個 Subnet 是某個 VPC 內的一段網路,在 VPC 開 Subnet 要指定 AZ,代表它屬於哪個 AZ,然後 AWS 會用它的魔法調整相關網路設定讓 AZ 內某個實體網路成為該 VPC 的一部分(這是筆者的猜測)。
了解概念後,來動手實作吧!接下來我們會將各種 resource 開在東京 Region ap-northeast-1
,我們可以在右上角選擇 Region:
登入 AWS 後,可以從左上角搜尋框直接搜尋 vpc 進到 VPC dashboard:
按左上角的 Create VPC,依照下圖設定。
我們先選 VPC Only
建立 VPC 本身,後面再慢慢加上需要的其他 network resource。Name tag 是這個 VPC 的名稱,可以依喜好設定。IPv4 CIDR block 是這個 VPC 的 IPv4 address 範圍,這邊我們用 172 開頭的 private network 。為了之後切 subnet 方便計算 IP address 範圍,筆者用 /16
subnet mask 而非 172 開頭的可用最大 mask /12
。當然不照 private network 定義的 IP address 範圍設定也可以,只是通常會把 VPC 當作一個 LAN 所以傾向用 private network 的 IP address 範圍。IPv6 的部份先不設定,選 No IPv6 CIDR block,其他保持預設值即可 Create VPC。
從 VPC dashboard 左邊選單進入 Subnets 頁面,點右上角 Create subnet。VPC ID 選擇我們剛剛建立的 VPC。Subnet name 是這個 subnet 的名稱,筆者習慣用 VPC 名稱加上 subnet 的特性跟所在 AZ。前面說到 subnet 是 AZ 層級的 resource,這裡要決定它要開在哪個 AZ,選 ap-northeast-1a
開在東京的 AZ 1a。
再來是這個 subnet 的 IPv4 address 範圍,我們要從 VPC 的 IPv4 CIDR 內切出一塊給這個 subnet,之後開在這個 subnet 的機器的 IP address 會在這個範圍內,如果不確定 subnet 的 IP address 範圍可以用計算機。設定好後 Create subnet:
Internet Gateway(縮寫 IGW)是 AWS 提供的 network 元件,讓 attach 到它的 VPC 能連上 internet。不過 VPC 有能力連上 internet 不表示裡面的 subnet 跟機器都能連上 internet,必須建立適當的 route 們讓機器知道要怎麼走去 internet。(後面會說!)
一樣從左邊選單進入 Internet gateways 頁面,點 Create internet gateway。建立 internet gateway 很簡單,只需要設定名稱。
建立 internet gateway 後,在清單勾選它,選擇右上角 Action 中的 Attach to VPC,選擇我們剛建立的 VPC:
接下來要建立 VPC 的 route table,route table 讓 VPC 內 subnet 中的網路流量知道要怎麼走,跟一般電腦、router 等網路設備的 route table 概念相同。
進入 Route tables 頁面,點 Create route table。
指定 route table 的名稱,以及它是哪個 VPC 的 route table。
接下來進到剛建立好的 route table 的頁面,切到 Route tab 點選 Edit routes。
新增一個 route,Destination 設定 0.0.0.0/0
、Target 選 Internet Gateway 並選擇剛剛新增並 attach 到 VPC 上的 internet gateway。這表示所有不符合其他 route 規則的 network traffic 都會往 internet gateway 送,也就是往 internet 送。
整個 VPC 的網路流量都依照這個 route table 設定的走嗎?不是的~只有 associate 到這個 route table 的 subnet 內的流量才會照這個 route table 設定走。一個 VPC 裡可以有多個 subnet,這些 subnet 可以 associate 到不同的 route table,網路流量的走向便會不同。
透過 subnet 與不同的 route table 建立 association,我們可以在一個 VPC 內建立不同特性的 subnet 滿足不同種類機器的需求,例如 database 希望只能由 VPC 內的機器存取、不想讓它跟 internet 有連接等等。我們先做最簡單的:把剛剛建立好的 subnet 跟 route table 建立 association,讓這個 subnet 跟 internet 連接。
在 route table 的頁面切到 Subnet association,點右邊 Edit subnet association 按鈕。
選擇我們剛剛建立的 subnet 然後 save:
建立 association 後會在 explicit subnet associations 看到跟 route table 有 association 的 subnet 們:
從 subnet 也可以看到它的 route table 是什麼:
每個 subnet 一定要 associate 到一個 route table,如果沒有幫它設定,它會自動 associate 到 default route table。一個 route table 則可以 associate 多個 subnet。
好~!這就是最基本的網路設定,明天我們要在這個 subnet 裡啟動 EC2 機器。