Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Cloud Run (Jobs)を活用した マルチプルなプレビュー開発環境の構築

Ikki SHOKA
December 15, 2022

Cloud Run (Jobs)を活用した マルチプルなプレビュー開発環境の構築

Ikki SHOKA

December 15, 2022
Tweet

More Decks by Ikki SHOKA

Other Decks in Technology

Transcript

  1. © 2022 3-shake Inc. 2 自己紹介 株式会社スリーシェイク / Sreake 事業部

    (2021年10月〜)
 事業会社のインフラエンジニア、株式会社ユーザベースのSREとして従事後、 
 株式会社スリーシェイクに入社。日々、クライアントのSRE支援を行っている。 
 過去にGoogle Cloud Anthos DayやKubernetesイベント等に登壇。 
 
 趣味
 ・ボディメイク 
 ・健康
 ・インテリア
 
 生賀一輝
 Shoka Ikki
  2. © 2022 3-shake Inc. 6 既存の開発環境 (3) 開発者がローカルではなく開発ブランチ毎に Google Cloud環境にデプロイしたいというニーズ

    ※ それぞれのローカル端末で開発
 Kubernetes Cluster GKE Multiple Instances project:dev
 同一環境にデプロイできない 

  3. © 2022 3-shake Inc. 7 既存の開発環境 (4) 開発者がローカルではなく開発ブランチ毎に Google Cloud環境にデプロイしたいというニーズ

    ※ それぞれのローカル端末で開発
 ・開発環境の共有ができない 
 ・develop用の環境が一つしかない 
 ・インフラも含め統合的に確認したい 
 ・バックエンドのみ既存のstaging 
  環境を使いたい
 
 といったモチベーション 
 Kubernetes Cluster GKE Multiple Instances 同一環境にデプロイできない 
 project:dev

  4. © 2022 3-shake Inc. 8 PR stagingを適応した環境 (1) Cloud Runにfeature/**ブランチ(PR)毎に用意する方法

    feature/A-add 
 feature/B-add 
 feature/C-modify 
 feature/D-improve 
 Cloud Run Cloud Run Cloud Run Cloud Run project: dev
 Cloud Run Cloud Run
  5. © 2022 3-shake Inc. 9 PR stagingを適応した環境 (2) Cloud Runにfeature/**ブランチ(PR)毎に用意する方法

    feature/A-add 
 feature/B-add 
 feature/C-modify 
 feature/D-improve 
 Cloud Run Cloud Run Cloud Run Cloud Run project: dev
 Cloud Run Cloud Run 必要無分だけ 環境が作成される PR毎にCloud Runに必要とする環境とエンドポイントが作成され、 開発者はPR毎の環境を必要な分だけ作成できるようになる
  6. © 2022 3-shake Inc. 12 PR stagingの実現方法 (1) Cloud Runにfeature/**ブランチ

    (PR)毎に用意する方法 project: dev
 ①ラベル付きのPR作成 
 PRPreview ②Github Actionsがトリガー
 ③tagが付与されたものが
  デプロイされる
 service-A
 service-B

  7. © 2022 3-shake Inc. 13 PR stagingの実現方法 (2) Cloud Runにfeature/**ブランチ

    (PR)毎に用意する方法 project: dev
 ①ラベル付きのPR作成
 PR number #541 
 ②Github Actionsがトリガー
 pr-541-service-A-XXXXXXXXXXX-an.a.run.app 
 service-A
 service-B
 service-A-XXXXXXXXXXX-an.a.run.app 
 service-B-XXXXXXXXXXX-an.a.run.app 
 pr-541 PRPreview
  8. © 2022 3-shake Inc. 14 PR stagingの実現方法 - ラベル付与時にのみトリガーする Cloud

    Runにfeature/**ブランチ毎に用意する方法 project: dev
 ①ラベル付きのPR作成
 PR number #541 
 ②Github Actionsがトリガー
 pr-541-service-A-XXXXXXXXXXX-an.a.run.app 
 service-A
 service-B
 service-A-XXXXXXXXXXX-an.a.run.app 
 service-B-XXXXXXXXXXX-an.a.run.app 
 pr-541 PRPreview まずはココ
  9. © 2022 3-shake Inc. 15 PR stagingの実現方法 - ラベル付与時にのみトリガーする ②

    PReviewタグが付与されている 
 ものだけがトリガーされる 
 ① PRのmainブランチにラベル付与時、 
 変更時にトリガーされる 
 pr-staging.yaml PRが出されるたびに必要な環境が作成されないように、 Github Actionsのif(expresions)でLabelが含まれているか評価するようにしている
  10. © 2022 3-shake Inc. 16 PR stagingの実現方法 - PR毎に環境をCloud Runに用意する

    Cloud Runにfeature/**ブランチ毎に用意する方法 project: dev
 ①ラベル付きのPR作成
 PR number #541 
 ②Github Actionsがトリガー
 pr-541-service-A-XXXXXXXXXXX-an.a.run.app 
 service-A
 service-B
 service-A-XXXXXXXXXXX-an.a.run.app 
 service-B-XXXXXXXXXXX-an.a.run.app 
 pr-541 PRPreview つぎはココ
  11. © 2022 3-shake Inc. 17 PR stagingの実現方法 - PR毎に環境をCloud Runに用意する

    pr-staging.yaml Github ActionsのContextsを使用して動いている PRのnumberを取り出し、それを Cloud Runのtagを付与して、エンドポイントを作成するようにしている
  12. © 2022 3-shake Inc. 18 pr-staging.yaml PR stagingの実現方法 - PR毎に環境をCloud

    Runに用意する 既存のstaging環境のトラフィックに 
 PR stagingが向かないようにno_trafficを設定している 
 PR numberを元に 
 Cloud Runのタグを付与する 
 
 ここでは既成のActionsを使用 
 ※Cloud SDKを直接使用しても可能 
 
 Github ActionsのContextsを使用して動いている PRのnumberを取り出し、それを Cloud Runのtagを付与して、エンドポイントを作成するようにしている
  13. © 2022 3-shake Inc. 19 PR stagingの実現方法 - 適応後のConsole mainで動いているstaging環境のCloud

    Run 
 それぞれ、
 ・pr-130-service-A-XXXXXXXXXXX-an.a.run.app 
 ・pr-141-service-A-XXXXXXXXXXX-an.a.run.app 
 というエンドポイントが作成される 
 適応後は、リビジョンタグとそれに紐づくエンドポイントが作成され、 一つのService上で複数の環境が使用できるようになります
  14. © 2022 3-shake Inc. 20 PR stagingの実現方法 - 検討事項 Q.

    マイクロサービスが複数あり、エンドポイントの向き先を変更するには Q. Google Cloud Load Balancerを経由する場合はどうするのか Q. PR毎にDBを分けたい場合はどうするのか Q. 作成された環境のURLをすぐに確認できるようにしたい Q. PRがCloseした後は? ここまで基本的な作成方法を見てきましたが、運用にあたっては 以下の質問に答える必要があります 次の章で、以下の内容に関して話します
  15. © 2022 3-shake Inc. 23 GCLBの設定でtag毎にエンドポイントを変更する方法 ・*.api.sample.service を LBのfonrtendに追加する ・httpsの場合ワイルドカード証明書の発行(

    Certificate Manager)を行う ・Serverless NEG の url_mask を <tag>.api.sample.service で設定する Google Cloud Load Balancer経由でアクセスする必要がある場合、 tag名をドメインに含めて向き先を変更したいと思う <tag>.api.sample.serviceのアクセスがくると、 <tag>-service-A-XXXXXXXXXXX-an.a.run.appに ルーティングされるようになる 詳細: https://cloud.google.com/load-balancing/docs/l7-internal/setting-up-l7-internal-serverless?hl=ja#using-url-mask
  16. © 2022 3-shake Inc. 25 AlloyDBの場合 Cloud Run Jobs AlloyDB

    VPC Connector AlloyDBではGithub Actions上から接続ができないため、 Cloud Run Jobs内でDATABASEをコ ピー、そしてmigrationを行っています その際はVPC Connector経由で接続しています (ここではDATABASEのコピーのみコード例を挙げています ) pr-staging.yaml
  17. © 2022 3-shake Inc. 29 おわりに ▪ Github Actionsの微妙な点 ・Reusable

    Workflow (terraformでいうmodule)自体は使用されないにも  関わらず、UI上にWorkflowの一覧として出てしまうのに伴う視認性の低下 ・UI上でのログがリアルタイムで出ないので、ログをリアルタイムで追いたいときに少し不便 ・ifで評価したものが実行履歴として表示されてしまう ▪ 運用上の問題、差分 ・Serviceのインフラ自体をCloud Runで用意すると、例えば、  CIで環境変数を変更する場合、変更箇所が毎度差分として出てしまう ▪ 注意点 ・CLIで設定する際に(gcloud run services update)、既存の環境変数の設定を別にしている場合 (上記のようにterraform管理している)、--set-env-varsで設定すると、 全環境変数が飛んでしまうので部分的に上書きするので、 --update-env-varsで設定する必要がある