m's blog

備忘録とかメモとか

【GCP】Cloud TasksからCloud Runを起動してみる

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.jssamples/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 でどちらを使うか迷いそうですが、その場合はなんとなくいい方を直感で選ぶか、慣れてる方にするか。。。

ちょっと迷いどころではありますが、とりえあず、しばらく使ってみようと思います。