背景
函数计算(FC)作为用户逻辑执行者与传统serverful的执行者一大优势是百毫秒级别的动态伸缩。Serverless的方式在很多场景下无疑可以提高资源利用率为用户降低成本,然而高速动态的伸缩模式也带来了和传统执行方式的不同。FC的用户常问的一个问题是:函数计算机器的IP是什么?这个问题的出现是因为很多用户函数访问的服务有基于IP的白名单/防火墙,如微信小程序。由于FC的机器是根据用户的请求新增释放,机器的公网IP不固定,也没有机制为用户分配固定网段,这样的环境中如何去访问微信小程序这样的服务呢?之前有使用ECS/ECI proxy方式解决这类问题的文章三分钟解决函数计算访问小程序 IP 白名单问题,本文将介绍另一种使用函数计算VPC+NAT网关使得函数公网出方向有一个固定的EIP,从而实现允许函数计算去访问需要有公网IP做白名单验证的服务。
原理
解决方案的原理在本质上和阿里云用户个人VPC中不赋予实例public IP但是允许这些VPC实例可以访问公网地址的原理是一样的,简单说就是创建NAT网关 绑定公网EIP,最后添加SNAT条目,从而允许VPC内的实例通过绑定的EIP 去访问公网,公网接收端看到的client IP只有NAT上绑定的EIP。FC访问用户VPC中的资源就是通过FC Service VPC中的实例通过attach用户VPC内的弹性网卡ENI 将函数实例中的流量通过用户的弹性网卡进入用户VPC,如果用户函数通过attached ENI访问公网, 流量同样按照SNAT条目 (VSwithch/ECS -> public IP的映射),通过绑定在NAT上的EIP出向公网,client IP即EIP address.
配置步骤
假设用户已经有一个VPC,VSwitch,安全组 (如还没有请参考 配置VPC功能), 只需要3个步骤:
- 创建一个使用用户VPC的FC Service和测试函数
- 创建一个NAT Gateway + EIP的组合, 并绑定EIP到新创建的NAT Gateway
- 添加一条SNAT条目,映射FC Service 所在的switch到绑定的EIP
下文将逐步详细讲解各配置配置方法
创建FC Service/Function
- 如图中所示创建Service时选择已有的VPC, Vswitch和SecurityGroup
- 特别注意:
Internet Access
选项需要关掉,否则流量会优先从函数实例的公网IP出向internet,而不是NAT EIP - 服务角色(Service Role)要配置AliyunECSNetworkInterfaceManagementAccess策略, 详见配置VPC功能
- 服务创建好后编写一个简单的python2.7 测试函数
import logging
import requests
def handler(event, context):
logger = logging.getLogger()
# Ask myip.ipip.net, what is my IP?
r = requests.get('https://myip.ipip.net')
clientIP = r.content.split()[1]
logger.info('Client IP ' + clientIP)
return clientIP
配置NAT Gateway + EIP
在
NAT网关
控制台,选择组合购买EIP
, 该步骤创建NAT网关和公网EIP- 选择对应的VPCID
- 示例选择新购EIP,也可以使用已有的EIP
- 创建好NAT和EIP后,将EIP绑定到NAT网关
添加SNAT条目
- 在相关NAT网关详情中找到
SNAT列表
,并创建SNAT条目
- 选择与FC Service绑定的Vswitch作为
交换机
- 选择与该NAT网关绑定的EIP作为
公网IP地址
测试
完成以上三个步骤后,调用前面步骤创建好的测试函数, 访问myip.ipip.net端收到的client IP即为NAT网关绑定的EIP地址,这个地址就可以作为微信小程序等白名单验证的IP地址了。
总结
本文介绍了使用NAT网关+EIP解决FC访问公网服务需要固定白名单IP地址的问题。相比较使用ECS/ECI代理,这个方案具有天生的高可用和无运维的优势,配置也相对简单。不足是NAT网关价格最少12元/天,比较ECI的方式 (2.28元/天) 价格略高。这个方案更适合可用性要求高,成本压力小的关键业务。至此FC访问需要IP白名单验证的
第三方服务的各个方案已经有了详细介绍,用户可根据实际情况和需求合理选择。