SINKCAPITAL
SINKCAPITAL
Comapny Blog
GKEをやめてCloud Runを始めてみました
tech

背景

 弊社ではfirebaseで動く自社プロダクトの開発をいくつか行っているのですが、 その中でモデルを利用した重い処理はcloud functionを使うことができず動かす場所に頭を悩ませていました。 (一旦回避策としてGKEを利用して構築自体はできたのですが、ほぼ利用しないテスト環境でも毎月6~7千円コストがかかる状態。。。) LT登壇などで様々な方に意見を伺ったところCloud Runが良さそうという話をお聞きし、 動作確認までたどり着けたのでそこまでの内容をまとめておこうと思います。
 環境は全てterraformで管理しているのでterraformを使った構築方法を記載しています。

一旦動かすだけのところ

 Cloud Runを一旦動かしてみるのは以下コードを使うだけですぐ行うことができました。 URLリクエストを送った際にメッセージをおうむ返しするだけのものですが、 これで構築するだけでCloud Runの使い方の雰囲気とその応答スピードの速さを実感できると思います。

resource "google_cloud_run_service" "default" {
  name     = "test"
  location = "${var.region}"

  template {
    spec {
      containers {
        image = "us-docker.pkg.dev/cloudrun/container/hello"
      }
    }
  }

  traffic {
    percent         = 100
    latest_revision = true
  }
}

既存システムとの接続

 実際に利用する際はシステムとの繋ぎ込みが必要なため、 以下の構成でfirebaseのアプリとの繋ぎ込みを行いました。   システム構成図

firebaseのアプリでstorageに画像を保存するとpubsubにメッセージが飛び、 そこからpushリクエストでCloud Runを呼び出しています。

Cloud Run周りのterraform

resource "google_container_registry" "registry" {
  project  = "cloud_run_test_sakurai"
  location = "ASIA"
}

# デプロイ時は先にgcrへイメージをアップロードする必要がある
resource "google_cloud_run_service" "default" {
  name     = "cloud_run_test_sakurai"
  location = "asia-southeast1"

  template {
    spec {
      containers {
        image = "gcr.io/{{PROJECT_ID}}/cloud_run_test_sakurai:latest"
      }
    }
  }

  traffic {
    percent         = 100
    latest_revision = true
  }
}

Cloud Runへの接続周りのterraform

resource "google_storage_notification" "notification" {
  bucket         = "cloud_run_test_sakurai.appspot.com"
  payload_format = "JSON_API_V1"
  topic          = google_pubsub_topic.image_upload.id
  event_types    = ["OBJECT_FINALIZE"]
  depends_on = [google_pubsub_topic_iam_binding.binding]
}

resource "google_pubsub_topic_iam_binding" "binding" {
  topic   = google_pubsub_topic.image_upload.id
  role    = "roles/pubsub.publisher"
  members = ["serviceAccount:${data.google_storage_project_service_account.gcs_account.email_address}"]
}

data "google_storage_project_service_account" "gcs_account" {}

resource "google_pubsub_topic" "image_upload" {
  name = "cloud_run_test_sakurai-topic"
}

resource "google_service_account" "pubsub_kicker" {
  account_id = "cloud_run_test_sakurai-pubsub-kicker"
  display_name = "Pub/Sub service account for cloud run kicker"
}

resource "google_project_iam_member" "pubsub_kicker" {
  member = "serviceAccount:service-{{ACCOUNT_ID}}@gcp-sa-pubsub.iam.gserviceaccount.com"
  role = "roles/iam.serviceAccountTokenCreator"
}

resource "google_cloud_run_service_iam_member" "pubsub_kicker" {
  service = google_cloud_run_service.default.name
  location = google_cloud_run_service.default.location
  role = "roles/run.invoker"
  member = "serviceAccount:${google_service_account.pubsub_kicker.email}"
}

resource "google_pubsub_subscription" "kick_cloud_run" {
  name  = "cloud_run_test_sakurai-subscription"
  topic = google_pubsub_topic.image_upload.name

  ack_deadline_seconds = 600
  message_retention_duration = "1200s"

  retry_policy {
    minimum_backoff = "60s"
  }

  push_config {
    push_endpoint = "${google_cloud_run_service.default.status[0].url}"
    oidc_token {
      service_account_email = google_service_account.pubsub_kicker.email
    }
  }
}

Cloud Buildのyaml

※terraform_apply.shはterraform applyを実行するshell scriptになります。

substitutions:
  _TERRAFORM_VERSION_: 0.12.10
steps:
  - id: 'build_gkr_image'
    name: 'gcr.io/cloud-builders/docker'
    entrypoint: 'docker'
    args: ['build','-t','gcr.io/${PROJECT_ID}/cloud_run_test_sakurai:latest','{{PATH/TO/DOCKERFILE}}']
    allow_failure: true
  - id: 'push_gkr'
    name: 'gcr.io/cloud-builders/docker'
    entrypoint: 'docker'
    args: ['push','gcr.io/${PROJECT_ID}/cloud_run_test_sakurai:latest']
    allow_failure: true
  - id: 'tf apply'
    name: 'hashicorp/terraform:${_TERRAFORM_VERSION_}'
    entrypoint: 'sh'
    args: ['./ci/terraform_apply.sh','dev']
timeout: 3600s

感想

 pubsub周りの権限で少しわかりにくいですが割と簡潔にバッチシステムを組むことができました。 元々AWS環境で似たようなモデル実行環境を作っていた身としては、 裏で動かすインスタンスタイプの指定がないためフルマネージド感が強く、 またAWS Batchのようにインスタンス立ち上げを待たなくて良いので爆速だった点がとてもメリットとして感じられました。 今後運用していく上で感じた点などもまとめていければと思います。

参考リンク

Nuxt上でのd3を利用した散布図の作成方法
櫻井 裕司
2021/10/29 櫻井 裕司
techdataAnalytics
クリック可能な散布図をNuxtjs上で作成する場合にd3.jsが汎用性が高く便利でした。利用するにあたって難しかった点などを備考録としてまとめています。
アクセスログを可視化しGAのデータを直感的に理解できる型態にする試み(ネットワーク型)
櫻井 裕司
2021/09/05 櫻井 裕司
techdataAnalytics
ビジネスに活きる分析を進める上で弊社では「理解できる」ことを重要と考えており、特に直感的理解は可視化を進める上で特に重要だと考える内容の一つです。弊社では様々なお客様のデータ分析を進める上で常により示唆の大きい可視化を追求しており、今回はその中で最近試みているネットワーク側の可視化についてまとめたいと思います。
代表櫻井による特別講演会が白陵高等学校で開かれました
櫻井 裕司
2021/07/31 櫻井 裕司
eventpersonal
2021年の夏に兵庫県の私立白陵高等学校において、代表櫻井による特別講演会を開催いたしました。今振り返って高校の頃の自分に伝えたいことについてお話しました。
Nuxtで動的ページを随時追加する場合にNot Foundとなる
櫻井 裕司
2021/05/31 櫻井 裕司
tech
Nuxtで動的ページを登録する方法はありますが、登録後に随時コンテンツが追加される際はNot Foundとなってしまうので、そう言った際の対処方法について
AWSをやめてfirebaseを使い始めて感じたメリットやデメリットとそれの対応策(LT登壇内容)
櫻井 裕司
2021/03/26 櫻井 裕司
techeventpersonal
みそかつウェブ・GDG Nagoya主催の「around firebase」とCloud Native Nagoya主演の「Cloud Native Nagoya」にてfirebaseのLTをさせていただきました。そこで会話させていただいたfirebaseを使い始めて感じたメリット・デメリットについてまとめています。
PWA+SPAのwebアプリ作成にnuxtjs+firebaseがめちゃ便利だった
櫻井 裕司
2021/01/16 櫻井 裕司
tech
PWA+SPAのwebアプリを作る際にnuxt.js+firebaseを合わせて利用すると便利だったので知見を書き留めています
s3のhostingでPWAを導入する方法
櫻井 裕司
2020/12/19 櫻井 裕司
tech
アプリ作成時にpwaが比較されることが多かったですが、実際にpwaを実装した経験がなかったため今回自社サイトをPWA化してみました。
dockerでseleniumを動かしてみる(chrome_headless)
櫻井 裕司
2020/12/06 櫻井 裕司
tech
seleniumの相談をいただくことが増えたため、seleniumの勉強もかねてdockerでの実行テストを行いました
THE DECKのイベントにお邪魔させていただきました
本林 秀和
2020/12/05 本林 秀和
eventpersonal
大学コンソーシアム大阪のイベント@The DECK にお邪魔してきました
flutter(dart)を触ってみた感想
櫻井 裕司
2020/11/18 櫻井 裕司
tech
android向けアプリへの対応も考慮してflutter(dart)を触ってみたので、感想をまとめておこうと思います。理解が深まっていく中で定期的にまとめていければと思います。
代表本林による特別講演会が滝高校で開かれました
本林 秀和
2020/11/07 本林 秀和
eventpersonal
2020年11月7日(土)愛知県の私立滝高校において、代表本林による特別講演会を開催いたしました。IT業界やデータサイエンスについてお話しました。
AWS・GCPを選ぶ際の観点
櫻井 裕司
2020/10/28 櫻井 裕司
tech
AWSかGCPを選ぶ際の観点について書き留めておこうと思います
CloudFormationとterraformの比較
櫻井 裕司
2020/10/04 櫻井 裕司
tech
AWS CloudFormationとterraformの両方を使ってみて感じた違いをまとめてみました。
iosのcallkit周りでできること
櫻井 裕司
2020/08/24 櫻井 裕司
tech
新規事業を検討する上でios(swift)の電話周りでできることを調査したため、調査結果をブログとして残しています。
【個人ブログ】CTOの株運用ブログ_順調な滑り出し
櫻井 裕司
2020/07/19 櫻井 裕司
personalstock
長年放置してた株に少し手を出してみました。自分なりに少し情報整理と分析と予想をしたので記事にしてみます。
総務省特定サービス産業実態調査のデータ分析
櫻井 裕司
2020/07/18 櫻井 裕司
techdataAnalytics
総務省がAPIで市場データを公開しており、分析技術向上と市場感を養うことを目的に定期的に分析を行なっていこうと思います。今回は「特定サービス産業実態調査」について見ていこうと思います。
「お絵かきつみ木バトル」をリリースしました
櫻井 裕司
2020/07/12 櫻井 裕司
techapp
タスク管理を二次元的に行うアプリ「お絵かきつみ木バトル」をリリースしました。SinkCapitalはデータコンサルですが、知見蓄積のため様々な媒体での実験的開発を行っています
総務省工業統計調査のデータ分析
櫻井 裕司
2020/07/11 櫻井 裕司
techdataAnalytics
総務省がAPIで市場データを公開しており、分析技術向上と市場感を養うことを目的に定期的に分析を行なっていこうと思います。今回は「工業統計調査」について見ていこうと思います。
【個人ブログ】CTOが個人的に株をはじめました
櫻井 裕司
2020/07/08 櫻井 裕司
personalstock
長年放置してた株に少し手を出してみました。自分なりに少し情報整理と分析と予想をしたので記事にしてみます。
総務省サービス産業動向調査のデータ分析
櫻井 裕司
2020/07/08 櫻井 裕司
techdataAnalytics
総務省がAPIで市場データを公開しており、分析技術向上と市場感を養うことを目的に定期的に分析を行なっていこうと思います。初回は「サービス産業動向調査」について見ていこうと思います。
タスク管理アプリ「タスククロス」をリリースしました
櫻井 裕司
2020/04/08 櫻井 裕司
techapp
タスク管理を二次元的に行うアプリ「タスククロス」をリリースしました。SinkCapitalはデータコンサルですが、知見蓄積のため様々な媒体での実験的開発を行っています
【terraform】gcpでcicd環境を構築する方法
櫻井 裕司
2020/01/04 櫻井 裕司
tech
企業サイトはAWSを利用しているのですが、要件によってはGCPの方が適している場合もあるため、GCPでのcicd構築も行いました。AWSと比較しつつ説明しているため是非ご参考にしてみてください。
【合格体験記】GCP_Cloud_Archtectに受かりました
櫻井 裕司
2019/12/23 櫻井 裕司
personalqualification
Google Professional Cloud Architectに合格したので、勉強法別のコスパをまとめてみました。
AWSでサブドメインなし(wwwなし)からサブドメインあり(wwwあり)へのリダイレクト設定
櫻井 裕司
2019/12/23 櫻井 裕司
tech
もともと企業サイトがサブドメインありで公開していたが、サブドメインなしでもエラーなく接続できるように設計。terraformで作成しているので是非ご参考ください。
マークダウンで記事を書けるようにしてみた
櫻井 裕司
2019/12/16 櫻井 裕司
tech
ホームページのブログをマークダウンを使用してかけるようにしました。gatsbyなどもありますが、今回はお手製cicd+pythonを使用してライトに作成しました。