📑

スケジュールに従って Cloud Run をトリガーする方法

2023/11/02に公開

はじめに

この記事は、
 How to trigger Cloud Run on a schedule
という動画を参考に、『実際にやってみた』という記事になります。

この記事でできるようになる事

Google Cloud Scheduler を使って、
Cloud Run Service を実行し、
その実行結果をロギングに書き込む。

以下はその必要となる大まかな構成になります。
image.png

Google Cloud Scheduler について簡単に理解しておく

Google Cloud Schedulerは、フルマネージドの
ジョブスケジューリングサービスで、Googleが管理する
スケーラブルで信頼性の高いインフラを提供している。

これを使用することで、HTTPリクエストやCloud Pub/Subメッセージ、
App Engineアプリケーションの呼び出しといったジョブを、
定義した時間や間隔で自動的に実行できる。

他にも複雑なジョブのスケジューリングや、システムのダウンタイムや
障害時でも確実にジョブを実行するためのリトライ機能を持っている。

また、ジョブの履歴やログの管理、
ジョブの成功や失敗に関する通知も簡単に取得できる。

Google Cloud Scheduler は HTTP, Cloud Pub/Sub,
App Engine とのシームレスな統合を持っており、
これらの特徴から、自動化されたデータの処理、バッチジョブ、
システムの監視やアラートの送信など、多様な用途に適している。

Google Cloud API を有効化

GCPプロジェクトのコンソールへ接続。

Cloud Scheduler API
Cloud Run Admin API
Cloud Build API
Artifact Registry API

これらのAPIを有効化。
その他、APIの有効化は、必要に応じて、適宜行ってください。

アプリケーションファイルやDockerfileを準備。

Google Cloud コンソールを開いて、Cloud Shell をアクティブにする。

ディレクトリを作成して、対象のディレクトリへ移動する。

mkdir my-service
cd my-service

アプリケーション(main.go)を作成
vim main.go コマンドを使って、main.go ファイルを
作って、下記のCodeをペーストして保存。

package main

import (
    "fmt"
    "net/http"
    "time"
)

func main() {
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        currentTime := time.Now().Format("2006-01-02 15:04:05")
        message := fmt.Sprintf("Current time is: %s", currentTime)
        fmt.Println(message)
        fmt.Fprintf(w, message)
    })

    http.ListenAndServe(":8080", nil)
}

Dockerfile を作成

vim Dockerfile コマンドを実行。
下記のCodeをペーストして保存。

FROM golang:1.17

WORKDIR /app

COPY . .

RUN go build -o app

CMD ["/app/app"]

Goのモジュールをサポートするgo.modファイルを作成

go mod init my-service

vimコマンドを使って、go.mod ファイルで指定されている
Goのバージョンを 1.17 に変更してください。

vim go.mod

Cloud Run Service を Deploy する。

Google Cloud Build でコンテナをビルド。
[YOUR_PROJECT_ID] は、ユーザーのプロジェクトIDを指定して実行する。

gcloud builds submit --tag gcr.io/[YOUR_PROJECT_ID]/get-current-time

Cloud Run にデプロイを行い、未認証のアクセスを許可しないようにする。
[YOUR_PROJECT_ID] は、ユーザーのプロジェクトIDを指定して実行する。
[YOUR_REGION]は、Cloud Runサービスをdeployするregion名を入力する。

gcloud run deploy get-current-time --image gcr.io/[YOUR_PROJECT_ID]/get-current-time --platform managed --region [YOUR_REGION] --no-allow-unauthenticated

IAM Service Accountを作成して、必要ロールを付与する。

任意の名前を持つService Account を作成したら、
ロールは、Cloud Run 起動元 を付与する。

Google Cloud Scheduler を設定

頻度には、このスケジュールを実行したい間隔を設定する。

スケジュールは、以下の5つのフィールドを宣言することができる。

分 (0 - 59)
時 (0 - 23)
日 (1 - 31)
月 (1 - 12)
曜日 (0 - 7) [0と7は日曜日]

毎分実行したい場合は、* * * * * を入力する。
5分間隔で実行したい場合は、5 * * * * を入力する。
毎週水曜日のみ12時に実行したい場合は、* 12 * * 3 を入力する。

cloud-scheduler01.png
ターゲットタイプは、HTTPを選択、
Google Cloud Scheduler を実行して、
呼び出したい Cloud Run ServiceURL をペースト。

HTTPメソッドはGETを選択。
cloud-scheduler02.png
Google Cloud Scheduler が認証を必要とする。
Cloud Run Service を実行できるように、
ロール権限が付与されたService Accountを設定する。
image.png

Cloud Schedulerが実行されているかを確認する。

Google Cloud Schedulerのスケジュールジョブを確認する。
image.png
ロギングを確認する。
image.png
これらのServiceが正常に実行されていれば、
Google Cloud Schedulerの設定は完了。

終わりに

今回の記事は、動画を視聴しまして、
実際に『手を動かしてみた』という内容でまとめました。

Google Cloud Scheduler を設定しておくことで、
時間の間隔を空けて、HTTP リクエストを実行したり、
好きなタイミングで、Cloud Pub/Sub メッセージを
送るなども可能となります。

Google Cloud Schedulerがどのようなものか、
試してみたい人は、参考にしていただけると幸いです。

あとで『じっくり読みたい』、『繰り返し読みたい』と
思ってくれましたら、『ストック』へ登録、
この記事が読まれている方にとって、
参考になる記事となりましたら、『いいね』を
付けていただけますと、励みになりますので、
よろしくお願いします。

Discussion