🔄

Cloud Run Jobsで定型作業を自動化してみた

2024/11/20に公開

※この記事は、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

Cloud Run Jobsの特徴

  • 完全サーバーレス: インフラ管理不要。使った分だけ課金。
  • スケーラブル: 並列処理に対応。数百のタスクでも同時実行可能。
  • 安定性抜群: タスクが失敗しても自動リトライ。

ただし注意点として、ジョブの最大実行時間は 24時間まで なので、超長時間の処理には不向きです。


今回のテーマ

SORACOMの月間通信量を自動取得」を例に、Cloud Run Jobs の活用方法を紹介します。


アーキテクチャー

Architecture

実装ステップ

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"

実装結果

これまで手動で行っていた通信量の取得が、以下のように改善されました。

  1. 完全自動化の実現
    Cloud Scheduler による定期実行と Cloud Run Jobs の活用で、通信量の取得プロセスが完全に自動化されました。
  2. エラー耐性の向上
    タスク実行中にエラーが発生しても、Cloud Run Jobs のリトライ機能によって処理が安定しました。ヒューマンエラーのリスクも大幅に削減されています。
  3. 業務効率の改善
    定型作業を自動化したことで、全体の作業効率が向上しました。

まとめ

Cloud Run Jobs を活用すると、面倒な定型作業がサクッと自動化できます。これで毎月の手間から解放され、ストレスが減少しました。

皆さんも、ぜひ Cloud Run Jobs を試してみてください!


参考リンク

Luup Developers Blog

Discussion