---
title: "Google Cloud Deployでデリバリーしてみた | grasys blog"
url: "https://blog.grasys.io/post/izumi/gcd/"
description: "どうも泉水です。 4ヶ月ほど経ってしましいましたが、1月26日にGoogle Cloud (GCP) DeployがGAされてちょっと使ってみたので使い勝手などをブログにしたいと思います。 実はpublic previewのタイミングでGAしたら使いたいなと思って触ってみてたんですけどね。。。 Google Clou…"
---

#  Google Cloud Deployでデリバリーしてみた

-   ![](/_astro/noicon.CTHOhNiB_1HMs6A.webp)[izumi](/authors/izumi/)
-   公開日：2022年5月30日
-   カテゴリー：[Tech](/categories/tech/)
-   タグ：[#Cloud Deploy](/tags/cloud-deploy/)[#Google Cloud](/tags/google-cloud/)[#GKE](/tags/gke/)

![ Google Cloud Deployでデリバリーしてみた](/_astro/og-image.DDSiu2Ny_XHpDd.webp)

どうも泉水です。

4ヶ月ほど経ってしましいましたが、1月26日にGoogle Cloud (GCP) DeployがGAされてちょっと使ってみたので使い勝手などをブログにしたいと思います。 実はpublic previewのタイミングでGAしたら使いたいなと思って触ってみてたんですけどね。。。

Google Cloud (GCP) Deployは継続的デリバリー（CD）を行うためのマネージドサービスです。現在はGoogle Kubernetes Engine（GKE）のみが対象となっているようです。

Google Cloud (GCP) のConsoleからだと、ナビゲーションメニューの「CI/CD」のサブメニューから選択することができます。

![Google Cloud Deployでデリバリーしてみたの画面](/_astro/01-image-16ace119.rqlzUdnt_Z1CsnSu.webp)

### Google Cloud (GCP) Deployによるアプリケーションデプロイの流れ

#### 1\. GKEクラスタの構築

Cloud DeployはGKEクラスタへデプロイするためのマネージドサービスなのでまずはGKEクラスタを作成します。 今回はGKEクラスタを作成することが目的ではないので作成方法は割愛しますが、以下の条件で作成しています。

・限定公開クラスタ  
・承認済みネットワークに接続元のIP  
・クラスタ名「deploy-test」

#### 2\. デリバリーパイプラインとターゲットの作成

デプロイパイプラインとデプロイターゲットを定義するYAMLファイルを作成しCloud Dployに登録します。

パイプライン  
・name：deploy-test  
・targetId：dev

ターゲット  
・name：dev  
・cluster：deploy-test

-   clouddeploy.yaml

Plain textcontent\_copy

```
apiVersion: deploy.cloud.google.com/v1
kind: DeliveryPipeline
metadata:
  name: deploy-test
description: deploy-test
serialPipeline:
  stages:
  - targetId: dev
    profiles: []
---

apiVersion: deploy.cloud.google.com/v1
kind: Target
metadata:
  name: dev
description: deploy to dev
requireApproval: true
gke:
  cluster: projects/{プロジェクト名}/locations/asia-northeast1-a/clusters/deploy-test
```

Plain textcontent\_copy

```
$ gcloud deploy apply --file clouddeploy.yaml --region=asia-northeast1 --project {プロジェクト名}
```

登録結果をコンソールで確認

![Cloud Deployに登録したデリバリーパイプラインとターゲット](/_astro/02-image-1-1024x303-ad7d9a73.Bf_ZWGBu_Z1J0FXY.webp)

#### 3\. リリースの作成

リリースはデプロイ対象となる成果物の固まりです。具体的にはデプロイ対象となるコンテナイメージや、そのイメージをGKE上にデプロイするためのマニフェスト類です。 Cloud Deployは内部的にSkaffoldが使用されています。デプロイするためにKustomizeやHelmを使用することもできるようです。今回は、それらを利用せずシンプルにSkaffoldとkubernetsのマニフエストのみでデプロイしてみました。

skaffold.yamlとして以下のファイルを作成しました。 manifestディレクトリにある、「k8s-」から始まるマニフェストをデプロイ対象としてまとめています。

-   skaffold.yaml

Plain textcontent\_copy

```
apiVersion: skaffold/v2beta16
kind: Config
deploy:
  kubectl:
    manifests:
      - ./manifest/k8s-*
```

manifestディレクトリ配下にはnginx podをデプロイするための単純なマニフェストを用意してみました。

-   k8s-nginx.yaml

Plain textcontent\_copy

```
apiVersion: apps/v1
kind: Deployment
metadata:
  namespace: default
  labels:
    app.kubernetes.io/name: web
    app.kubernetes.io/instance: nginx
    app.kubernetes.io/version: "0.0.1"
    app.kubernetes.io/part-of: web
  name: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  strategy: {}
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx:latest
        name: nginx
```

このマニフェストを「version-01」というリリース名でまとめて、nginxのイメージは1.20.0を指定してデプロイを実行してみます！

Plain textcontent\_copy

```
gcloud deploy releases create version-01 --project={プロジェクト名} --region=asia-northeast1 --delivery-pipeline=deploy-test --images=nginx=nginx:1.20.0
```

今デプロイを実行したリリースが保留中のリリースとして反映されました。

![Cloud Deployで承認待ちになったversion-01リリース](/_astro/03-image-2-1024x225-ead2957e.D-LF1g-D_2hR9Nb.webp)

実はこの保留中になっているリリースですが、最初作成したターゲットに起因しています。 マニフェストをよく見てみると「requireApproval」がtrueとなっています。このパラメータをtrueにすることでデプロイを実行するには承認が必要となります。逆にfalseを設定した場合は承認を要せずデプロイが実行されます。

それにしてもデプロイ状況が可視化されてわかるのはとても見やすくていいですね！

Plain textcontent\_copy

```
apiVersion: deploy.cloud.google.com/v1
kind: Target
metadata:
  name: dev
description: deploy to dev
requireApproval: true
```

#### 4\. 承認

それでは実際にデプロイの反映を行なっていきます。 先ほどのパイプラインの可視化の画面から「確認」リンクをクリックすることでリリースの一覧が確認することができます。

![Cloud Deployのリリース一覧で確認リンクを表示した画面](/_astro/04-image-3-1024x209-eb2a3a10.C0DqtHh2_Z1YdJPE.webp)

そこからREVIEWリンクをクリックすると実際の承認画面で「承認」もしくは「拒否」を選択することができます。 この画面ではマニフエストの差分を確認することができます。今回は新規作成なので全てが差分となっていますが、更新の際は差分を確認してレビューすることができるのでかなり便利ですね。

![Cloud Deployでリリース内容の差分を確認して承認する画面](/_astro/05-image-4-1024x532-f8984dc8.CpfHBzmm_Z2vW3Be.webp)

では承認して、デプロイ完了をじっと待ちます。

失敗。。。

![Cloud Deployでリリースのデプロイに失敗した画面](/_astro/06-image-5-1024x405-243c2ced.FI6lKnA9_Z11K3Ld.webp)

そんな馬鹿なと思いましたが、Cloud Buildのログを確認してみます。 実はCloud DeployのバックエンドではCloud Buildが実行されているので失敗した場合はCloud Build側のログを参照する必要があります。

![Cloud Buildに記録されたGKEクラスタへの接続タイムアウトエラー](/_astro/07-image-6-1024x103-c95bcb00.BBI-M7vi_2nVzHp.webp)

なんとGKEのクラスタエンドポイントへの接続がタイムアウトしているようです。 今回はCloud Deployの動作を確認したいのでコントロール プレーン承認済みネットワークを解放しアクセスを許可して再度実行してみました。

Plain textcontent\_copy

```
gcloud deploy releases create version-02 --project=grasys-dev --region=asia-northeast1 --delivery-pipeline=deploy-test --images=nginx=nginx:1.20.0
```

![Cloud Deployで再作成したversion-02リリースの承認画面](/_astro/08-image-7-1024x632-011e82e7.BZZSrxx4_ZqBKAW.webp)

承認して、またデプロイ完了をじっと待ちます。

![Cloud Deployでversion-02のデプロイが正常終了した画面](/_astro/09-image-8-1024x468-28457fdc.BfO_THGX_Z2s297i.webp)

今度はデプロイが正常に終了しました。 kubectlコマンドでpodが起動しているのも確認できました。

Plain textcontent\_copy

```
$ kubectl get pod
NAME                     READY   STATUS    RESTARTS   AGE
nginx-5879b57d48-h65kh   1/1     Running   0          93s
```

### 5\. 使ってみて

Cloud Deployを触ってみてどうだったか・・・  
・CD環境の構築が簡単  
・GUIで操作ができて楽  
・他のCDツールと違いマネージドなのでインフラの管理が必要ない

この辺りがCloud Deployのメリットなのかなと感じました。構築に関してはCloud Deploy用の設定ファイル、Skaffoldの設定ファイルを準備する必要はありますがCloud Deployの設定ファイルも記述量は多くないですし、SkaffoldはKubernetesでは割とスタンダードなツールなのでそこまでハードルは高くないのではと思います。

今回は承認済みネットワークに接続元のIPの設定をしていた為エラーになってたので急遽そこの設定を変更しましたが、そこに関してはCloud Buildのプライベートプールを利用することで回避できそうです。 また、マルチクラスタのパラレルデプロイや、カナリヤデプロイは提供されていなさそうです。

### 6\. 終わり

今回は単純なデプロイを行ってみましたが、導入のハードルはかなり簡単そうです。あとは各プロジェクトのデプロイフローにあった作業ができるかどうかでしょうか。まだこれから色々と機能を試してみようと考えているのでまた続報を報告できればと思っています。

## この記事を書いた人

[![](/_astro/noicon.CTHOhNiB_Z24aAgM.webp)](/authors/izumi/)

### [izumi](/authors/izumi/)

izumiのプロフィールと執筆記事をご覧いただけます。

[プロフィールと記事一覧](/authors/izumi/)