自分用のメモ。
Cloud Taskの作成
まずCloud Taskの画面から「PUSHキューの作成」を押してCloud Taskそのものを作成する。ちなみに作成後に名前は変えられないみたい。
詳細設定がいろいろ指定できるがよくわからんので全部初期設定のままとする。
と思ったんだが「最大試行回数」はデフォの100からもう少し下げてもいいかもしれない。ちょっとミスってタスク登録してしまってコール先のCloud Functionsがエラーになり、それが無邪気に100回繰り返されてログが結構えらいことになった。。まあコール先の都合に合わせて各自適宜調整してください。
Cloud Taskにキューの登録
コード書かないとだめらしい。基本は以下に載っている。以下GitHubのものを「サンプルコード」と記述して本記事内で参照・抜粋していく。
https://github.com/GoogleCloudPlatform/nodejs-docs-samples/blob/HEAD/cloud-tasks/tutorial-gcf/app/createTask.js
https://cloud.google.com/tasks/docs/tutorial-gcf?hl=ja
credential指定
サンプルコードだとデフォルトのクレデンシャルを使って処理しようとするため、任意のクレデンシャルを利用する場合(特定のプロジェクト向けにタスクを発行したいとか)は CloudTasksClient
の引数に Authenticaion Option の指定が必要。
以下のような感じ。credentials.client_email
、credentials.private_key
はいずれもService AccountのJSONファイルに同名フィールドがあるので、それそのままコピって貼り付ければよい。
const options = {
credentials: {
client_email: '<member>@<project-id>.iam.gserviceaccount.com',
private_key: '...'
},
projectId: 'hogehoge'
};
const {v2beta3} = require('@google-cloud/tasks');
const client = new v2beta3.CloudTasksClient(options);
Authentication Optionの解説Doc見ると他にもいろいろ指定できるみたいだが、少なくとも私の場合は上のフィールドを適切に埋めただけでなんとかなりました。
Service AccountのPermission
いかにも意味ありげな「Cloud Taskサービスエージェント」「Cloud Tasksタスク実行者」とかいうロールがあるのでこれを付けておく。単にタスクの作成をするだけならどっちかだけでいいかもしれない。よくわからん。私は両方付けちゃいました。
未来日時のスケジュール
サンプルコードに大体書いてあるのだが、例えば10分後とかにするなら以下の要領で発行可能
let date = new Date();
const currentTimeInMillis = date.getTime();
const after10MinutesTimeInMilllis = currentTimeInMillis + (10 * 60 * 1000);
date.setTime(after10MinutesTimeInMilllis);
// あとはサンプルコードに従えば勝手に10分後がETAとなって登録される
以下のような感じになる
ちなみにタスクの登録時点から最大30日先までしか予約できないらしい。
const MAX_SCHEDULE_LIMIT = 30 * 60 * 60 * 24; // Represents 30 days in seconds.
【補足】Cloud FunctionsをコールするTaskの場合
サンプルコードだとくっつけるペイロードが結局どういう名前のパラメータになるのかがよくわからなかった(以下サンプルコードより抜粋)
...
payload = 'Hello, World!', // The task HTTP request body
...
単純に以下のようにすればいいらしい。(オブジェクトとして定義するだけ)
...
payload = {test: 'test'},
...
このpayload
変数はサンプルコードにおいて以下の内容で加工されてTaskとして登録される。
...
// Convert message to buffer.
const convertedPayload = JSON.stringify(payload);
const body = Buffer.from(convertedPayload).toString('base64');
...
で、ここで指定されたリクエストパラメータを、Cloud Functions側で req.body.test
みたいな感じで取り出す。