三分钟解决函数计算访问小程序 IP 白名单问题

本文涉及的产品
简介: 背景 当你使用函数计算服务访问第三方服务的时候,第三方服务出于安全考虑,要求你设置一个白名单,比如:微信小程序等。但是函数计算服务的 IP 是动态且不可枚举的。为了能够让函数计算服务支持设置白名单,目前有两种常用的方式:ECS + EIP + Nginx 搭建代理和 NAT + EIP,第一个访问操作起来可能比较麻烦,需要准备一台 ECS,第二种方式操作简单,费用可能会高些。

该文章过时

最新的方案可以参考:函数计算+NAT网关,函数从此有IP

背景

当你使用函数计算服务访问第三方服务的时候,第三方服务出于安全考虑,要求你设置一个白名单,比如:微信小程序等。但是函数计算服务的 IP 是动态且不可枚举的。为了能够让函数计算服务支持设置白名单,目前有两种常用的方式:ECS + EIP + Nginx 搭建代理和 NAT + EIP,第一个访问操作起来可能比较麻烦,需要准备一台 ECS,第二种方式操作简单,费用可能会高些。接下来,我们基于 ECI + EIP + Nginx 三分钟低成本固定函数公网 IP。三种方案示意图如下:

image

步骤

1. 创建专有网络和交换机

可以参考帮助文档:创建专有网络和交换机,如下图所示:image

注意:函数计算服务在杭州的可用区是可用区 G,所以直接为专有网络创建可用区 G 的交换机,如果你的函数在别的地域,可以创建对应地域的可用区交换机即可。

2. 为专有网络创建安全组

可以参考帮助文档:安全组,如下图所示:
image

模板属性选择自定义,专有网络选择上一步创建好的,其他属性按照默认来就好了,创建完后,马上配置安全规则,如下图所示:
image

3. 申请 EIP

可以参考帮助文档:申请 EIP,如下图所示:
image

注意:申请 EIP,请选择你当前的地域,我的示例的地域是杭州,所以我选择的是杭州。

4. 创建 ECI

可以参考帮助文档:创建和部署容器实例

专有网路、交换机、弹性公网 IP(EIP)和安全组使用前面创建的,如下图所示:
image

数据卷配置,Path 属性必须是 default.conf ,如下图所示:
image

容器组基本配置,其中 vCPU 和内存,我选择最低配置,你可以根据自己的需要选择合适的配置,配置越高,费用也会越高,镜像请选择 docker 官方的 nginx 镜像,版本选择 latest,如下图所示:
image

容器组数据卷配置,数据卷选择前面添加的,Monut Path 属性必须是 /etc/nginx/conf.d ,如下图所示:
image

5. 函数通过代理访问第三方服务

这里我们打算在函数计算创建一个服务,服务绑定前面创建的专有网络、路由器和安全组,并在服务下创建两个函数 demo 和 demo2,demo2 代表第三方服务,假设 demo2 要求提供固定ip作为白名单加入到其 iptables 配置中。demo 通过代理服务访问 demo2,代理服务为 demo 提供固定 IP。

通过函数计算控制台创建服务,需要为服务关联前面步骤创建的专有网络,如下图所示:
image

服务的权限配置,如下图所示:
image

当前服务下,创建函数 demo,demo 的逻辑是通过代理服务触发 demo2,demo2 被触发的方式是 Http 触发器,代码如下:

var http = require('http');

module.exports.handler = function(event, context, callback) { 
  var options = {
    host: '192.168.0.53', // ECI 容器组内网地址
    port: 80,
    path: '/2016-08-15/proxy/nginx-proxy/demo2/', // 被代理的路径加参数
    headers: {
      Host: 'xxxxxx.cn-hangzhou.fc.aliyuncs.com'  // 被代理的域名
    }
  };
  http.get(options, function(res) {
    if (res.statusCode !== 200) {
      callback('error!');
    }
    var size = 0;
    var chunks = [];
    res.on('data', function(chunk){
        size += chunk.length;
        chunks.push(chunk);
    });
    res.on('end', function(){
        var data = Buffer.concat(chunks, size);
        callback(null, data.toString()); 
    }).on('error', (e) => {
        callback(e);
    });
  });
};

创建函数 demo2,需要为 demo2 配置 Http 触发器,Http 触发器的配置如下图所示:
image

demo2 逻辑是返回请求相关信息,如请求的 ClientIP 等,代码如下:

var getRawBody = require('raw-body');
var getFormBody = require("body/form");
var body = require('body');

module.exports.handler = function(req, resp, context) {

    var params = {
        path: req.path,
        queries: req.queries,
        headers: req.headers,
        method : req.method,
        requestURI : req.url,
        clientIP : req.clientIP,
    };
        
    getRawBody(req, function(err, body) {
        for (var key in req.queries) {
          var value = req.queries[key];
          resp.setHeader(key, value);
        }
        params.body = body.toString();
        resp.send(JSON.stringify(params, null, '    '));
    }); 
      
}

结果验证:执行 demo 函数,返回结果的 clientIP 为 EIP 的 IP 地址,说明代理成功,返回结果如下:

{
   "path": "/",
   "queries": {},
   "headers": {},
   "method": "GET",
   "requestURI": "/2016-08-15/proxy/nginx-proxy/demo2/",
   "clientIP": "47.110.xx.xx",
   "body": ""
} 

小结

基于 ECI 实现固定函数 IP,函数中调用第三方服务的方式需要访问代理服务器,并且请求必须带上请求头参数 Host ,值为需要代理的域名。另外,必须要绑定专有网络和 EIP,所以费用主要来自 ECI 和 EIP,如果按照最低配置来计算:
ECI 费用:(0.000035 * 0.25 + 0.00000875 * 0.5) * 3600 * 24 = 1.512 元/天
EIP 费用:23 / 30 = 0.767 元/天
费用合计:2.279 元/天

相关实践学习
基于函数计算一键部署掌上游戏机
本场景介绍如何使用阿里云计算服务命令快速搭建一个掌上游戏机。
建立 Serverless 思维
本课程包括: Serverless 应用引擎的概念, 为开发者带来的实际价值, 以及让您了解常见的 Serverless 架构模式
目录
相关文章
|
2月前
|
移动开发 小程序 API
【小程序质量提优解决方案】(三)内嵌H5页面访问受限
【小程序质量提优解决方案】(三)内嵌H5页面访问受限
82 0
|
4月前
|
JavaScript 前端开发 Serverless
函数计算只支持Node.js,我用C++写的程序怎么运行?
函数计算只支持Node.js,我用C++写的程序怎么运行?
90 1
|
2月前
|
移动开发 运维 小程序
【4月开发者日回顾】小程序审核驳回增加页面截图;H5域名白名单的配置将实时生效……
【4月开发者日回顾】小程序审核驳回增加页面截图;H5域名白名单的配置将实时生效……
48 0
|
8月前
|
小程序 Java 应用服务中间件
云服务器上安装配置tomcat并在Tomcat上放置自己写入的一个小程序并添加外网访问端口的教程(超级详细版)
云服务器上安装配置tomcat并在Tomcat上放置自己写入的一个小程序并添加外网访问端口的教程(超级详细版)
155 0
|
26天前
|
关系型数据库 Serverless 分布式数据库
Serverless 应用引擎常见问题之在抖音快手小程序上使用如何解决
Serverless 应用引擎(Serverless Application Engine, SAE)是一种完全托管的应用平台,它允许开发者无需管理服务器即可构建和部署应用。以下是Serverless 应用引擎使用过程中的一些常见问题及其答案的汇总:
22 3
|
2月前
|
小程序 IDE Serverless
【经验分享】支付宝小程序serverless云开发拓荒
【经验分享】支付宝小程序serverless云开发拓荒
80 0
|
3月前
|
Serverless 开发者 微服务
serverless应用引擎问题之程序包维护如何解决
在进行Serverless应用开发和部署时,开发者可能会遇到不同类型的报错信息;本合集着重收录了Serverless环境中常见的报错问题及其解决策略,以助于开发者迅速诊断和解决问题,保证服务的连续性和可用性。
220 1
|
3月前
|
前端开发 JavaScript 小程序
亚马逊云科技 Build On -Serverless低代码平台初体验-快速完成vue前端订单小程序
亚马逊云科技 Build On -Serverless低代码平台初体验-快速完成vue前端订单小程序
47 0
|
3月前
|
小程序 API
微信小程序如何访问私读文件
微信小程序如何访问私读文件
127 0
|
4月前
|
监控 安全 JavaScript
函数计算构建弹性应用程序介绍
函数计算构建弹性应用程序介绍
77 2

相关产品

  • 函数计算