はじめまして、Arganoの渡部(@nabeix)です。

Arganoの技術ブログ第一弾としてGCPのCloud Run Jobsの機能と、実運用する際のちょっとしたポイントを解説したいと思います。

※ 記事執筆時点でpre-GAEとして公開している機能を含みます

Cloud Run Jobs とは

Cloud Run JobsとはGCPのコンテナ実行サービスであるCloud Runのジョブ実行環境です。

Cloud RunはWebサーバの実行環境のみでしたが、このCloud Run Jobsの登場によりバックグラウンドでのタスク処理を行う仕組みを気軽に構築できるようになりました。

定期実行を行う場合はCloud Schedulerを用いてスケジューリングします。

ジョブの実行時間は最大1時間となっており、この点を考慮したロジック実装が必要となります、

1時間以上掛かるジョブの実行が必要な場合は以下の方法を検討してみても良いと思います。

1時間以上の処理を実行する方法

1回のジョブ実行時間を1時間以内に収めつつ、自身のジョブを再帰的に呼び出すことで結果として1時間以上のタスク処理を実現しました。

ジョブを呼び出しはWeb APIによって行います。

エンドポイントは以下の形式のものが割り当てられており、POSTメソッドを用いてコールします。

https://{region}-run.googleapis.com/apis/run.googleapis.com/v1/namespaces/{project-name}/jobs/{job-name}:run

参照: ジョブを実行する

このときあ、アクセストークンが必要ですが、このトークンはメタデータサーバから取得します。

メタデータサーバとは、GCEやCloud Run内部から利用できるGCPプロジェクトの各種認証情報を取得できるサーバです。

以下のようにリクエストを送ることで、アクセストークンを取得できます。

function getToken() {
    $tokenUrl = 'http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token';
    $ch = curl_init();
    curl_setopt_array($ch, array(
        CURLOPT_URL => $tokenUrl,
        CURLOPT_HTTPHEADER => ['Content-Type: application/json', 'Metadata-Flavor: Google'],
        CURLOPT_CUSTOMREQUEST => 'GET',
        CURLOPT_RETURNTRANSFER => true,
    ));
    $res = curl_exec($ch);
    curl_close($ch);
    $decoded = json_decode($res);
    return $decoded->access_token;
}

取得したトークンを利用してジョブのエンドポイントにPOSTリクエストを送ることで、ジョブを再実行することができます。

$token = $this->getToken();
$ch = curl_init();
curl_setopt_array($ch, array(
    CURLOPT_URL => $jobUrl,
    CURLOPT_HTTPHEADER => ['Content-Type: application/json', "Authorization: Bearer {$token}"],
    CURLOPT_CUSTOMREQUEST => 'POST',
    CURLOPT_RETURNTRANSFER => true,
));
$res = curl_exec($ch);
curl_close($ch);

ジョブを再実行した際に継続的に処理が行われるようなロジックを実装する必要があります。

例えばジョブの進行ステータスを保存する等です。

ただ、Cloud Run Jobsでは実行時にパラメータを付与することができないため、データベース等を利用したステータス管理が必要となります。

まとめ

Cloud Run Jobsの機能と実運用で制限になりそうな1時間のタスク実行制限への対応を解説しました。

Cloud Run Jobsの登場によりGCPでのサーバレス環境構築がより一層お手軽に行えるようになりました。