詳細解説 Cloud Run 最新アップデート

## はじめに
こんにちは、Datadog Japan で Sales Engineer をしている [**AoTo**](https://qiita.com/AoTo0330) です。

[**Google Cloud Next ’24 in Las Vegas**](https://cloud.withgoogle.com/next) のセッション『[**Cloud Run: What's new**](https://cloud.withgoogle.com/next/session-library?session=DEV205)』内容をもとに、個人的に推している **Cloud Run** の最新アップデートを解説していきます。

https://youtu.be/YA50fuOdaqQ

当セッションでは、主に「**Simplifying App Development**」と「**Enterprise Ready**」というトピックで以下の新機能が紹介されていました。最後に DZ Bank の事例についても触れられていましたが、本投稿では割愛します。

 - [**Volume Mounts**](https://cloud.google.com/run/docs/configuring/services/cloud-storage-volume-mounts)
 - **Automatic Security Updates**
 - **Deterministic URL**
 - **Gemini in Cloud Run Recommendations**
 - **Multi-region services**
 - **New integrations(Cloud SQL, Firestore, Vertex AI)**
 - **Application canvas**
 - [**Direct VPC Egress**](https://cloud.google.com/run/docs/configuring/vpc-direct-vpc?hl=ja)
 - **Cloud Service Mesh with Cloud Run**

## Simplifying App Development
このセクションでは、Google Cloud の Product Manager である Justin Mahood 氏から、「How we continue to help simply application development」というキーワードとともに複数の新機能が紹介されました。

### Volume Mounts
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2363567/2665b18d-e3ab-c38b-f67e-32c0444e170c.png)

:::note info
本機能は既に[2024年1月に発表](https://cloud.google.com/run/docs/release-notes#January_19_2024)されており、発表時点では Preview ステータスです。
:::

#### 概要
<INS>**Cloud Run services, jobs** の両方で、**Cloud Storage FUSE**, NFS のボリュームにマウントできる</INS>ようになりました。NFS は Google Cloud のマネージド NFS である **Filestore** をはじめ、任意の NFS アプライアンスを利用できます。これらのボリュームマウントを利用するために、<INS>コンテナイメージやランタイムに変更を加える必要はありません</INS>。

```zsh:gcloud
gcloud beta run services update <SERVICE_NAME> \
--add-volume name=<VOLUME_NAME>,type=[cloud-storage|nfs], [bucket=BUCKET_NAME|location=IP_ADDRESS:NFS_PATH] \
--add-volume-mount volume=VOLUME_NAME,mount-path=MOUNT_PATH
```

#### 解説
Cloud Run では昨年まで<INS>共有ボリュームを利用することができず、主にステートレスなワークロードに向いている</INS>とされていました。

昨年の[マルチコンテナ対応](https://cloud.google.com/run/docs/deploying?hl=ja#sidecars)と同時に、[インメモリボリュームの対応](https://cloud.google.com/run/docs/configuring/services/in-memory-volume-mounts?hl=ja#command-line)がされましたが、依然としてデータの永続化(大容量のデータを扱う場合やデータの信頼性が求められる場合)はファイル共有などを実装することが求められていました。

このアップデートによって、マルチコンテナ間でのデータの共有やステートフルなワークロードの実行が容易になり、より広いユースケースに対して Cloud Run の採用を検討することができるようになりました。

### Automatic Security Updates
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2363567/12a858a2-9acb-e77f-065b-04768913e52f.png)

:::note info
本機能は発表時点では Private Preview で、近日 Public Preview と言及されました。
:::

#### 概要
Cloud Run 自体はフルマネージドなコンテナサービス(Container as a Service, CaaS)ですが、[2021年8月](https://cloud.google.com/run/docs/release-notes#August_24_2021)より[アプリケーションのソースコードによるデプロイ](https://cloud.google.com/run/docs/deploying-source-code?hl=ja)に対応しています。

ソースコードデプロイを行うと、ユーザーが意識しないバックグラウンドで [**Buildpack**](https://cloud.google.com/docs/buildpacks/overview?hl=ja) と [**Cloud Build**](https://cloud.google.com/build/docs/overview?hl=ja) が使用され、<INS>ソースコードからコンテナイメージを自動的にビルドします</INS>。

Dockerfile を作成する際に、Buildpack の[汎用ビルダー](https://cloud.google.com/docs/buildpacks/builders?hl=ja)は自動的にアプリケーション言語に応じたベースイメージを選択します。 これの代わりに`--base-image`で明示的に Google が提供するベースイメージを指定することで、ベースイメージが更新された際にダウンタイム・リビルトなしでベースイメージをアップデートされます。

**App Engine** や **Cloud Functions** で培われてきた経験をもとに、Google Cloud は<INS>48時間を目標としてセキュリティインシデントや CVE に対処しするためにベースイメージを更新しその変更を Cloud Run に適用します</INS>。

```zsh:gcloud
gcloud run deploy <SERVICE_NAME> \
--source \
--base-image=<REGISTORY_PATH>
```

#### 解説
前述の通り、ソースコードデプロイにより開発者が管理する範囲をアプリケーションに限定することができます。一方でベースイメージの脆弱性に対応するためには、[継続的なデプロイ](https://cloud.google.com/run/docs/continuous-deployment-with-cloud-build?hl=ja#setup-cd)やアップデートにより常に最新のベースイメージを適用する必要がありました。

そのため、本機能は特にアプリケーション開発者が OS レベルの脆弱性にいち早く対処するために有効な機能となります。アプリケーションレベルの脆弱性は開発者の管理責任範囲としながらも、OS レベルの脆弱性は信頼性のある Google Cloud のベースイメージを利用し管理責任を Google Cloud に任せて運用することができます。


### Deterministic URL
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2363567/8d24e880-62ca-8d00-24cf-8416f023aa03.png)

:::note info
本機能は発表時点では Private Preview です。
:::

#### 概要
サービスが Cloud Run のデプロイされると、<INS>デフォルトで各サービスには一意で永続的な URL が発行されます</INS>。この URL はドキュメントに詳細の記載はありませんが、実際に試してみると`http://<SERVICE_NAME>-[a-zA-Z0-9]{10}-<INITIAL_OF_REGION>.a.run.app`[^1][^2] という推測が難しい形式で提供されます。
[^1]: <INITIAL_OF_REGION> は `asia-northeast1`=`an`・`us-central1`=`uc` のようになりますが、`us-east4`=`uk` など推測が難しい場合があります。
[^2]: [公式ドキュメント](https://cloud.google.com/run/docs/triggering/https-request?hl=ja#creating_public_services)には URL は `https://[TAG---]SERVICE_IDENTIFIER.run.app` の形式で、サービスは `SERVICE_IDENTIFIIER` によって一意の形式となり、ロジックは変更される可能性がある、とあります。


このアップデートにより、開発者は発行される URL を推測可能になります。この推測可能な URL は `https://<SERVICE_NAME>-<PROJECT_NUMBER>-<REGION>.run.app` という形式で、デプロイ前から推測が容易となりあらかじめ URL を用いたサービスの連携等に利用できます。

さらに、デプロイ時に `--no-default-url` を利用することで、これらの URL 自体を無効化することも可能です。

```zsh:gcloud
gcloud run deploy <SERVICE_NAME> --no-default-url
```

#### 解説
Cloud Run でサービスを作成すると、前述の `*.run.app` ドメインが**必ず**払い出されます。前述の通り、この URL を利用するためにはサービスのデプロイ前に推測をすることが難しく、ドメインの発行を待つ必要がありました。

さらに、推測可能な URL が利用できるようになった場合も、Cloud Run へのアクセスを制限・限定したい場合に[内向きのネットワークアクセスの制限](https://cloud.google.com/run/docs/securing/ingress?hl=ja)が必要となります。

外部に公開されるリスクを減らすためにも、このエンドポイントを削除することで、Cloud Run を利用してよりプライベートなサービスをデプロイすることができます。さらには、**Cloud Load Balancing** を利用して後述のマルチリージョンデプロイを行いカスタムエンドポイントが単一のアクセスポイントとなるように構成することも可能です。

### Gemini in Cloud Run Recommendations
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2363567/fb879ced-bf57-b409-5327-fe5a6115b705.png)

:::note info
本機能は発表時点では Private Preview です。
:::

#### 概要
[**Gemini Cloud Assist**](https://cloud.google.com/products/gemini/cloud-assist?hl=ja) が Cloud Run にも対応し、稼働中の Cloud Run に対する推奨事項や最も影響のある内容を要約して表示できます。

上記画像の通り、推奨事項はコンソールにバナーの形式で表示され、要約はチャットの形式で任意の内容に基づいて返答を得ていることがわかります。

#### 解説
[**Gemini Cloud Assist**](https://cloud.google.com/products/gemini/cloud-assist?hl=ja) は、**Google Cloud Next ’24 開催前**は「[**Gemini for Google Cloud**](https://cloud.google.com/blog/products/ai-machine-learning/gemini-for-google-cloud-is-here)」と呼ばれ、昨年の **Goolge Cloud Next ’23** では「[**Duet AI for Google Cloud**](https://cloud.google.com/blog/products/application-modernization/introducing-duet-ai-for-google-cloud)」として紹介された、**Google Cloud Consle** 上で利用できる<INS>大規模言語モデル(LLM, Large Language Model)をもとにしたマルチアシスタント AI 機能</INS>です。

**Google Cloud Next ’23** の時点では、このマルチアシスタント AI (Duet AI) によるチャットは<INS>一般的な Google Cloud ドキュメントや情報ソースに基づく回答しか行えず、操作環境上の情報は考慮されませんでした</INS>。

今回の **Gemini Cloud Assist** へのアップデートにより、操作環境の情報を踏まえた返答を行えるようになり、Cloud Run のような特定のサービスでは推奨事項を表示するようになります。

### Multi-region services
![IMG_7742.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2363567/1cb40bef-46b0-6025-8293-b019ab338da2.jpeg)

:::note info
本機能は発表時点では Private Preview です。
:::

#### 概要
`gcloud` コマンドでのデプロイ時に指定する `--region` に複数のリージョンを指定し、同一のコンテナサービスを同時にデプロイできるようになりました。これに加えて、`--domain` でカスタムドメインを指定することで、 [カスタムドメインのマッピング](https://cloud.google.com/run/docs/mapping-custom-domains?hl=ja#run)を行いマルチリージョンでの負荷分散が行えます。

:::note info
[Cloud Run と Cloud Load Balancing の統合](https://cloud.google.com/run/docs/integrate/custom-domain-load-balancer?hl=ja)は既に Public Preview で公開されており、Cloud Run services のデプロイ後に **Global External Application Load Balancer** を紐づけることができます。

```zsh:gcloud
gcloud beta run integrations create \
--type=custom-domains \
--parameters='set-mapping=<DOMAIN:SERVICE>' \
```
:::

```zsh:gcloud
gcloud run deploy <SERVICE_NAME> \
--region=><REGION1>,<REGION2>,<REGION3> \
--domain=<CUSTOM_DOMAIN>
```

#### 解説
Cloud Run service を[カスタムドメインを用いて公開する](https://cloud.google.com/run/docs/mapping-custom-domains?hl=ja)方法は前述の [**Global External Application Load Balancer** の使用](https://cloud.google.com/run/docs/mapping-custom-domains?hl=ja#https-load-balancer)・[Firebase Hosting の使用](https://cloud.google.com/run/docs/integrate/firebase-hosting?hl=ja)など複数ありましたが、今回の発表によりより簡単にデプロイ時からカスタムドメインのマッピングができるようになりました。

特に、リージョナルサービスである Cloud Run をエンタープライズやグローバルの水準で利用するために、地理的に分散した Google Cloud のデータセンターの間で最適なトラフィック誘導をする GSLB(Global Server Load Balancing, 広域負荷分散)が単一のコマンドで実現できるのが大きなポイントです。

### New integrations(Cloud SQL, Firestore, Vertex AI)

![IMG_7788.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2363567/42ddfc11-6b41-ebc1-1454-a213e768cf22.jpeg)

:::note info
本機能は発表時点では Private Preview です。
:::

#### 概要
Google Cloud コンソールや CLI を用いて、簡単な操作で、Google Cloud プロダクトと Cloud Run を連携できる機能である [**Cloud Run integration**](https://cloud.google.com/run/docs/integrate?hl=ja) に新たに [**Cloud SQL**](https://cloud.google.com/run/docs/integrate/connect-to-cloud-sql?hl=ja), [**Firestore**](https://cloud.google.com/run/docs/integrate/firestore?hl=ja), [**Vertex AI**](https://cloud.google.com/run/docs/integrate/vertex-ai?hl=ja) が加わりました。

#### 解説
[2022年の10月](https://cloud.google.com/run/docs/release-notes#October_07_2022)から、Cloud Run integration は前述の Global External Load Balancer との統合をはじめとして機能が提供されてきました。

後述する Application canvas の発表に伴い、新たに3つのサービスとの統合ができるようになりました。

### Application canvas
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2363567/6bf9b9be-2597-b89c-77a8-588fa456aa7f.png)

:::note info
本機能は発表時点では Private Preview です。
:::

#### 概要
Google Cloud コンソールの Cloud Run ページ から、自然言語を用いて Cloud Run をコンピューティングとして利用するサービスのアーキテクチャを構成しデプロイを管理できるようになりました。

作成したアプリケーションの構成は Gemini を利用して自然言語で編集でき、Cloud Run integration で連携可能な Google Cloud サービスを用いた構成を数回のクリックでデプロイできます。

#### 解説
**Gemini Cloud Assist** や **Cloud Run integration** の恩恵を受けて、Cloud Run を用いてアプリケーション稼働環境の構成と簡単なデプロイができるようになります。これにより、<INS>複雑なスケーリングやパフォーマンス要件がない MVP(Minimum Viable Product) のデプロイ</INS>や<INS>可搬性の高いコンテナアプリケーションの Google Cloud への移行</INS>がより簡単に実現できます。

Gemini Cloud Assist の発表に併せて、Application Canvas が Cloud Run 特有の機能として発表され、これにより Cloud Run の利用・ユースケースの拡大が予想されます。これは、昨年の Duet AI for Google Cloud の発表時に期待された、アシスタント AI を用いたサービスの設計やデプロイを実現した形での発表となり、今回の Google Cloud Next ’24 全体でも注目度が高い機能でした。

## Enterprise Ready
このセクションでは Google Cloud の Engineering Manager である Sridhar Venkatakrishnan　氏から、「Why Cloud Run is such an amazing fit for the Enterprise」というキーワードのもと、大企業に求められるセキュリティ・信頼性に対応する機能について説明がありました。

### Direct VPC Egress
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2363567/7cad8588-99b7-a663-984f-c66c0a761efd.png)

:::note info
本機能は既に[2024年1月](https://cloud.google.com/run/docs/release-notes#January_18_2024)より Public Preview で提供されており、[今発表](https://cloud.google.com/run/docs/release-notes#April_15_2024)で GA されました。
:::

#### 概要
VPC 外で稼働するマネージドサービスである Cloud Run が**サーバーレス VPC アクセス コネクタ**を使用せずに GKE, GCE などの VPC 内のコンピューティングサービスにトラフィックを送信できる機能です。

```zsh:gcloud
gcloud beta run deploy <SERVICE_NAME> \
--image=<IMAGE_URL> \
--network=<NETWORK> \
--subnet=<SUBNET> \
--network-tags=<NETWORK_TAG_NAMES> \
--vpc-egress=<EGRESS_SETTING> \
--region=<REGION>
```

#### 解説
従来、Cloud Run と VPC 内のサービスが直接疎通を行うためには、[**サーバレス VPC アクセス**](https://cloud.google.com/vpc/docs/serverless-vpc-access?hl=ja)が利用されてきました。これは、指定された VPC 内に**サーバレス VPC アクセスコネクタ**を作成し、インターネットに公開せずに低レイテンシーでの通信を実現できます。Cloud Run の他に **App Engine**, **Cloud Functions** などのサーバレス環境に対応しています。

このコネクタはコネクタインスタンスとして VPC 内に作成され、<INS>トラフィックの増加に合わせて自動的にスケールアウトしますが、スケールインしない</INS>ため、必要以上のコネクタが作成されないように事前に設定を行う必要がありました。

> サーバーレス VPC アクセスは、トラフィックが増加すると、コネクタ内のインスタンス数を自動的にスケールアウトします。追加されるインスタンスは、コネクタに指定したタイプのインスタンスです。コネクタでマシンタイプを混在させることはできません。コネクタはスケールインしません。コネクタが必要以上にスケールアウトしないようにするには、インスタンスの最大数に小さい値を設定します。コネクタがスケールアウトし、インスタンス数を減らしたい場合は、目的のインスタンス数でコネクタを再作成します。

この仕様は、Cloud Run と VPC 内のサービスを接続する必要がある利用者にとって、<INS>膨大な課金を許容するかスループットの制限を許容するかなどのトレードオフを迫るもの</INS>となっていました。

Direct VPC Egress により、このコネクタの制限を考慮することなく自動的にスケールアップ・スケールダウンする VPC との接続環境を Cloud Run に提供できます。今回の発表で、Preview ステータスであったこの機能が GA され、商用環境でも安心して利用することができるようになりました。

### Cloud Service Mesh with Cloud Run
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2363567/6b6d527f-89e7-874b-a149-be2b0f15b89d.png)

:::note info
本機能は発表時点では Private Preview です。
:::

#### 概要
**Cloud Service Mesh** は [**Anthos Service Mesh**](https://cloud.google.com/service-mesh/docs?hl=ja) と [**Traffic Director**](https://cloud.google.com/traffic-director/docs?hl=ja) の後継として発表された新機能です。

従来のこれらの機能は、主に GKE, GCE 上のサービス間の通信をルーティング・プロキシ・負荷分散・トラフィック管理を行うサービスとして提供されていました。**Cloud Service Mesh** の発表に併せて Cloud Run でもこれらの恩恵を受けられるようになりました。

これに加えて新たな機能が追加されていますが、詳細は以下の記事をご参照ください。

https://zenn.dev/cloud_ace/articles/881608bb25ea14

#### 解説
分散された複数のアプリケーションから構成されるサービスにおいて、トラフィック管理をはじめ認証・認可や通信の暗号化などを実現するソリューションとしてサービスメッシュがあります。

従来は Istio, Envoy などのオープンソースベースのソリューションを利用することが主流であり、Google Cloud でも　Istio の機能は **Anthos Service Mesh** でマネージドサービスとして提供され、　**Traffic Director** は Envoy も利用できるマネージドサービスとして提供されていました。

しかし、これらのサービスを利用する上での技術選定が難しく Istio や Envoy の基礎知識が必要となることや Cloud Run を含むサービスメッシュを構成できないことが課題として考えられていました。今回の Cloud Service Mesh の発表により、これらの課題が(全てではないですが)解消され、サービスメッシュのコントロールプレーンの管理を Google Cloud に委任した運用ができます。

これにより、より複雑な要件がある Cloud Run, GKE, GCE の環境でのトラフィックをを効率的に制御する選択肢として Cloud Service Mesh が活用されるようになると考えられます。


## おわりに
この記事では、Google Cloud Next ’24 で発表された Cloud Run の新機能を、どのような機能かを【概要】でまとめ、従来との変化や影響・価値を【解説】でまとめました。

従来と比較して、よりシンプルにエンタープライズ準拠のサービスを提供できるサービスとして Cloud Run が進化していることを実感いただけたのではないでしょうか。

:::note warn
一部のサービスは発表後も Private Preview ステータスであり、GA(一般公開)される際には変更される可能性があります。
:::

最新のアップデートを知りたい方は、Google Cloud 公式の Cloud Run [リリースノート](https://cloud.google.com/run/docs/release-notes)や[ドキュメント](https://cloud.google.com/run/docs/overview/what-is-cloud-run?hl=ja)をご確認ください。

https://cloud.google.com/run/docs/release-notes

https://cloud.google.com/run/docs/overview/what-is-cloud-run?hl=ja