LoginSignup
1
0

More than 3 years have passed since last update.

LaravelでGoogle App Engine Cloud Taskを実行する

Posted at

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();
    }
  }
}


1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0