函数计算(Function Compute):函数计算 是事件驱动的全托管计算服务。使用函数计算,您无需采购与管理服务器等基础设施,只需编写并上传代码。函数计算为您准备好计算资源,弹性地可靠地运行任务,并提供日志查询、性能监控和报警等功能。借助函数计算,您可以快速构建任何类型的应用和服务,并且只需为任务实际消耗的资源付费。

访问 PostgreSQL 数据库是指在函数计算中通过编写代码调用数据库驱动库通过 TCP 协议实现对数据库进行的插入、查询等操作。通常函数计算中运行的不同函数实例之间是不共享状态的,对于结构化的数据可以通过数据库的形式进行持久化以实现状态共享。由于用户函数运行在函数计算的 VPC 中,而用户的数据库运行在用户所属的 VPC 中,所以在函数计算平台访问数据库会涉及到跨 VPC 访问的场景,下面我们先来介绍一下其工作机制。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NUMFeKxJ-1587870811722)(https://data-analysis.cn-shanghai.log.aliyuncs.com/logstores/article-logs/track_ua.gif?APIVersion=0.6.0&title=Serverless%20%E8%A7%A3%E6%83%91%E2%80%94%E2%80%94%E5%87%BD%E6%95%B0%E8%AE%A1%E7%AE%97%E5%A6%82%E4%BD%95%E8%AE%BF%E9%97%AE%20PostgreSQL%20%E6%95%B0%E6%8D%AE%E5%BA%93&author=%E7%94%B0%E5%B0%8F%E5%8D%95&src=article)]

工作机制

访问 PostgreSQL 的原理、工作机制与访问 Mysql 数据库完全相同,本文不再重复阐述,更详细的内容请参考 访问 Mysql 数据库 中的工作机制章节。

配置与函数编写

公共配置

创建专有网络VPC

  1. 登录 VPC控制台。
  2. 参阅 VPC 搭建专有网络 创建VPC和交换机。

创建安全组

在安全组控制台 新建安全组,点击 创建安全组,设置安全组名称,网络类型选择 专有网络,并选择刚才创建的专有网络。

注意:设置安全组策略的时候,需要在出口方向放行 PostgreSQL 实例的端口和配置的 VPC 内网 IP 段。

创建与配置 PostgreSQL 实例

  1. 创建适合业务需求的云数据库 PostgreSQL 版实例可以参考 云数据库 PostgreSQL 版。

注意:创建云数据库 PostgreSQL 版实例需要选择和函数计算配置相同的 VPC 实例,可以配置和函数计算不同的可用区的交换机,因为相同的 VPC 实例下不同可用区交换机内网是互通的。

  1. 创建成功后,在实例信息页面左侧的导航栏中单击数据安全性

  2. 单击 添加白名单分组

  3. 在弹出的对话框中,将函数计算所在的 VPC 网络的网段地址配置在白名单输入框中。

    1. 登录 VPC 控制台,在专有网络列表中找到应用所在的 VPC,单击该 VPC 的名称进入专有网络详情页面。
    2. 复制应用所在的 VPC 的 IPv4 网段
    3. 组内白名单设置框中粘贴该 VPC 的 IPv4 网段地址,然后单击确定
  4. 最后访问 PostgreSQL 数据库 host 为实例的内网地址,可以登录阿里云控制台查看:

函数计算配置 VPC

注意:函数计算服务所在区域与公共配置中创建的资源所在区域一致。

  1. 在 函数计算控制台 创建服务。

    • 创建服务步骤请参考文章 服务的增删改查
  2. 【专有网络配置】选项中,选择您在步骤一中创建的 VPC 网络,交换机、安全组。
  3. 【权限配置】选项中,选择【新建角色】,点击【点击授权】,在角色快速创建页面,点击【同意授权】。
    • 这步的操作是授予函数计算对 ENI 的操作权限,函数计算访问 VPC 中资源需要的权限请参考文章 配置函数计算访问 VPC 内的资源
  4. 点击确定,新建服务完毕。

函数编写与调试

下面演示 Python3 开发语言访问 PostgreSQL 数据库。

使用 Fun 工具在建立存放代码和依赖模块目录下安装依赖和项目部署。

Python3

  1. 在本地建立一个目录,用于存放代码和依赖模块,在该目录下新建 template.yml 文件,例如 /tmp/code/template.yml,内容如下。

    ROSTemplateFormatVersion: '2015-09-01'
    Transform: 'Aliyun::Serverless-2018-04-03'
    Resources:PostgreSQL-test:Type: 'Aliyun::Serverless::Service'Properties:Description: This is PostgreSQL serviceRole: 'acs:ram::1986114430***:role/fc-public-test'SimpleRequestVpcConfig:VpcId: vpc-****VSwitchIds:- vsw-***SecurityGroupId: sg-***InternetAccess: truepython-test:Type: 'Aliyun::Serverless::Function'Properties:Handler: 'index.handler'Initializer: 'index.initializer'Runtime: python3Timeout: 10MemorySize: 128CodeUri: './'EnvironmentVariables:HOST: pgm-bp1yawvyyu***.pg.rds.aliyuncs.comPASSWORD: Txd123**PORT: 1433DATABASE: test_123USER: ***
  2. 在该目录下创建 Funfile 文件内容如下。

    RUNTIME python3
    RUN fun-install pip install psycopg2
    
  3. 执行fun install命令安装依赖:

    $ fun install
    using template: template.yml
    start installing function dependencies without docker
    安装过程。。。。
    Install Success
    
  4. 在函数根目录下新建代码文件,例如 /tmp/code/index.py ,内容如下。

    # -*- coding: utf-8 -*-
    import logging
    import psycopg2
    import os,sys
    logger = logging.getLogger()def getConnection():try:conn = psycopg2.connect(database = os.environ['DATABASE'],user = os.environ['USER'],password = os.environ['PASSWORD'],host = os.environ['HOST'],port = os.environ['PORT'],)return connexcept Exception as e:logger.error(e)logger.error("ERROR: Unexpected error: Could not connect to PostgreSQL instance.")sys.exit()def conditionallyCreateUsersTable():conn = getConnection()cur = conn.cursor()cur.execute('''CREATE TABLE COMPANY(ID INT PRIMARY KEY     NOT NULL,NAME           TEXT    NOT NULL,AGE            INT     NOT NULL,ADDRESS        CHAR(50),SALARY         REAL);''')conn.commit()conn.close()def initializer(context):conditionallyCreateUsersTable()def handler(event, context):try:conn = getConnection()cur = conn.cursor()cur.execute("INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) \VALUES (1, 'Paul', 32, 'California', 20000.00 )");conn.commit()return 'successfully'finally:conn.close()
    
  5. 执行以下命令部署函数。

    $ fun deploy -y
    using template: template.yml
    using region: cn-hangzhou
    using accountId: ***********3743
    using accessKeyId: ***********Ptgk
    using timeout: 60部署过程。。。function python-test deploy success
    service PostgreSQL-test deploy success
    

登录控制台,即可看到相关的服务、函数被创建成功,且触发执行可以返回正确的结果。

总结

通过本文介绍可以快速实现函数计算访问 PostgreSQL 数据库。

使用函数计算带来的优势:

  1. 无需采购和管理服务器等基础设施,只需专注业务逻辑的开发,可以大幅缩短项目交付时间和人力成本;
  2. 提供日志查询、性能监控、报警等功能快速排查故障;
  3. 免运维,毫秒级别弹性伸缩,快速实现底层扩容以应对峰值压力,性能优异;
  4. 成本极具竞争力;

“阿里巴巴云原生关注微服务、Serverless、容器、Service Mesh 等技术领域、聚焦云原生流行技术趋势、云原生大规模的落地实践,做最懂云原生开发者的技术圈。”

Serverless 解惑——函数计算如何访问 PostgreSQL 数据库相关推荐

  1. Serverless 解惑——函数计算如何访问 Mongo 数据库

    函数计算(Function Compute):函数计算 是事件驱动的全托管计算服务.使用函数计算,您无需采购与管理服务器等基础设施,只需编写并上传代码.函数计算为您准备好计算资源,弹性地可靠地运行任务 ...

  2. Serverless 解惑——函数计算如何访问 Redis 数据库

    函数计算(Function Compute):函数计算 是事件驱动的全托管计算服务.使用函数计算,您无需采购与管理服务器等基础设施,只需编写并上传代码.函数计算为您准备好计算资源,弹性地可靠地运行任务 ...

  3. Serverless实战 —— 函数计算如何访问 MySQL 数据库

    Serverless实战 -- 函数计算如何访问 MySQL 数据库 函数计算(Function Compute):函数计算 是事件驱动的全托管计算服务.使用函数计算,您无需采购与管理服务器等基础设施 ...

  4. serverless mysql_Serverless 解惑——函数计算如何访问 MySQL 数据库

    函数计算(Function Compute):函数计算 是事件驱动的全托管计算服务.使用函数计算,您无需采购与管理服务器等基础设施,只需编写并上传代码.函数计算为您准备好计算资源,弹性地可靠地运行任务 ...

  5. Serverless 解惑——函数计算如何访问 SQL Server 数据库

    函数计算(Function Compute):函数计算 是事件驱动的全托管计算服务.使用函数计算,您无需采购与管理服务器等基础设施,只需编写并上传代码.函数计算为您准备好计算资源,弹性地可靠地运行任务 ...

  6. 函数计算如何访问 PostgreSQL 数据库

    函数计算(Function Compute):函数计算 是事件驱动的全托管计算服务.使用函数计算,您无需采购与管理服务器等基础设施,只需编写并上传代码.函数计算为您准备好计算资源,弹性地可靠地运行任务 ...

  7. redis的那种目录结构能新建么_Serverless 解惑——函数计算如何访问 Redis 数据库...

    函数计算(Function Compute):函数计算 是事件驱动的全托管计算服务.使用函数计算,您无需采购与管理服务器等基础设施,只需编写并上传代码.函数计算为您准备好计算资源,弹性地可靠地运行任务 ...

  8. Serverless 解惑——函数计算如何安装字体

    前言 首先介绍下在本文出现的几个比较重要的概念: 函数计算(Function Compute): 函数计算是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情况,只需编写代码并上传.函数计算 ...

  9. windows下c 用mysql数据库_Windows环境下C/C++访问PostgreSQL数据库

    PostgreSQL是一款在Linux环境下应用十分广泛的轻量级关系型数据库,大家都听说过MySQL,却对PostgreSQL鲜有耳闻,它其实在性能.应用领域上和MySQL不相上下.网上关于Windo ...

最新文章

  1. 周志华教授发表首届国际学习与推理联合大会IJCLR开场Keynote:探索从纯学习到学习+推理的AI...
  2. input js 离开事件_听说你熟练使用Vue.js,这9种Vue技术你掌握了吗?
  3. 母亲,我怎么让你等了那么久(转载)
  4. php程序中报date错误
  5. Tesseract-OCR 字符识别---样本训练 [转]
  6. java构造函数调用其他程序的顺序_java初始化构造函数调用顺序
  7. 积极打破消极思维模式
  8. 11g新特性-自动sql调优(Automatic SQL Tuning)
  9. Python内置函数sorted()和列表方法sort()排序规则不得不说的事
  10. python实时数据存储与显示_利用python进行数据加载和存储
  11. android camera无预览拍照 后台拍照
  12. Echarts之风力风速玫瑰图
  13. 用easyx图形库做一个简单的c++小游戏---迷宫游戏
  14. java斗地主发牌教学,命令行版的斗地主你玩过没?
  15. 【数据采集平台】教程-单页面采集
  16. 电阻介绍及工作原理应用
  17. 二维数组横向和纵向遍历的巨大差距:缺页问题
  18. kali系统渗透window实现屏幕监控
  19. 3.1 SQL是什么?它能做什么
  20. SMTP与ESMTP的关系和区别

热门文章

  1. PC微信逆向:分析通用设置数组
  2. Python异步爬取知乎热榜
  3. 1111 Online Map (30 分)【难度: 一般 / 知识点: Dijkstra最短路】
  4. 1033 To Fill or Not to Fill (25 分)【难度: 难 / 知识点: 模拟 贪心】
  5. 1010 Radix (25 分)【难度: 难 / 知识点: 二分查找】
  6. Dubbo服务发布调用实现
  7. Zookeeper的配置文件
  8. python2.7安装matplotlib_Python安装Numpy和matplotlib
  9. 本地如何预览php文件上传,如何实现js上传图片本地预览同时支持预览截图的功能...
  10. 【JUC并发编程04】线程间定制化通信(单标志法存在的问题)