Cloud Run Jobsで定型作業を自動化してみた
※この記事は、Luup Developers Advent Calendar 2024の20日目の記事です。
こんにちは。IoTチームのYuxiです。
今日は Google Cloud Run Jobs を使って、反復的な定型作業をどう効率化したのかをお話しします。開発者として、「面倒な作業をいかに楽にするか」に情熱を燃やす日々ですが、今回もその一環です。
背景と課題
IoTチームでは、以下のような「やりたくないけど必要」な定型作業があります。
1. SORACOM通信量の手動集計
毎月、SORACOM の API から SIM のステータスと通信量を手動で取得してレポートを作成。時間がかかる上、ヒューマンエラーのリスクも高め。
2. IoTデータの抽出と分析
LUUP のサーバーには大量の IoT データが蓄積されており、これを分析するタスクが発生します。一部はスクリプト化されているものの、まだ手動実行が必要な場面も多いです。
こうした日々のストレスをどうにかしたいと思いませんか?今回のテーマはそんなストレスを解消する方法です。
解決策:Cloud Run Jobs
Cloud Run Jobs とは、非同期タスクを処理するための Google Cloud のバッチ処理サービスです。
これを使えば、繰り返し作業が スケジュール化・自動化 できるようになります。
Cloud Run Jobsの特徴
- 完全サーバーレス: インフラ管理不要。使った分だけ課金。
- スケーラブル: 並列処理に対応。数百のタスクでも同時実行可能。
- 安定性抜群: タスクが失敗しても自動リトライ。
ただし注意点として、ジョブの最大実行時間は 24時間まで なので、超長時間の処理には不向きです。
今回のテーマ
「SORACOMの月間通信量を自動取得」を例に、Cloud Run Jobs の活用方法を紹介します。
アーキテクチャー
実装ステップ
1. 通信量取得スクリプトの作成
以下の Go プログラムで、SORACOM API を使って通信量を取得します。
package main
import (
"encoding/json"
"fmt"
"net/http"
"os"
"time"
)
const soracomAPIBaseURL = "https://api.soracom.io/v1/stats/air/operators/"
type SoracomData struct {
DownloadByteSizeTotal int64 `json:"downloadByteSizeTotal"`
UploadByteSizeTotal int64 `json:"uploadByteSizeTotal"`
Unixtime int64 `json:"unixtime"`
}
func main() {
// 環境変数から API キーとトークン、オペレーターIDを取得
apiKey := os.Getenv("SORACOM_API_KEY")
authToken := os.Getenv("SORACOM_AUTH_TOKEN")
operatorID := os.Getenv("SORACOM_OPERATOR_ID") // オペレーターID
if apiKey == "" || authToken == "" || operatorID == "" {
fmt.Println("SORACOM_API_KEY、SORACOM_AUTH_TOKEN、または SORACOM_OPERATOR_ID が設定されていません")
os.Exit(1)
}
// 日付の計算
firstDayLastMonth := time.Now().AddDate(0, -1, 1).Truncate(24 * time.Hour)
lastDayLastMonth := firstDayLastMonth.AddDate(0, 1, -1)
params := fmt.Sprintf("?from=%d&to=%d&period=month",
firstDayLastMonth.Unix(),
lastDayLastMonth.Unix(),
)
apiURL := fmt.Sprintf("%s%s%s", soracomAPIBaseURL, operatorID, params)
// HTTP リクエスト作成
req, err := http.NewRequest("GET", apiURL, nil)
if err != nil {
fmt.Printf("リクエストの作成に失敗しました: %v\n", err)
os.Exit(1)
}
req.Header.Set("X-Soracom-API-Key", apiKey)
req.Header.Set("X-Soracom-Token", authToken)
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
fmt.Printf("SORACOM API 呼び出しに失敗しました: %v\n", err)
os.Exit(1)
}
defer resp.Body.Close()
if resp.StatusCode != http.StatusOK {
fmt.Printf("API エラー: %s\n", resp.Status)
os.Exit(1)
}
// レスポンスデータをデコード
var data []SoracomData
if err := json.NewDecoder(resp.Body).Decode(&data); err != nil {
fmt.Printf("レスポンスのデコードに失敗しました: %v\n", err)
os.Exit(1)
}
// 総通信量を計算
var totalDownload, totalUpload int64
for _, entry := range data {
totalDownload += entry.DownloadByteSizeTotal
totalUpload += entry.UploadByteSizeTotal
}
totalTrafficMB := float64(totalDownload+totalUpload) / (1024 * 1024)
fmt.Printf("上月の総通信量は %.2f MB です\n", totalTrafficMB)
}
2. Dockerイメージの作成
FROM golang:1.20-alpine
WORKDIR /app
COPY . .
RUN go build -o main .
ENTRYPOINT ["./main"]
3. Cloud Run Jobs にデプロイ
a. Dockerイメージのビルド
docker build -t gcr.io/your-project-id/soracom-job .
docker push gcr.io/your-project-id/soracom-job
b. Cloud Run Job の作成
gcloud run jobs create soracom-job --image gcr.io/your-project-id/soracom-job --region asia-northeast1
4. 定期実行の設定
Cloud Scheduler を使い、ジョブを毎月1日に自動実行します。
gcloud scheduler jobs create http soracom-scheduler --schedule="0 0 1 * *" --http-method POST --uri="https://asia-northeast1-run.googleapis.com/apis/run.googleapis.com/v1/namespaces/your-project-id/jobs/soracom-job:run" --oauth-service-account-email="your-service-account@your-project-id.iam.gserviceaccount.com"
実装結果
これまで手動で行っていた通信量の取得が、以下のように改善されました。
- 完全自動化の実現
Cloud Scheduler による定期実行と Cloud Run Jobs の活用で、通信量の取得プロセスが完全に自動化されました。 - エラー耐性の向上
タスク実行中にエラーが発生しても、Cloud Run Jobs のリトライ機能によって処理が安定しました。ヒューマンエラーのリスクも大幅に削減されています。 - 業務効率の改善
定型作業を自動化したことで、全体の作業効率が向上しました。
まとめ
Cloud Run Jobs を活用すると、面倒な定型作業がサクッと自動化できます。これで毎月の手間から解放され、ストレスが減少しました。
皆さんも、ぜひ Cloud Run Jobs を試してみてください!
Discussion