使用 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);
});
意見回饋
如果有任何建議或問題,可傳送「意見表單」給我,謝謝~