dongfg' blog

无数渺小的思考填满了人的一生

0%

阿里云函数计算使用经验分享

介绍

如果没有接触过函数计算可以先去官网了解一下,简单来说函数计算本身只包含函数执行功能,数据存储、文件存储、日志记录等需要使用阿里云的服务,通过 VPC 相关配置也可以实现访问 VPC 里的资源,比如自建的数据库。

为什么选择函数计算

我主要看中两点,稳定跟免费额度。

  • 稳定是相比于在自己 VPS 上部署服务,而且有的服务比较简单,单独写应用没有必要。
  • 免费额度,一般自己的 VPS 配置不高,部署不了太多服务。

目前(2021 年 9 月)函数计算的免费额度包含:每月 100 万次函数调用次数 + 每月 40万(GB-秒)资源使用量 (执行时间、CPU 消耗、内存占用的量化),具体查看产品计费

使用场景

  • 爬虫
  • 反向代理
  • 静态网站
  • 简单 HTTP 服务

代码开发

官方支持多种语言开发,比如 node 是导出函数、Java 是实现 StreamRequestHandler 接口。

此外还支持自定义运行环境,自定义运行环境本质是用可执行文件 bootstrap 作为入口,运行后监听 0.0.0.0:CAPort*:CAPort, CAPort 从环境变量中获取。我的使用场景都是 HTTP 服务,使用的自定义运行环境方便使用任意语言开发,也方便迁移。

访问方式

函数计算可以绑定自己的域名(CNAME 方式),域名绑定后添加路由配置即可。

比如绑定的域名为 fun.dongfg.com,有两个函数 fc1,fc2,可以添加路由 fun.dongfg.com/fc1 -> fc1, example.com/fc2 -> fc2

为了后续自动部署方便,我是用的是泛域名绑定,*.fun.dongfg.com,每个函数使用单独的三级域名绑定,fc1.fun.dongfg.com -> fc1, fc2.fun.dongfg.com -> fc2

https 支持选择云盾里已有的证书,但是阿里云免费证书只支持单域名,我使用的自定义证书,证书通过 acme.sh 申请 Let's Encrypt 免费泛域名证书。

自动化部署流程

acme.sh 证书自动申请更新

通过 CI 自动执行,证书申请后上传到制品仓库,acme.sh 通过 docker 运行,证书通过 dns 方式申请,申请脚本 issue.sh 参考:

1
2
3
4
5
6
#!/bin/bash

docker run --rm -id -v "$(pwd)/out":/acme.sh -e Ali_Key=$Ali_Key -e Ali_Secret=$Ali_Secret --net=host --name=acme.sh neilpang/acme.sh daemon
docker exec acme.sh --set-default-ca --server letsencrypt
docker exec acme.sh --issue --dns dns_ali -d fun.dongfg.com -d *.fun.dongfg.com
docker stop acme.sh

Jenkinsfile 参考(Coding.Net 的持续集成服务)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
pipeline {
agent any
stages {
// ...

stage('申请证书') {
steps {
withCredentials([cloudApi(credentialsId: 'ca25bc86-c0dc-4b7f-a9a9-3074cfce12fa', secretIdVariable: 'Ali_Key', secretKeyVariable: 'Ali_Secret')]) {
sh './issue.sh'
}
}
}
stage('上传证书') {
steps {
sh """
mv out/fun.dongfg.com/fullchain.cer ssl.fun.cer
mv out/fun.dongfg.com/fun.dongfg.com.key ssl.fun.key
"""
codingArtifactsGeneric(files: 'ssl.fun.cer', repoName: 'secrets')
codingArtifactsGeneric(files: 'ssl.fun.key', repoName: 'secrets')
}
}
}
}

函数部署流程

  • 代码包构建:构建出 bootstrap 执行文件及其他依赖
  • ssl 证书下载:下载之前申请的证书文件,泛域名证书多个函数共用一个证书
  • 函数部署:使用 Funcraft 或者新工具 Serverless Devs 部署

一些踩过的坑

为什么服务运行一会就停止了

函数不会一直运行,最长运行时间为限制为 10 分钟,如果函数长时间没有访问,实例会停止,下次访问会冷启动,所以无法实现定时任务,异步任务这类功能。

目录不可写导致服务无法启动

运行环境只有 /tmp 目录有可读写权限,需要把临时文件、日志这些写入目录配置到该处。

函数执行超时

函数默认执行最大时间为 3 秒,可适当加大配置。

运行环境中执行时报错 “permission denied” 导致服务无法启动

原因一般是打包出的 bootstrap 没有可执行权限。

VPC 部署

官方常见问题索引

常见问题索引