CloudRunからはじめるGCP

ついにGCP(Google Cloud Platform)に入門することができました。今回はずっと使ってみたかったCloudRunに簡単なAPI Serverをデプロイするところまでやっていきたいと思います。著者のシェルはzshとなっております。

## Cloud SDKをインストールする

以下のコマンドを実行するとシェルスクリプトが実行され、どのディレクトリにインストールするか聞かれますがEnterを押します。(ホームディレクトリの下にgoogle-cloud-sdkというフォルダができます)

```
curl https://sdk.cloud.google.com | zsh
```

勝手にpathを通してくれるのでzshrcを再度読み込みします。
```
$ source ~/.zshrc
```

GCPを操作することができるgcloudが使えることを確認します。
```
$ gcloud version
```

Cloud SDK をインストールしたら、gcloud init を実行して初期設定を行います。
Pick cloud project to useと聞かれるので現在のプロジェクトの番号を書き込みEnter

```
$ gcloud init
```

下記コマンドでdockerからgcloudにアクセスできるようにします。
```
$ gcloud auth configure-docker
```


## GCRにコンテナイメージをPushする

Container Registry APIを有効にしてプライベートなDockerイメージを保存するAPIを使えるようにします。

![スクリーンショット 2022-03-16 23.38.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1295942/0cc46442-f5fd-f876-c336-2f88c127cd27.png)


コンテナイメージをビルドする。

```
docker-compose build
```

＊ コンテナイメージを生成するときにM1チップのMacbookだと64ビットLinux用にコンパイルしなければなりません。なので--platform=linux/x86_64を付け加えます。

```dockerfile:dockerfile
FROM --platform=linux/x86_64 golang:latest AS builder
```

GCRにPushするためにローカルイメージにタグ付けをします。ホスト名をasia.gcr.ioとすることでasiaにイメージが保管されます。

```shell:
$ docker tag ローカルイメージ名 ホスト名/プロジェクトID/イメージ名:latest
```

GCRにPushします。ここまで完了したらコンソール画面でPushできているか確認してください。

```shell:
$ docker push ホスト名/プロジェクトID/イメージ名:latest
```

## CloudRunにデプロイする

Cloud Run API を有効にします。

![スクリーンショット 2022-03-17 11.58.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1295942/8f885c0b-631d-4e2b-531f-66e3930cd226.png)


先ほどECRにPushしたコンテナイメージを選択する。

![スクリーンショット 2022-03-16 23.48.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1295942/3844bd64-55db-cd3c-dd95-853c7f816130.png)

誰でもリクエストできるように「未認証の呼び出しを許可」

![スクリーンショット 2022-03-16 23.59.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1295942/04f542c9-614d-2ecb-f9db-ddb68925609c.png)

アプリケーションがlistenするポートを記入します。
コンテナ起動時にコマンド「/main」を実行するように設定します。

![スクリーンショット 2022-03-16 23.53.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1295942/84634384-1561-2cf7-d87c-00610eb4b057.png)

作成をクリックするとデプロイされURLが発行されたら完了です。

![スクリーンショット 2022-03-17 0.00.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1295942/6c36df79-ec96-2bea-2ded-3d5814625609.png)

### メリット

・デプロイ体験がとても良くSSL化までマルッとやってくれるのは最高
・AWSのAppRunnerやFargateは最小のインスタンス数は１であることに対してCloudRunは0でも可なのでリクエストがない場合は課金されない。ただしコールドスタートとなる。(個人開発にとても相性が良さそう)

### デメリット

・ボリュームをマウントすることができない
・SSH接続できない(ハック的なことをすればできるとの声も)
・プライベートなネットワーク上に構築できない
ex)DBサーバーに接続する際にはインターネットから直接アクセスさせないようにCloud Run + VPC(サーバーレスVPCアクセスコネクタ + Cloud SQL)のような構成にする必要がある

# 使ってみての感想

AWSと比べてGCPはドキュメントが非常に分かりやすくてドキュメントだけで理解できた。トラブルシューティングも詳しく記載されていて良かった。GCPを使っていきたくなった。


## 参考文献

https://cloud.google.com/run/docs/quickstarts/build-and-deploy?hl=ja&_ga=2.174404002.-1010976991.1646989347&_gac=1.61912158.1647347457.Cj0KCQjwz7uRBhDRARIsAFqjulkl5yKrEBKJYMZiNZrrwWJZjOq0oCG1wHeTg_qUDMVPCjX83UrsVioaAoPHEALw_wcB

https://cloud.google.com/container-registry/docs/pushing-and-pulling?hl=ja&_ga=2.183392422.-1010976991.1646989347&_gac=1.229650798.1647347457.Cj0KCQjwz7uRBhDRARIsAFqjulkl5yKrEBKJYMZiNZrrwWJZjOq0oCG1wHeTg_qUDMVPCjX83UrsVioaAoPHEALw_wcB#pushing_an_image_to_a_registry

https://cloud.google.com/artifact-registry/docs/docker/pushing-and-pulling?hl=ja

https://cloud.google.com/container-registry/docs/pushing-and-pulling?hl=ja&_ga=2.183392422.-1010976991.1646989347&_gac=1.229650798.1647347457.Cj0KCQjwz7uRBhDRARIsAFqjulkl5yKrEBKJYMZiNZrrwWJZjOq0oCG1wHeTg_qUDMVPCjX83UrsVioaAoPHEALw_wcB#pushing_an_image_to_a_registry