Cloud Tasksを使って好きなときに実行できるバッチを作りたい
Cloud Taskを受けるサービスの作り方は以下が参考になった。
App Engine と Cloud Tasks で単発のバッチジョブを実行する
ただし、deployにCloud Buildを使っている場合、queue.yamlを利用するとIAMで権限付与が面倒。
queueは1度作成すれば使い回せるので、gcloudコマンドで作った
gcloud tasks queues create キューの名前 --max-dispatches-per-second=1 --max-concurrent-dispatches=1 --max-attempts=1
これでタスクを登録したとき、1回だけ実行してくれるキューがつくれた。
APIを使うのでcredentialファイルを取得
以下を参考に、キューを作成したプロジェクトで、サービスアカウントキーを作成。
Google Cloud Platform のサービスアカウントキーを作成する
ダウンロードしたJSONファイルは、Laravelの直下にでも配置しておく。
タスクを登録するServiceクラスを作成
まずはライブラリをインストール
composer require google/apiclient:"^2.0"
次にServiceクラスを作成
app/Services/GoogleApiClientService.php
<?php
namespace App\Services;
use Google_Service_CloudTasks_AppEngineHttpRequest;
use Google_Service_CloudTasks_CreateTaskRequest;
use Google_Service_CloudTasks_Task;
class GoogleApiClientService
{
private $service;
private const SCOPE = 'https://www.googleapis.com/auth/cloud-platform';
private const PARENT = 'projects/[プロジェクト名]/locations/[asia-northeast1とかのリージョン名]/queues/[キューの名前]';
private const RELATIVE_URL = '/api/hoge'; # 実行したいバッチプログラムの相対パス https://xxxx.appspot.com/api/hoge
private const METHOD = 'GET';
public function __construct()
{
$client = new \Google_Client();
# ダウンロードしたサービスアカウントキーのファイルパスを指定する
$client->setAuthConfig(base_path() . '/' . env('GOOGLE_CLOUD_KEY_FILE'));
$client->addScope(self::SCOPE);
$this->service = new \Google_Service_CloudTasks($client);
}
public function createSitemapTask()
{
$parent = self::PARENT;
$request_body = new Google_Service_CloudTasks_CreateTaskRequest();
$request_body->setTask($this->task());
$this->service->projects_locations_queues_tasks->create($parent, $request_body);
}
private function task()
{
$app_request = new Google_Service_CloudTasks_AppEngineHttpRequest();
$app_request->setRelativeUri(self::RELATIVE_URL);
$app_request->setHttpMethod(self::METHOD);
$task = new Google_Service_CloudTasks_Task();
$task->setAppEngineHttpRequest($app_request);
return $task;
}
}
cronの設定をする
ファイル名はcron.yamlにしないとエラーになる。
cloud buildでdeployしているなら、xxxxx@cloudbuild.gserviceaccount.comに対して、「Cloud Scheduler 管理者」を追加
cron.yaml
cron:
- description: "HOGE KING"
url: /api/hoge
schedule: every 24 hours
Controllerの呼び出し部分を作成
app/Http/Controllers/HogeController.php
<?php
namespace App\Http\Controllers\API;
use App\Http\Controllers\Controller;
use App\Services\GoogleApiClientService;
use Illuminate\Http\Request;
class HogeController extends Controller
{
public function index(GoogleApiClientService $googleApiClient, Request $request)
{
# gaeのcronからアクセスは、X-Appengine-Cron=trueのヘッダが送信される
if (env('APP_ENV') === 'production' && $request->header('X-Appengine-Cron')) {
$googleApiClient->createSitemapTask();
}
}
}