如何解决Lambda里需要连接限制ip访问的应用

cybozu发表于:2019年07月22日 18:30:30更新于:2019年09月02日 13:10:11

Index

我们在使用AWS Lambda来进行kintone和一些第三方产品进行整合开发的时候(比如高德地图,钉钉,微信等等),往往会遇到第三方应用需要提供服务端的出口IP白名单的问题。

如果将Lambda使用的全局IP地址放在这个白名单上貌似就没有问题了,但Lambda使用的IP地址范围非常广,而且范围每天都在变化,不易于管理。

其实我们可以利用AWS的VPC设置来解决这个问题。

原理图

λ-kintone

在VPC上创建NAT网关,并为该NAT网关分配EIP。

Lambda允许您通过私有网段,并通过位于公共网段的NAT网关访问钉钉等应用。
如果将NAT网关EIP放在白名单中,则可以安全地从Lambda连接到钉钉等应用。

设置方案

VPC
10.0.0.0/16

 

网段子网
公有子网10.0.10.0/24
私有子网

10.0.1.0/24

10.0.2.0/24

接下来的内容,我们将按照以上的设置方案来进行vpc的设置。  

AWS的VPC设置

创建VPC

首先,创建一个专用的Lambda VPC。从左侧菜单中选择VPC,然后从“Create VPC”创建。
在这种情况下,使用名称为“lambda_vpc”的“10.0.0.0/16”创建CIDR。

0015d36afc70026abb9199e21e808da

0015d36b027b40eaacfe1df489a72ca

创建Internet网关

这也很容易,从左侧菜单“Internet 网关”创建。名称标签使用“lambda_igw”。

0015d36b0fe5bd7a19364b21ce0d25e

0015d36b1efebd5b270ad82e23c30f0

我把它附加到我之前制作的“lambda_vpc”中。

0015d36b312252a19579732ce5dbdac

0015d36b316db698c524d5e8f4d36ca

创建子网

创建连接到Internet的公有子网和不直接连接到Internet的私有子网。

从左侧菜单中的片段中选择“创建子网”,如下所示。

[公有子网]
0015d36b56474ed683571e81b15afbe

[私有子网]
再创建两个私有子网,标签为lambda_prv1和lambda_prv2,cidr块分别为10.0.1.0/24和10.0.2.0/24

0015d36b640925e7999af7a0e136f39

创建公有子网的路由表

从左侧菜单中选择“路由表”,创建路由表“lambda_pub_rt”

0015d36b9ba2e19aa7246993b5e3538

0015d36b91ac388ca77df4971be2a24


选择刚创建的路由表,单击“路由”的“编辑路由”,指定“0.0.0.0/0”作为传输目的地,如下所示,并创建Internet网关(指定之前创建的lambda_igw)并保存。

0015d36ba3c4d16d296843fa4662b34

关联之前创建的公有子网(lambda_pub)

0015d36bfe0d0326b5ef340b3ea6320

0015d36bfe0dd1c545fb27f3877bbdd

创建NAT网关

接下来,我们将创建NAT网关,以便连接固定IP地址和kintone。

从菜单中选择“NAT 网关”,然后单击“创建NAT网关”。

0015d36bbeb249d083451efe0b1d6de

子网选择之前创建的公有子网(lambda_pub)。点击“新建EIP”,生成弹性IP

0015d36bcf58d06db5c401d7013498e


到此,您已经创建了NAT网关。

创建私有子网的路由表

接下来需要把这个NAT网关作为私有子网的默认网关,并且关联我们之前创建的两个私有子网。

单击路由表中的“创建路由表”,输入名称标签“lambda_prv_rt”,然后为VPC选择“Lambda_vpc”。

0015d36c17f92dbe30f806f00009a6d

选择创建的路由表,单击“路由”选项卡上的“编辑路由”,然后选择“0.0.0.0/0”作为目标,并在目标上添加刚才创建的NAT网关。

0015d36c344938d3fb741f66b923af6

最后,转到“子网关联”选项卡,并将私有子网与刚创建的路由表关联起来。

0015d36c38e088cd443452fdc98328a

0015d36c38f9970d20778e82fd89221

生成弹性IP

我们可以在弹性IP上看到我们生成的一个对外的IP。

0015d36c482f407ba4ceaf64e916e55

好了,我们的VPC设置结束了。

在钉钉上设置IP出口限制

在钉钉的小程序的应用的后台,设置服务器公网出口IP名单
0015d36c6ebe661963af0c42ebf81b4

Lambda设置

最后,为Lambda设置。

此外,需要附加策略“AWSLambdaVPCAccessExecutionRole”分配给运行Lambda函数的IAM角色。

或者,手动添加以下内容。
ec2:CreateNetworkInterface 
ec2:DescribeNetworkInterfaces 
ec2:DeleteNetworkInterface

这里我们将跳过基本的Lambda函数设置,并且只解释VPC设置部分。

我们事先已经创建好了之前说明的“lambda_vpc”的VPC。

0015d36c977dab7d639bc3962f8323a

执行下您创建的Lambda函数,看看Lambda是否成功访问了钉钉或者其他应用呢?

注意事项

  • 本示例代码不保证其运行。

  • 我们不为本示例代码提供技术支持。

相关链接

    注意:贴代码时请注意格式并使用"代码语言",与本文无关的问题请至“讨论社区”提问。