Cloud SchedulerにはHttpトリガーが用意されていることをご存知でしょうか?これまでSchedulerから呼び出せるのはGAEの関数のみでしたが任意のHttpエンドポイントに対してリクエストを送ることが出来るようになりました。パラメータを動的に変えたり、APIの実行結果に応じて処理を変えるといったロジックを加えることは出来ませんが、VMインスタンスの起動/停止やスナップショットやバックアップの取得といった単純な処理であればCloud Schedulerだけで実現することが可能です。
本記事では一例としてCloud SchedulerとService Accountを使って簡単/安全にGoogle APIを実行する手順について紹介します。
今回は以下の2種類のjobを作成します。
- 毎日AM1:00にCompute EngineのVMインスタンスを停止するJob
- 5時間に1回DatastoreのエンティティをエクスポートするJob
サービスアカウントによる認証
今回はSchedulerからService Accountを使って認証を行いGoogle APIを実行します。
サービスアカウントを用いることであたかもサービスアカウントがリクエストを送っているかのように立ち振る舞うことが出来るので、このサービスアカウントに対して必要なAPIを実行する権限を付与することで認証済みのリクエストとしてAPIを実行することが可能です。
サービスアカウントを使った認証に関しては以下の記事がより詳しいので参考にしてみてください。
GCP からの HTTP リクエストをセキュアに認証する
GCP Service Accountを理解する
サービスアカウントの作成
ここからは実際に環境を構築していきたいと思います。
まずはサービスアカウントを作成します。今回はCUIで作成しますので自分の環境にgcloud SDKがインストールされていない方はこちらを参考にセットアップをお願いします。
https://cloud.google.com/sdk/install?hl=en
本記事執筆時のSDKのバージョンは以下の通りです。
248.0.0
任意の名前でサービスアカウントを作成します。
$ gcloud iam service-accounts create {サービスアカウント名}
サービスアカウントへの役割の付与
次に、APIの実行に必要な権限を先ほど作成したサービスアカウントに付与します。
{
"bindings": [
{
"members": [
"{サービスアカウント名}@{プロジェクトID}.iam.gserviceaccount.com"
],
"role": "roles/cloudscheduler.serviceAgent"
},
{
"members": [
"{サービスアカウント名}@{プロジェクトID}.iam.gserviceaccount.com"
],
"role": "roles/compute.admin"
},
{
"members": [
"{サービスアカウント名}@{プロジェクトID}.iam.gserviceaccount.com"
],
"role": "roles/datastore.importExportAdmin"
}
],
}
今回は”roles/cloudscheduler.serviceAgent”と”roles/compute.admin”、”roles/datastore.importExportAdmin”を付与します。
作成したIAM定義を適用させます。
$gcloud iam service-accounts set-iam-policy {サービスアカウント名}@{プロジェクトID}.iam.gserviceaccount.com bindings.json
Scheduler Jobの作成
次にSchedulerのJobを作成していきます。
まずは毎日AM1:00にCompute EngineのVMインスタンスを停止するJobを作成していきます。
※事前に任意のVMインスタンスを作成しておく必要があります。
$gcloud scheduler jobs create http apps-gcp --schedule "00 01 * * *" --http-method=POST --uri="https://www.googleapis.com/compute/v1/projects/{プロジェクトID}/zones/{ゾーン}/instances/{インスタンス名}/stop" --oauth-service-account-email={サービスアカウント} --message-body="" --headers=Content-Type=application/json --oauth-token-scope=https://www.googleapis.com/auth/cloud-platform
ゾーンやインスタンス名等は適宜ご自身の環境のものに置き換えてください。
もう一つの5時間に1回DatastoreのエンティティをエクスポートするJobも同様に作成します。
※バックアップのエクスポート先となるバケットをGCSに作成しておく必要があります
$gcloud scheduler jobs create http apps-gcp-ds --schedule "* */5 * * *" --http-method=POST --uri="https://datastore.googleapis.com/v1/projects/{プロジェクトID}:export" --oauth-service-account-email={サービスアカウント} --message-body="{'entityFilter':{'kinds':['エクスポートしたいKind']}, 'outputUrlPrefix':'gs://{バケット名}'}" --headers=Content-Type=application/json --oauth-token-scope=https://www.googleapis.com/auth/cloud-platform
Jobの実行確認
Jobの作成が完了したら後はJobが実行されるのを待つのみです。
今回の例でいうと指定したインスタンスが停止していること、指定したバケットに指定したエンティティのバックアップが作成されていること、が確認出来ればOKですね
最後に
Cloud Schedulerを使うことで、コードを書くことなくAPIを実行できる様子を確認できたと思います。これまでは単純な処理でもCloud FunctionsやAppEngineなどを利用していた(いる)方も多いと思いますが、これからこのような定期作業が発生する場合にはCloud Schedulerの利用も検討してみてはいかがでしょうか。
弊社ではクラウドエース(Cloud Ace)というGCPの導入・運用支援サービスを提供しております。お悩み・ご相談がある場合はこちらまでお問い合わせください。