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
作成されました。
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
Cloud Functions
後は片付けして、開発に入ります。
sls remove
ちなみに現時点ではローカル実行は動かない模様。