Google Cloud Next '22 で GAが発表されたCloud DeployによるCloud Run へのデプロイ(その1)

# はじめに
Google CloudNext ’22 で発表された内容の新サービスや、新たな機能について、できるものを実際に動かしてみたいと思います。
ちなみに新たに公開されたものとしては以下のように纏められているブログがありますので、こちらベースでみていきます。

https://cloud.google.com/blog/ja/topics/google-cloud-next/google-cloud-next22-wrap-up

今回はGAされた Cloud Deploy での Cloud Run へのデプロイについて動かしてみます。

# Google Cloud Deploy について
もともとはGKEやAnthosへのDeployに対応していたもののようで今回 Cloud Run へ対応しました。

https://cloud.google.com/blog/ja/products/devops-sre/google-cloud-deploy-verifies-deploys-and-supports-cloud-run

Cloud Deploy 自体は Kubernetes のデプロイに利用される、Skaffoldを利用したデプロイになります。
私はKubernetesに対して有識者ではないのですが、このSkaffold自体はGoogleによるOSSみたいです。
またSkaffold側のドキュメントをみてみると Cloud Run [NEW] と記載されていたり、Verify [NEW] と記載されていたり、Cloud Deploy のアップデートがSkaffoldにも反映されていました。

https://skaffold.dev/docs/

では実際にやっていきます。

# 手順
実施の流れは大きく以下となります。
- ターゲット、デリバリーパイプラインを登録するための定義ファイル作成
- ターゲット、デリバリーパイプラインを登録
- Cloud Run のサービス定義ファイルを作成、Skaffold 構成ファイル作成
- 登録したパイプラインに Cloud Run のサービス定義を渡してデプロイ

## ターゲット、デリバリーパイプラインを登録するための定義ファイル作成
以下の記事を参照し作成しました。

https://cloud.google.com/deploy/docs/config-files?hl=ja

```
apiVersion: deploy.cloud.google.com/v1
kind: DeliveryPipeline
metadata:
 name: デリバリー名
 annotations: 
  key: test
 labels:
  key: test
description: 説明
serialPipeline:
 stages:
 - targetId: dev
   profiles: []
---

apiVersion: deploy.cloud.google.com/v1
kind: Target
metadata:
 name: dev
description: development service
run:
 location: projects/プロジェクト名/locations/リージョン
```

コードブロック内の上の方がdeliveryのパイプラインとなるもので、下のほうがCloud Runをターゲットとして定義する記載になります。

## ターゲット、デリバリーパイプラインを登録

以下のコマンドを実行し Cloud Deployにデリバリープラン、ターゲットを登録します。
```
gcloud deploy apply --file 前の手順で作成したデリバリプランファイル --region=デプロイするリージョン --project 対象プロジェクト
```

登録すると以下のように作成したファイルに基づき、Cloud Deploy のデリバリプランが登録されます。

![スクリーンショット 2022-11-12 1.58.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1720034/e9838ae2-329c-0644-3ffc-47848a883642.png)


## Cloud Run のサービス定義ファイルを作成、Skaffold 構成ファイル作成
今回はCloud Run を対象にデプロイするためdeploy箇所はCloud Runとし、参照する、Cloud Run のサービス定義ファイルを参照しています。

```
apiVersion: skaffold/v3alpha1
kind: Config
metadata: 
  name: cloud-run-application
manifests:
  rawYaml:
  - service.yaml
deploy:
  cloudrun: {}
  ```

Skaffoldの内容は冒頭の方に記載したドキュメントをみていただくのがいいですが、テンプレとしての参照は以下となります。

https://cloud.google.com/deploy/docs/run-targets?hl=ja

次に上記ファイルで参照しているservice.yamlを作成します。
こちらも上記のリンク内に記載がございますが、参照した該当箇所は以下となります。

https://cloud.google.com/deploy/docs/run-targets?hl=ja#option_1_create_a_new_serviceyaml

なお今回は既に作成しているCloud Run のサービスがあったので、それをベースに改変しています。
※Cloud Runの対象サービスを開きタブの一番右のyaml箇所にて既存のサービスのyamlを参照できます。

```
apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: Cloud Run サービス名
spec:
  template:
    metadata:
      name: 
    spec:
      containers:
      - image: Artifact Registry or Container Registry の対象イメージの保存先
        ports:
        - name: http1
          containerPort: 8000
        env:
        - name: 何か必要があれば環境変数値の入力
          value: 環境変数へ入れる値の入力
        resources:
          limits:
            cpu: 1000m
            memory: 128Mi
  traffic:
  - percent: 100
    latestRevision: true
```

## 登録したパイプラインに Cloud Run のサービス定義を渡してデプロイ

以下を参照

https://cloud.google.com/deploy/docs/deploy-manually?hl=ja#manually_deploy_a_new_release

今回は以下のコマンドを実行する。

```
gcloud deploy releases create リリース名 --project=プロジェクト名 --region=リージョン --delivery-pipeline=デリバリ名
```

## デプロイ結果の確認

デプロイすると画面上以下のような表示になり、まずキューに格納されます。

![スクリーンショット 2022-11-12 2.11.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1720034/42023859-2001-b721-4778-85ba26640e9a.png)

次に進行中となります。

![スクリーンショット 2022-11-12 2.12.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1720034/c0f9f048-5116-484e-a644-a6c2e20ecfe9.png)

その後、デプロイが始まり成功しています。何回か失敗してしまいましたが、、、
![スクリーンショット 2022-11-12 2.39.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1720034/570db9d0-77ae-260b-f429-80e85824ad8c.png)

コンテナの内容次第ですが、今回の環境はLaravelを作成していて、実際にCloud Run側のログにも改めてスタートしたことが出てきており、Cloud Runのログでも成功したことがわかります。

![スクリーンショット 2022-11-12 2.40.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1720034/b6ff8a0c-0832-4c7a-8d69-62dd2dc18c84.png)

# 所感
今回はただデプロイするだけでしたので、通常何も特別なことを考えない場合のCloud Buildとそこまで大差無い状況でした。
ただ、デプロイのトラフィック制御だったりはCloud Buildよりサービスを定義できるので、やりやすい部分は出てくるかなとは思いました。
個人的に大きいと考える部分としては、同時に機能としてアップデートされた、以下のGoogleのブログにもある通り、デプロイ後の検証や、デプロイの承認フェーズを挟んだりと、可能なことが増えております。

https://cloud.google.com/blog/products/devops-sre/google-cloud-deploy-verifies-deploys-and-supports-cloud-run?hl=en

https://cloud.google.com/blog/topics/developers-practitioners/google-cloud-deploy-introduces-post-deployment-verification?hl=en

上記内容は以下で動作確認しております。

https://qiita.com/hirosait/items/cbae0b9bf493e518aa80

ただ、Cloud Deployというものに対して、この時点でドキュメントのみでイメージがわきづらかった部分が明らかになり、今回のNext記事群の中で、実施していて一番すっきりできて、楽しかったです。

現在進行中の案件だったりで、Cloud Deployを使えないか、検討してみたいと思います。
また、これから始まるものについては、これを使っていければいいなと思います。