💨

色々できるぞ! Cloud Deploy!!

2023/12/24に公開

この記事は Google Cloud Advent Calendar 2023 (通常版) の 12/24 の記事です。

CI/CD してますか?
Cloud Deploy は、継続的デリバリーに特化したフルマネージドサービスで、以下の特徴を持っています。

  • Google Kubernetes Engine, Cloud Run をサポート
  • デプロイパイプライン、デプロイ対象などをコードで管理 (Infra as Code)
  • 開発者生産性の指標をサポート

そんな Cloud Deploy ですが、2022 年の一般提供 (GA: Generally Available) から早 2 年が経とうとしていますが、 2023 年のアップデートが熱い んです!
継続的デリバリーにおいて 必要な機能が 2023 年に出揃った といっても過言ではありません。

本記事では、現状でどのようなデプロイパイプラインが組めるのかをご紹介しつつ、その中で利用している Cloud Deploy の 2023 年のアップデートを紹介していきます。

なお、Cloud Deploy に関する基本的な内容については、Nak-san のブログをご参照下さい。
https://medium.com/google-cloud-jp/cloud-deploy-397c8a7c68c0
https://zenn.dev/google_cloud_jp/articles/549665551b0ef8

Cloud Deploy の 2023 年アップデートが熱い!

2023 年、 Cloud Deploy には様々なアップデートがありました。
詳細は本記事の後半で紹介させていただくとして、まずはどんなアップデートが有ったのかをざっと見てみましょう。
(特に重要なものを抜粋し、プレビュー→ GA となったものは、GA のみを書いています)

  • [02/08] Cloud Run へのデプロイが GA
  • [02/27] Deployment Verification が GA
  • [06/01] Active Delivery Pipeline の価格が下がり、single-target pipeline の費用が無料に。
  • [06/26] Parallel Deployment, Canary Deployment Strategy が GA。
  • [07/24] Cloud Console でのパイプライン、ターゲット、リリースの作成が可能に。
  • [08/23] デプロイパラメータ利用が GA
  • [10/23] Cloud Run jobs に対応
  • [10/30] Deploy hooks がGA
  • [11/08] Cloud operations suite alerts が設定可能に。
  • [11/13] Delivery pipeline Automation が Preview
  • [12/18] Custom target が Preview

アップデートの数が非常に多いですね!

こんなデプロイパイプラインが組める!

個々のアップデートをご紹介する前に、Cloud Deploy を利用するとどんなデプロイメントパイプラインが組めるかを見てみましょう。
※ ここでは、現在 Preview の機能もパイプラインに含んでいます

デリバリーパイプラインの一例
デリバリーパイプラインの一例

上記の例では、以下の流れになっています。

  1. リリースを作成
  2. Dev環境に自動的にイメージをリリース
    • デプロイの検証(Verification)と DB スキーママイグレーション (deploy hook) を実行
  3. 自動的に Prod への昇格を開始 (Automation)
    • 「承認 (Approval)」を要求
    • 「承認」イベントをメールや slack で通知
  4. 承認後、Prod 環境へのカナリアリリースを開始
    • 1 分ごとにフェーズを自動的に進行 (Automation)

上記のように、Cloud Deploy を使うことで継続的デリバリーでよく用いられるプラクティスを簡単に導入することが可能となります。
(同じことをCI ツールのみで組むのは、なかなか難しい or 実現できても複雑でメンテナンスが難しいでしょう)

なお、上記の設定を実現するためのサンプルコードを以下で公開しています。
※ 動作を保証するものではないのでご注意下さい
https://github.com/iwanariy/sample-cloud-deploy-2023-update

それでは、上記で使っている内容を含めて、今年のアップデートを一つずつご紹介していきましょう。

2023 年のCloud Deploy アップデートを詳しく紹介

[02/08] Cloud Run へのデプロイが GA

Cloud Deploy は、リリース当初 GKE へのデプロイに対応していましたが、このアップデートで Cloud Run サービスへのデプロイに対応しました。
以下のようにターゲットを指定することで、 Cloud Run にデプロイを行うことができます。

# clouddeploy.yaml

apiVersion: skaffold/v3alpha1
kind: Config
# 略 ...
deploy:
  cloudrun: {}

dev / prod というシンプルな構成だと、このようなパイプラインを組むことができます。
デプロイパイプライン for Cloud Run

具体的な手順は、以下を参考にして下さい。
https://cloud.google.com/deploy/docs/deploy-app-run?hl=ja

[02/27] Deployment Verification が GA

Deployment Verification は、各ステージでロールアウトした際、サービスが正しく動いているかを確認するための機能です(この新機能は、「verify」と呼ばれる新しい Skaffold フェーズを活用しています)。
この機能を利用することで、デプロイ後に指定した方法で検証することが可能になり、ロールアウトの成否をコントロールすることができるようになりました。
(例えば、コンテナがうまく動いていない場合などに、ロールアウトを止めることができます)

ここでは、dev 環境にデプロイした際、Cloud Run サービスの / に対して、wget で 200 が返ってくるかをチェックする例を示しています。
なお、この VERIFY 自体は、 Cloud Run の 1 ジョブとして動いています (Cloud Deploy の画面から、該当するジョブに遷移することも可能です)。

# clouddeploy.yaml

@@ -7,6 +7,9 @@ serialPipeline:
   stages:
   - targetId: run-dev
     profiles: [dev]
+    strategy:
+      standard:
+        verify: true
   - targetId: run-prod
# skaffold.yaml

@@ -12,4 +12,11 @@ profiles:
     rawYaml:
     - run-service-prod.yaml
 deploy:
-  cloudrun: {}
\ No newline at end of file
+  cloudrun: {}
+verify:
+- name: verify-endpoint-test
+  container:
+    name: alpine
+    image: alpine
+    command: ["/bin/sh"]
+    args: ["-c", "wget ${CLOUD_RUN_SERVICE_URLS}"]

なお、 skaffold.yaml の中に有る ${CLOUD_RUN_SERVICE_URLS} ですが、execution environment の中で利用できる環境変数の一つを指定しています。
現状、Cloud Run サービスの URL はサービスのデプロイ前には確定的に決まらないため、この環境変数を利用する必要があります。

Verification で利用可能な環境変数は、以下の一覧をご参照下さい。
https://cloud.google.com/deploy/docs/verify-deployment#available_environment_variables

また、Deployment Verification については、リリース時のブログがわかりやすいので、こちらも是非参照して下さい。
https://cloud.google.com/blog/ja/topics/developers-practitioners/google-cloud-deploy-introduces-post-deployment-verification?hl=ja

[06/01] Active Delivery Pipeline の価格が下がり、single-target pipeline の費用が無料に。

デリバリーパイプラインの価格が下がり、また単一ターゲットのデリバリーパイプラインが無料となりました。
現在の価格については、以下のページをご参照下さい。
https://cloud.google.com/deploy/pricing

[06/26] Parallel Deployment, Canary Deployment Strategy が GA。

Parallel DeploymentCanary Deployment Strategy が GA になりました。

Parallel Deployment の機能によって、同じステージで複数のターゲットに対して並行にデプロイすることが可能になりました。
例えば「本番環境では、 DR 環境として東京・大阪の両方の拠点にアプリケーションをデプロイする」といったことができます。

# clouddeploy.yaml

@@ -10,7 +10,7 @@ serialPipeline:
     strategy:
       standard:
         verify: true
-  - targetId: run-prod
+  - targetId: run-prod-multi
     profiles: [prod]
 ---
 
@@ -20,13 +20,31 @@ metadata:
   name: run-dev
 description: Cloud Run development service
 run:
-  location: projects/iwanariy-cd-update-2023/locations/us-central1
+  location: projects/iwanariy-cd-update-2023/locations/asia-northeast1
 ---
 
 apiVersion: deploy.cloud.google.com/v1
 kind: Target
 metadata:
-  name: run-prod
-description: Cloud Run production service
+ name: run-prod-multi
+description: Cloud Run production service in Tokyo and Osaka
+multiTarget:
+ targetIds: [ run-prod-tok, run-prod-osa ]
+
+---
+apiVersion: deploy.cloud.google.com/v1
+kind: Target
+metadata:
+  name: run-prod-tok
+description: Cloud Run production service in Tokyo
+run:
+  location: projects/iwanariy-cd-update-2023/locations/asia-northeast1
+
+---
+apiVersion: deploy.cloud.google.com/v1
+kind: Target
+metadata:
+  name: run-prod-osa
+description: Cloud Run production service in Osaka
 run:
-  location: projects/iwanariy-cd-update-2023/locations/us-central1
+  location: projects/iwanariy-cd-update-2023/locations/asia-northeast2

Canary Deployment Strategy 機能によって、継続的デリバリーのプラクティスとして用いられるカナリアリリースが可能になります。
以下の例のように、各ステージごとに 10% -> 50% -> 100% (stable) などのフェーズを設定することができます。

# clouddeploy.yaml

@@ -12,6 +12,14 @@ serialPipeline:
         verify: true
   - targetId: run-prod-multi
     profiles: [prod]
+    strategy:
+      canary:
+        runtimeConfig:
+          cloudRun:
+            automaticTrafficControl: true
+        canaryDeployment:
+          percentages: [10, 50]
+          verify: false

Parallel Deployment と Canary Deployment Strategy は併用することが可能なので、是非一緒に使ってみて下さい。

[07/24] Cloud Console でのパイプライン、ターゲット、リリースの作成が可能に。

Cloud Console にて、GUI でパイプラインを作成することが可能になりました。
後述するカナリアリリースや Automation もこの画面から設定できるので、まず最初にパイプラインを GUI で作成し、その YAML ファイルを使ってカスタマイズしていくのも良いかもしれません。
また、リリースも Cloud Console から作成する事ができるので、GUI でCloud Deploy の一連の流れを体験したり、(各種ファイルの git 管理が推奨ではありますが)GUI ベースの運用もできるようになっています。

実際の画面などについては、以下のブログを参照下さい。
https://cloud.google.com/blog/ja/products/application-development/cloud-deploy-adds-deploy-parameters-reduces-price?hl=ja

[08/23] デプロイパラメータ利用が GA

デプロイ時にパラメータを指定 することができるようになりました。

この機能では、 1) ステージごと、2) ターゲットごと、3) リリース作成時のコマンド のいずれかでパラメータを渡すことが可能です。
例えば、 1) は以下のように指定します。

# manifest.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
 name: nginx-deployment
 labels:
   app: nginx
spec:
 replicas: 1 # from-param: ${deploy_replicas}
# clouddeploy.yaml

serialPipeline:
 stages:
   - targetId: dev
     profiles: []
   - targetId: prod  # multi-target
     profiles: []
     deployParameters:
       - values:
           deploy_replicas: 1

ステージやターゲットによって、上述のようにレプリカ数を変えたりリソース割当を変更したい場合には、この機能を利用すると良いでしょう。

[10/23] Cloud Run jobs に対応

Cloud Run サービスに加えて、Cloud Run jobs にも対応しました。

[10/30] Deploy hooks がGA

デプロイ時、pre-deploy / post-deploy hooks が利用できるようになりました。
従来、デプロイ時にスキーマを変更する必要がある場合などは Cloud Deploy とは別にマイグレーションを設定しておく必要がありましたが、今後はこの機能を使って Cloud Deploy に集約することができます。

以下では例として、post-deploy hooks で Cloud Run のサービスを公開する処理を入れるようにしてみます。

まず skaffold.yamlcustomActions を定義します。

# skaffold.yaml

@@ -1,4 +1,4 @@
-apiVersion: skaffold/v3alpha1
+apiVersion: skaffold/v4beta5
 kind: Config
 metadata:
   name: deploy-run-quickstart
@@ -19,4 +19,11 @@ verify:
     name: alpine
     image: alpine
     command: ["/bin/sh"]
+customActions:
+- name: postdeploy-make-cloud-run-services-public
+  containers:
+  - name: gcloud
+    image: 'gcr.io/google.com/cloudsdktool/google-cloud-cli:latest'
+    command: ["/bin/sh"]
+    args: ["-c", "gcloud run services add-iam-policy-binding ${CLOUD_RUN_SERVICE} --member='allUsers' --role=roles/run.invoker --region=${CLOUD_RUN_LOCATION}"]

次に、 clouddeploy.yaml で、 customActions を呼び出す設定を追加します。

# clouddeploy.yaml 

@@ -10,6 +10,8 @@ serialPipeline:
     strategy:
       standard:
         verify: true
+        postdeploy:
+          actions: ["postdeploy-make-cloud-run-services-public"]
   - targetId: run-prod-multi
     profiles: [prod]
     strategy:
@@ -20,6 +22,8 @@ serialPipeline:
         canaryDeployment:
           percentages: [10, 50]
           verify: false
+          postdeploy:
+            actions: ["postdeploy-make-cloud-run-services-public"]

上記の設定を入れることで、各ステージでサービスをデプロイした後に、Cloud Run サービスを公開する事ができました。
なお、上記の例のように、deploy hook でも環境変数を使うことができます。

[11/08] Cloud operations suite alerts が設定可能に。

Cloud Deploy の各種イベントからアラートを作成 することができるようになりました。

現在は、以下のイベントでアラートが利用可能です。

  • レンダリング オペレーション 失敗時
  • ロールアウト失敗時
  • ロールアウトが承認を必要とする場合
  • カナリアデプロイを含むロールアウトでフェーズを進める場合

このアラートは、Cloud Console、Cloud Monitoring API、Terraform にて設定することができます。
アラートの作成
Cloud Console でのアラート作成

[11/13] Delivery pipeline Automation が Preview

Cloud Deploy で、リリースの昇格(= ステージを次に進める)やフェーズの進行(カナリアリリース)を自動的に実行する Automation がプレビューとしてリリースされました。
今までは、 PromoteAdvance to canary-xx などをユーザ自身で実行する必要がありますが、この Automation によって 指定した時間後に自動的にタスクを進める ことができるようになりました。

Automation を利用するためには、 clouddeploy.yamlAutomation リソースを追加します。
以下の例では、以下の2つを設定しています。

  • dev -> prod は自動的に昇格
  • prod のカナリアデプロイにおいて、1分ごとに自動的にフェーズを進行
# clouddeploy.yaml

@@ -59,4 +59,38 @@ metadata:
   name: run-prod-osa
 description: Cloud Run production service in Osaka
 run:
+
+---
+apiVersion: deploy.cloud.google.com/v1
+kind: Automation
+metadata:
+  name: my-run-demo-app-1/promote
+description: Promotes a release to the next target
+suspended: false
+serviceAccount: 591011305945-compute@developer.gserviceaccount.com
+selector:
+- target:
+    id: run-dev
+rules:
+- promoteRelease:
+    name: "promote-release"
+    # wait: 1m
+    toTargetId: "@next"
+---
+
+apiVersion: deploy.cloud.google.com/v1
+kind: Automation
+metadata:
+  name: my-run-demo-app-1/advance
+description: advances a rollout
+suspended: false
+serviceAccount: 591011305945-compute@developer.gserviceaccount.com
+selector:
+- target:
+    id: run-prod-multi
+rules:
+- advanceRollout:
+    name: "advance-rollout"
+    sourcePhases: ["canary-10", "canary-50"]
+    wait: 1m

この機能を使うことで、**カナリアリリースで「問題がなければ、自動的に新バージョンの適用範囲を拡大する」**といったパイプラインを簡単に組むことができます。

[12/18] Custom target が Preview

Custom Target を利用することで、Cloud Run, Google Kubernetes Engine などのサポートされたランタイム環境以外の、任意のシステムに対して Cloud Deploy を活用することができるようになりました。

詳細は、またどこか別のブログにて...!!
https://cloud.google.com/deploy/docs/custom-targets?hl=ja

まとめ

いかがでしたでしょうか??
2023 年の Cloud Deploy のアップデートをご紹介してきましたが、冒頭で紹介したデリバリーパイプラインが 2023 年に出た機能によって実現できるようになりました。
是非 Cloud Deploy を試してみて下さい!

ちなみに、ドキュメントも充実してきており、Cloud Deploy の理解を深めていく上で、以下のページも是非ご一読下さい。

それでは、素晴らしき CI/CD ライフを!!

Google Cloud Japan

Discussion