【GCP】Cloud TasksからCloud Runを起動してみる
今回は Cloud Tasks から Cloud Run を起動 してみたいと思います!
記事の最後には、Cloud Pub / Sub や Cloud Scheduler との違いや、使いどころなどについて、簡単にまとめてみたいと思います。
目次
Cloud Run サービスの起動用サービスアカウントを作成
サービスアカウントの作成は頻出する内容なので、作成方法をまとめた記事を公開しました。
以下の記事を参考にして、サービスアカウントを作成してください。
※ 既に、Cloud Run サービスの起動用サービスアカウントを作ってある場合は、追加で作成する必要はありません。
タスクキューの作成
以下のコマンドでタスクキューを作成してください。
gcloud tasks queues create $QUEUE_ID
QUEUE_ID
はなんでもOKです。
この後のタスク作成では、同じ文字列を使用してください。
HTTP タスクの作成
タスクの作成は、以下の公式サンプルを少し調整したものを使用します。
タスク作成コード
上述のサンプルのsamples/createHttpTaskWithToken.js
と samples/package.json
を調整して使用します。
createHttpTaskWithToken.js
の中身は以下の通り。
'use strict'; async function createHttpTaskWithToken( project = process.env.PROJECT_ID, queue = process.env.QUEUE_ID, location = 'us-central1', url = process.env.URL, serviceAccountEmail = process.env.SERVICE_ACCOUNT, payload = 'Hello, World!', inSeconds = 0 ) { const {CloudTasksClient} = require('@google-cloud/tasks'); const client = new CloudTasksClient(); const parent = client.queuePath(project, location, queue); const task = { httpRequest: { httpMethod: 'POST', url, oidcToken: { serviceAccountEmail, }, }, }; if (payload) { task.httpRequest.body = Buffer.from(payload).toString('base64'); } if (inSeconds) { task.scheduleTime = { seconds: inSeconds + Date.now() / 1000, }; } console.log('Sending task:'); console.log(task); const request = {parent, task}; const [response] = await client.createTask(request); const name = response.name; console.log(`Created task ${name}`); } createHttpTaskWithToken(...process.argv.slice(2)).catch(console.error);
createHttpTaskWithToken
関数の引数のデフォルトの値を環境変数に変更している以外は、元のサンプルと同じ内容です。
確認はしていませんが、引数で指定もできそうな感じです。
どちらで指定するかは、お好みで。
続いて、package.json
の中身を見ていきたい思います。
package.json
の中身は以下の通りです。
{ "engines": { "node": ">=10" }, "files": [ "*.js" ], "scripts": { "test": "mocha", "start": "node server.js" }, "dependencies": { "@google-cloud/tasks": "^2.0.0", "body-parser": "^1.18.3", "express": "^4.16.3", "yargs": "^15.0.0" }, "devDependencies": { "chai": "^4.2.0", "mocha": "^7.0.0", "uuid": "^8.0.0" } }
サンプルをほぼ、そのままを使っていますが、@google-cloud/tasks
以外のパッケージは使ってないと思うので、気になるようなら@google-cloud/tasks
以外は削除しても問題ないと思います。
タスク作成
プロジェクト ID やタスクキューの ID を環境変数で指定する場合は、それぞれ環境変数を設定してください。
※ 引数で指定する場合は、必要ないです。(引数指定での動作確認はしていません)
export PROJECT_ID=[プロジェクトID] export QUEUE_ID=[タスクキューのID] export URL=[起動するCloud RunサービスのURL] export SERVICE_ACCOUNT=[Cloud Run 起動用サービスアカウントのメールアドレス]
必要なnpmパッケージをインストールしてください。
npm install
# yarn利用の場合は yarn install
以下のコマンドを実行してタスクを作成してください。
node createHttpTaskWithToken.js
動作確認
起動対象の Cloud Run サービスのログを確認してください。
サービスの内容により、表示は異なると思いますが、タスクを作成した時間周辺でサービスが起動されていれば、問題なく起動されていると思います。
補足メモ
Cloud Pub / Sub との違い
主な違いは、呼び出しのスタイルっぽいです。
購読的なスタイルが Cloud Pub / Sub、呼び出し側で実行を完全に制御するのが Cloud Tasks といった感じかなと思います。
Cloud Scheduler との違い
こちらは、名前からして違いが分かりやすいと思います。
cron スタイルで定期実行なら Cloud Scheduler、コードからタスク作成するなら Cloud Tasks といった感じかと思います。
まとめ
以上、Cloud Tasks から Cloud Run を起動する方法を解説してみました!
サービスアカウントの設定が多少面倒ですが、その辺は他サービスの利用でも同じなので慣れるしかないです。
それ以外の部分は、それほど難しい所もないので、サービスアカウントさえ作っておけば、あとは気楽に使えそう な雰囲気かなと思います。
複雑な用途でなければ、Cloud Pub / Sub と Cloud Tasks でどちらを使うか迷いそうですが、その場合はなんとなくいい方を直感で選ぶか、慣れてる方にするか。。。
ちょっと迷いどころではありますが、とりえあず、しばらく使ってみようと思います。