今天才正式有時間來試著將cloud function推上到google cloud function。而本來認為用serverless可以省去不少時間,但不盡如此,故特地將過程記錄下來。
一開始最直覺的想法是到serverless官網上看有沒有範例,但在官網上利用filter的方式找GCP配合golang,會找不到任何範例。本想說那就找AWS配合golang,最找GCP配合nodejs,再折衷的把二個範例裡的部份內容抽出來,進行組合和運用。所幸在example裡找到了二年沒有更新的範例。就想直接將這個範例放到專案裡進行佈吏署的試驗,若是可以也就不用自行在那組合、折解、合併。不過沒想到這中間有一些文件沒有特別更新到的說明部份,讓整個deploy花了不少時間。
先來看原始的碼中放的serverless.yml和搭配範例的另一份文件,文件算是很詳細,主要就二部份要處理,一個是開啓API,另一個則是創立service account後給權限。
service: golang-simple-http-endpoint
frameworkVersion: ">=1.33.0 <2.0.0"
package:
exclude:
- node_modules/**
- .gitignore
- .git/**
plugins:
- serverless-google-cloudfunctions
# The GCF credentials can be a little tricky to set up. Luckily we've documented this for you here:
# https://serverless.com/framework/docs/providers/google/guide/credentials/
#
# NOTE: the golang runtime is currently in alpha state, you must have access from google to use the alpha toolchain
provider:
name: google
runtime: go111 # currently both vendored and go.mod repos are supported
project: sborza-91 # replace with your project name here
credentials: ~/.gcloud/slsframework.json # path must be absolute, change to whichever keyfile you need
functions:
hello:
handler: Hello
events:
- http: path
為了要佈署而產生的一份Dockerfile,這份是依照其README.md的步驟寫的
# FROM node:latest
COPY . /app
WORKDIR /app
RUN npm install -g serverless
RUN serverless deploy -v
但執行時首先會碰到的問題是serverless版本,現在已經是2.1.x版了,所以要更新那。project不用說,肯定是要更新成目前GCP的project id。而runtime,從這份文件可以知道目前已到了1.13版,所以可以換成go113。那份slsframework.json就是service account產生出的json檔。
不過若是直接執行還是會有錯。參考了這二個討論,知道了是少了npmc install
安裝相依性。
但修正完後還是會看到"cloudfunctions.v1beta2.function
相關的錯誤訊息。找了一大堆的討論和文章,終於找到了,原來是serverless-google-cloudfunctions版本太舊
更新package.json到拿取最新的版本即可
"dependencies": {
"serverless-google-cloudfunctions": "*"
}
調整之後可以用
serverless deploy
將範例的cloud function推上去。但使用
serverless logs --function hello
還是會得到
Error: The caller does not have permission
的訊息。只好先撇開這個錯誤,先往下試再加入一個範例,否可以正常的推上去。而這個範例就是Auth Trigger的cloud function。不過在serverless官方的網站上只看到pub sub event的範例,沒有auth的,而在討論裡也只有看到cloud storage的trigger寫法,當下並不清楚如果是auth event要怎麼寫。
還好找gcp官方文件裡可以看到
文件裡的這一段話很讓人在意,
The gcloud command below deploys a function that is triggered by legacy Pub/Sub notifications on a specific topic. These notifications are supported for legacy functions already consuming these events. However, we recommend using the --trigger-topic flag instead, as the legacy notifications might be removed at a future date.
gcloud functions deploy FUNCTION_NAME \
--trigger-resource TOPIC_NAME \
--trigger-event providers/cloud.pubsub/eventTypes/topic.publish \
FLAGS...
回看到serverless的文件,好像就是之前版本的用法,至於新的用法是可行的嗎?
利用serverless放到firebase後,原先的http function是不會有問題的,但auth則呈現出錯誤的圖示
"status": {
"code": 3,
"message": "Build failed: # serverless_function_app/main\nsrc/serverless_function_app/main/main.go:24:43: cannot refer to unexported name hello.helloAuth\nsrc/serverless_function_app/main/main.go:24:43: undefined: hello.helloAuth\nsrc/serverless_function_app/main/main.go:26:44: cannot refer to unexported name hello.helloAuth\nsrc/serverless_function_app/main/main.go:26:44: undefined: hello.helloAuth; Error ID: 6191efcd"
}
看樣子,只是一個大小寫的新手錯誤。順利的話,就可以開始進行撰寫實際行為的工作了。