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,要讨论时间的问题时,请直接以第二次执行的时间来考量。

相关文章