VPC與NAT Gateway
VPC的全名是Virtual Private Cloud,主要的功能是將我們需要的Server設定為一個封閉的區域網路,而這樣做的原因,當然是為了安全性的問題,想像一下,假設有某一台資料庫,它開放給全球的人,只要帳號與密碼正確,誰都可以連進來,和即使帳號密碼正確,但只有某幾台機器可以連進來,那種比較安全?不言而喻,當然是後者,這也是VPC的主要功能。
當建立好一個VPC後,我們可以將多台機器放在這個VPC底下,不過有非常大的情況,VPC內的機器還是需要對外溝通;而在AWS的環境中,VPC內部的機器想要對外溝通時,需要一個對外的IP(EIP)才行,如果我們使用的EC2的服務,當然沒有問題,因為它可以同時擁有VPC下的虛擬IP,並同時擁有對外的EIP,不過如果是使用Lambda的服務的話,那就需要一NAT Gateway了。
NAT的全名是Network Address Translation,主要的功能是連結內部與外部的網路,這樣子的話,區域網路內的服務器,均可以透過同一個對外IP來進行對外部的溝通,這是IPv4當時因為IP數量不足,發展出的一種技術。
VPC與NAT Gateway的免費額度與收費
首先大家要有一個認知,VPC內的所有功能,均跟一年免費額度無關,要收費的就會收費,不會收費的就不會收費,而在VPC的功能裡,要收費的只有二種:分別是VPN(Virtual Private Network-虛擬私人網路)與NAT Gateway,而本篇只會談到NAT Gateway。
NAT Gateway的收費計算是二種,一種是小時制,一種是流量制,而這二種費用的總和,就是NAT Gateway的費用,小時制的收費與流量制的收費,均可在官網中看到,如下圖。
Lambda與VPC與NAT Gateway
基本上會寫這一篇,主要是筆者使用了Lambda的服務,而Lambda的資料儲放在RDS中,因為RDS本身一定需要VPC,所以Lambda只能使用VPC,但是Lambda又需要呼叫其他外部服務,例如:寄信,於是就造成了剛剛說的狀況,因為Lambda本身無法指定EIP,所以此時便需要NAT Gateway出場了。
其實在VPC中的所有設定,都需要一定的網路基礎知識,以專業性來區分,它比較偏向MIS的專業,但以台灣企業來說,專業性的區分對員工來說只是一種夢,所以有問題只能自己想辦法解決;下方筆者會一步一步地帶大家設定好在Lambda中同時使用VPC與NAT Gateway的功能,至於原理為何,因為牽扯到網路概論,所以筆者也無法說明那麼詳細。
建立二個Lambda
要試驗VPC與NAT的功能,最快的方式是建立二Lambda,利用Lambda A呼叫Lambda B的方式即可進行測試,所以我們快速的建立二個Lambda,
Lambda A的程式碼(Lambda名稱callLambda)
----------------------------------------
var aws = require('aws-sdk');
exports.handler = (event, context, callback) => {
var lambda = new aws.Lambda({
region: 'us-east-1' //change to your region
});
lambda.invoke({
FunctionName: 'calledLambda',
Payload: JSON.stringify(event, null, 2) // pass params
}, function(error, data) {
if (error) {
console.log('error',error);
context.done('error', error);
return;
}
if(data.Payload){
context.succeed(data.Payload)
}
});
};
----------------------------------------
Lambda B的程式碼(Lambda名稱callLambda)
----------------------------------------
exports.handler = (event, context, callback) => {
// TODO implement
callback(null, '{A:"Hello from Lambda"}');
};
----------------------------------------
至於執行角色的部份,因為是透過Lambda A去呼叫Lambd B,所以必須有Lambda的呼叫功能,另外還需要存取VPC的權限,建設直接設一個AWSLambdaFullAccess給它吧。
而時間上,因為預期會出現Timeout,所以設定Lambda的時間請不要超過10秒。
一開始我們先設定好二邊的Lambda都不要使用VPC,此時執行Lambda A的Test,使用最簡單的「Hello World」模式進行測試:
而測試的結果:
這樣代表Lambda A呼叫Lambda B成功了。接下來我們將Lambda A設定於VPC內,保持Lambda B設定不變:
設好後再重新呼叫Lambda A,此時就會出現timeout的現象:
原因就是我們上方談論的,Lambda並無一個對外IP,所以無法呼叫外部的資源。
建立與設定NAT Gateway
接下來我們要架設一個有NAT Gateway的環境,預計的結果會長成這樣:
出處:AWS官網,不過筆者會依照筆者自己的方式來建立,不會完全依照官網上的設定,我們先至AWS的VPC網頁中,開始來建立我們的環境。
Step 1-選擇或建立subnet
進入網頁中,首先先切換到subnet的選項中:
在這裡我們必須先選擇好Public subnet及Private subnet,讀者可以自行決定好要建立新的subnet,不過筆者建議是一個Public subnet及二個Private subnet,不管是建立或選擇,我們先將Tag標記上去,這樣之後在選擇時會比較方便,如下圖:
筆者選擇了AWS建立好的三個subnet,直接使用,並分別標記。
Step 2-建立NAT Gateway Instance
再來我們到NAT Gateway的選項中去建立一個新的NAT Gateway,要注意一下,建立NAT Gateway就會開始收費了喔:
選擇我們剛剛要賦予NAT Gateway的subnet,並跟AWS要一個EIP:
設定完後按建立即可。
關於EIP的費用部份,不知道讀者還有印象嗎?EIP的收費規則是比較特殊的,沒有使用才需要付費,所以這裡我們要了一個EIP,並將它設定給NAT Gateway,那麼只需要付NAT Gateway的部份,EIP的部份是不用付費的。
**注意**
將NAT Gateway Instance刪除了,必須過一~二分鐘才能去EIP那邊進行Release,所以讀者不要忘了這個時間差,否則刪除NAT Gateway Instance卻沒有Release EIP,就會需要支付EIP的費用,EIP的Release方式如下:
在使用中的EIP是無法Release的。
Step 3-Route table的建立與設定
接來我們切換到Route table的頁面去,先建立一個Route table:
因為我們目前只有一個VPC,所以沒什麼好選的,只要輸入Name tag即可。
建立好Route table後,目前共有二張Route table,我們選擇剛剛建立好的Route table,並選擇下方的Routes後,按「Edit」,將剛剛建立好的NAT Gateway加入這張Route table中,如下:
設定好按儲存後,這張Route Table即是我們的Public subnet了,同樣在這一張Route Table中,我們選擇旁邊的「Subnet Associations」,將Private subnet結合起來,如下圖:
這樣子,這個Public subnet就可以通Private subnet了。
再來是原本就有的Route table(不是我們建立的那一張喔),一樣進去設定它的「Subnet Associations」,如下圖:
這樣二邊的subnet就可以互通了。
測試
再來回到剛剛的Lambda A,將我們設定好的subnet(lambda-to-public1和labmda-to-public2)設給Lambda A:
重新測試:
結果就會成功了,這樣就代表我們在VPC下的任何服務,都可以呼叫外部的服務了。
**注意**
第一次Lambda A呼叫Lambda B有點久,原因是因為Lambda在起動中,不要因此把原因怪在VPC,要討論時間的問題時,請直接以第二次執行的時間來考量。
留言列表