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

## はじめに

この記事は、
　[How to trigger Cloud Run on a schedule](https://www.youtube.com/watch?v=XIwbIimM49Y)
という動画を参考に、『実際にやってみた』という記事になります。

## この記事でできるようになる事
`Google Cloud Scheduler` を使って、
`Cloud Run Service` を実行し、
その実行結果を`ロギング`に書き込む。

以下はその必要となる大まかな構成になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952807/49c0a258-b247-7354-f20a-0adebb049dfa.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952807/3aad144a-7e95-29cd-4eb8-5ad960a0fdf9.png)
ターゲットタイプは、`HTTP`を選択、
`Google Cloud Scheduler` を実行して、
呼び出したい `Cloud Run Service` の `URL` をペースト。

HTTPメソッドは`GET`を選択。
![cloud-scheduler02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952807/c9d4acd3-5a0e-a1fd-0c54-5aa52cc54a12.png)
`Google Cloud Scheduler` が認証を必要とする。
`Cloud Run Service` を実行できるように、
ロール権限が付与された`Service Account`を設定する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952807/1f766b18-16fb-8438-92d7-d4d1503f65ca.png)

## Cloud Schedulerが実行されているかを確認する。
`Google Cloud Scheduler`のスケジュールジョブを確認する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952807/cda5f8e5-44db-602d-b5cb-601ac446659e.png)
ロギングを確認する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952807/d79c67c6-e649-6a10-6bb3-46fda207909e.png)
これらのServiceが正常に実行されていれば、
`Google Cloud Scheduler`の設定は完了。

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

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

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

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