Google Cloud Functions
Google Cloud Functions 是一个无服务器的云端执行环境,常作为轻量化的 API 以及 webhooks 使用。这篇教学将会介绍如何使用使用 Google Cloud Functions。
快速导览:
什么是 Google Cloud Functions?
Google Cloud Functions 是 Google Cloud 里的服务,一个无服务器的云端执行环境,可以部署一些简单或单一用途的程序,当监听的事件被触发时,就会触发 Cloud Function 里所部署的程序,由于不需要服务器的特性,常常作为轻量化的 API 以及 webhooks 使用。
Google Cloud Functions 可以使用 Node.js、Python、Go、Java、.NET 或 Ruby 程序语言进行编辑,执行环境也会因为选择的运行时而产生差异,针对服务器管理、软件设置、框架更新或操作系统更新等基础设施的建置,全都由 Google 负责管理,用户完全不需要做任何事情,只需要专注在自己的程序码逻辑即可。
Cloud Functions 计费方式
启用 Cloud Functions 需要绑定个人信用卡,但 Cloud Functions 有提供免费的额度供开发者使用,如果用量不超过额度,则第一年内不会收费 ( Google 提供第一年几百美金的额度,通常单纯个人操作或小型的应用开发,基本上不可能一天百万次的呼叫额度 ),第二年开始的计费依据则会以函数的执行时间长度、函数的叫用次数,以及您为函数布建的资源数量来计算,最低一个月约 0.01 美金。
详细收费方式可参考:Cloud Functions 定价
建立 Cloud Cloud 专案
前往 Google Cloud Functions 页面,点击“免费试用”。
第一步,下拉选择个人基本信息,勾选同意服务条款。
第二步,输入电话号码,取得验证码后输入。
第三步,输入个人住址、信用卡信息,点击开始免费试用,就能开始使用。
完成后,进入 Google Cloud Platform ( GCP ) 控制台,建立一个专案,如果没有建立过专案,可能会要求建立一个新专案。
如果建立过专案,也可以点击专案名称打开视窗后,点击右上角新增专案进行新增。
启用 Cloud Build API
因为 Cloud Functions 需要搭配 Cloud Build API,必须先启用 Cloud Build API,建立专案之后,点击左上方图示打开左侧选单,选择“API 和服务 > 程序库”。
从程序库里搜索“build api”。
搜索到 Build API 后,点击“启用”。
接着点击“启用计费功能”。
选择付款的账户后,就可以启用 Cloud Build API ( 不需要太过担心付费的问题,因为如果是个人用户的用量,第一年基本上完全免费 )。
完成后会出现“API”已启用的标示,表示启用完成。
启用 Google Cloud Functions
专案建立完成后,如果没有自动跳转到 Cloud Functions,点选左上角图示展开选单,选择 Cloud Functions。
点选“建立函数”,就能开始建立第一支 Cloud Functions 的程序。
点选建立函数后,设定基本信息,环境选择“第一代”( 因为第二代在这个时间点貌似在 beta 阶段 ),函数名称自行定义,区域选择“asia-east1”台湾主机 ( 理论上速度比较快 )。
触发条件选择“HTTP”,勾选“允许未经验证的叫用”,如此一来就能单纯透过 request POST 或 GET 的方法进行叫用,也符合大多数聊天机器人的叫用机制。
执行阶段、建构作业、连线和安全型设定则不需要更动,保留默认值即可。
点选下一步,进入程序码编辑画面,从左上方下拉选单选择 Python 版本( 3.7~3.9 皆可 ),程序编辑区就会自动出现默认的 Python 样板,就可以准备开始编辑程序。
部署第一支程序
画面左侧目录里 main.py 表示这支程序的主程序码,requirements.txt 表示要额外安装的外部函数库。
右上方的“进入点”表示使用 HTTP 的方式叫用这支程序时,要执行的 funciton,也就是下方程序码的 hello_world。
在完全不执行任何动作的情况下 ( 使用默认 Python 样板 ),点击下方的“部署”,就能部署最基本的网页应用程序。
部署完成后,前方会出现绿色打勾的图示,表示部署一切正常 ( 没有发生任何错误 )。
点击进入程序,选择“触发条件”,点击并打开网址,就会看见网页出现“Hello World!”,表示已经可以透过外部呼叫所部署的程序。
读取参数
由于 Cloud Functions 的 Python 是使用 Flask 函数库的架构,因此读取参数的方式和 Flask 相同,将原本的程序码改成下方的内容,修改并重新部署完成后,输入网址叫用程序后,从“记录”里,就能看到叫用时对应的参数信息。
def hello_world(request):
request_json = request.get_json()
print(request.args ) # 讀取 GET 方法參數
print(request.form ) # 讀取 POST 方法參數
print(request.path ) # 讀取網址
print(request.method) # 讀取叫用方法
if request.args and 'message' in request.args:
return request.args.get('message')
elif request_json and 'message' in request_json:
return request_json['message']
else:
return f'Hello World!'
如果使用后端程序,亦可发出 POST 的请求。
import requests
data = {'name': 'oxxo', 'age': '18'}
web = requests.post('https://asia-east1-XXXXXX.cloudfunctions.net/test', data=data) # 發送 POST 請求
print(web.text)
处理跨域问题
透过浏览器打开网页呼叫 API 时,常常会遭遇“跨域”的问题 ( 因为浏览器的安全性限制,不同网域间无法直接叫用 ),使用 Cloud Functions 建立的 API 默认禁止跨域叫用,但只要加入下方的程序码,就能够允许跨域叫用。
def hello_world(request):
request_json = request.get_json()
print(request.args ) # 讀取 GET 方法參數
print(request.form ) # 讀取 POST 方法參數
print(request.path ) # 讀取網址
print(request.method) # 讀取叫用方法
headers = {
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Headers': 'Content-Type',
'Access-Control-Max-Age': '3600'
}
return ('Hello World!', 200, headers) # 回傳同意跨域的 header
完成后,在网页端执行对应的 JavaScript,就能得到正确的结果 ( 下方程序码为 JavaScript )。
let uri = '你的網址';
fetch(uri, {method:'GET'})
.then(res => {
return res.text()
}).then(result => {
console.log(result);
});
微信扫码关注
抖音扫码关注