CLI でGoogle Cloud Functions + Serverless Framework開発環境を構築

Google Cloud FunctionsをServerless Frameworkでデプロイできる環境を作りたい場合、以下の公式ドキュメントに手法が載っています。

Serverless - Google Cloud Functions Documentation

ただ、特に権限周りでGUIでの操作が面倒なので、CLI操作に変換して書き起こしました。

GCPのAPI有効化

こちらにある通り、以下のAPIを有効化します。

  • Google Cloud Functions
  • Google Cloud Deployment Manager
  • Google Cloud Storage
  • Stackdriver Logging
gcloud services enable deploymentmanager.googleapis.com cloudfunctions.googleapis.com storage-component.googleapis.com logging.googleapis.com

GCPのサービスアカウント作成

デプロイ用にService Accountを作成します。

デプロイに必要なロールは以下の4つです。

  • Deployment Manager Editor
  • Storage Admin
  • Logging Admin
  • Cloud Functions Developer
# プロジェクト名は操作対象のプロジェクト名に変更してください
PROJECT=YOUR_PROJECT_NAME

# サービスアカウント名
SERVICE_ACCOUNT=gcf-sls-deploy

# 認証情報をダウンロードするファイル
KEY_FILE=~/.gcloud/keyfile.json

# 上記のデプロイに必要なロール
ROLES="roles/deploymentmanager.editor roles/storage.admin roles/logging.admin roles/cloudfunctions.developer"

# SA(Service Account) 作成
gcloud iam service-accounts create ${SERVICE_ACCOUNT} --display-name "Cloud Functions deployment account for Serverless Framework"

# SAにロールを割り当て
for role in ${ROLES};do
gcloud projects add-iam-policy-binding ${PROJECT} \
--member=serviceAccount:${SERVICE_ACCOUNT}@${PROJECT}.iam.gserviceaccount.com \
--role=${role}
done

# サービスアカウントの認証情報取得
gcloud iam service-accounts keys create ${KEY_FILE} \
  --iam-account ${SERVICE_ACCOUNT}@${PROJECT}.iam.gserviceaccount.com

作成されました。

f:id:yomon8:20191201094907p:plain

Serverless Frameworkのインストール

こちらにある通り、必要なモジュールをインストールします。

npm install -g serverless
serverless create --template google-python --path my-service
npm install --save serverless-google-cloudfunctions

テンプレート生成

テンプレートを生成してみます。今は以下の3つが使えるので、 google-python にしてみます。

  • google-nodejs
  • google-go
  • google-python
sls create --template google-python --path my-service
Serverless: Generating boilerplate...
Serverless: Generating boilerplate in "/path/my-service"
 _______                             __
|   _   .-----.----.--.--.-----.----|  .-----.-----.-----.
|   |___|  -__|   _|  |  |  -__|   _|  |  -__|__ --|__ --|
|____   |_____|__|  \___/|_____|__| |__|_____|_____|_____|
|   |   |             The Serverless Application Framework
|       |                           serverless.com, v1.58.0
 -------'

Serverless: Successfully generated boilerplate for template: "google-python"

テンプレートが生成されました。

デプロイ用設定

とりあえず、テンプレートそのままデプロイしようと思うので、以下の serverless.yml を修正します。

$ tree my-service/
my-service/
├── main.py
├── package.json
└── serverless.yml

provider の部分を適宜修正します。とりあえずは region project credentials くらいですね。

provider:
  name: google
  stage: dev
  runtime: python37
  region: us-central1
  project: my-project
  # 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/
  #
  # the path to the credentials file needs to be absolute
  credentials: ~/.gcloud/keyfile.json

デプロイ

# サービスのディレクトリに移動して
cd ./my-service

# デプロイ実行
sls deploy
Serverless: Packaging service...
Serverless: Excluding development dependencies...
Serverless: Compiling function "first"...
Serverless: Creating deployment...
Serverless: Checking deployment create progress...
..
Serverless: Done...
Serverless: Uploading artifacts...
Serverless: Artifacts successfully uploaded...
Serverless: Updating deployment...
Serverless: Checking deployment update progress...
...............
Serverless: Done...
Service Information
service: my-service
project: my-project
stage: dev
region: asia-northeast1

Deployed functions
first
  https://asia-northeast1-your-project.cloudfunctions.net/http

デプロイできたみたいなので、以下のように関数実行してみたり、

$ sls invoke -f first
Serverless: xxxxxxxxx Hello World!

URLにリクエスト投げてみると機能しているみたいです。

$ curl https://asia-northeast1-your-project.cloudfunctions.net/http
Hello World!

ログも確認できます。

sls logs -f first

コンソール画面上からも登録されていること確認してみます。

  • Deployment Manager f:id:yomon8:20191201100529p:plain

  • Cloud Functions f:id:yomon8:20191201100459p:plain

後は片付けして、開発に入ります。

sls remove

ちなみに現時点ではローカル実行は動かない模様。

github.com