GCPのサービス「Cloud Code」のチュートリアルを Cloud Shell からやってみた


GCPの個人的に気になるサービス、Cloud Codeの「Cloud Code for Cloud Shell Editor」のチュートリアルをやってみて、どんなサービスなのか体験してみました。

# 環境

* Cloud Code for Cloud Shell Editor

ドキュメントによると、VS Codeや IntelliJ などの統合開発環境などと組み合わせても使えるようですが、今回はブラウザから利用する Cloud Code for Cloud Shell Editor を使ってみます。

# 対象

* GCPのサービスをさらっと確認したい方
* Cloud Code, Cloud Run などを試してみたい方

# チュートリアルの所要時間
※GCPの利用登録などが終わっている前提です。

* 10分〜15分

# やってみたこと

* Cloud Code for Cloud Shell のチュートリアルを一通り実施

## チュートリアルを通して体験できたこと

* Cloud Code for Cloud Shell の開発画面の使い方 
* オンライン エディタ画面の操作
* Cloud Run へのデプロイ方法

# Cloud Code について

https://cloud.google.com/code/docs?hl=ja

この辺りに説明がありますが、使ってみないとよく分からない感じ。

おそらく、VS Code や IntelliJ を利用する場合は、機能拡張として組み込まれるイメージでしょうか？


# Cloud Code for Cloud Shell Editor

https://cloud.google.com/shell

おそらく、AWSの Cloud9 的なものかと。

チュートリアルをさらっと使ったイメージでは、オンラインの開発環境がDockerで用意されて、その上で開発して、DockerファイルをCloud Runにデプロイして、ビルド・実行のような感じでしょうか。。。

## Cloud Shell Editorの料金

Cloud Shell Editorの利用には料金はかからないようです。

ただし、開発したプログラムを例えばCloud Runにデプロイして、さらに実行環境にデプロイするなどになるので、その際に利用するGCPのサービスの利用には別途利用料金が発生する、ということのようです。
この辺りはAWSのCloud9と同じ課金の仕組みのようです。

# クイックスタート
クイックスタートページのチュートリアル、「Cloud Code を使用した Cloud Run サービスのデプロイ」を実行してみます。

https://cloud.google.com/code/docs/shell/quickstart?hl=ja

## Cloud Shell Editor
Cloud Shell Editorが実行されます。

コンテナサービスが実行されるので少し待ちます。

![スクリーンショット 2021-06-23 19.28.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214523/0ca7f73c-eb8e-9e0d-c318-0f0036a3ccc2.png)

# チュートリアル実施手順
エディタの右側にチュートリアルの手順が表示されます。
![スクリーンショット 2021-06-23 21.07.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214523/0209f132-d63c-7b33-4e8f-810724900ec3.png)
手順に沿って進めます。

# Cloud Shellにチュートリアルのテンプレートを展開する
この手順で、Cloud Shellの自分のクラウドのローカル環境に、チュートリアルで使うファイル一式を展開します。

## ステータスバーの "Cloud Code" をクリック
チュートリアルのリンクをクリックすると、選択するメニューの場所がハイライトされるので、その通りに進めます。
![スクリーンショット 2021-06-24 7.45.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214523/05371ed8-684c-7780-a59b-8893722eb02c.png)
![スクリーンショット 2021-06-24 7.46.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214523/719ffe59-1df2-afba-bec5-05ea02d1203b.png)

## New Application 選択
New Application を選択して、メニューから Cloud Run application を選択します。
![スクリーンショット 2021-06-24 7.48.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214523/4942b704-aee8-c252-6510-2f67e3517d3d.png)

## テンプレート選択
テンプレートとして、Python (Flask): Cloud Run を選択します。
![スクリーンショット 2021-06-24 7.50.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214523/6e741ca6-bcc8-6a03-d957-b89aeb373476.png)

## Create New Application 選択
Create New Application ボタンを押下します。
![スクリーンショット 2021-06-24 7.53.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214523/80d2fffe-f99b-a61a-ea17-34a2c154f46c.png)

## テンプレートの展開
Cloud Shellの自分のホームディレクトリに選択した"Python (Flask): Cloud Run"テンプレートが展開されます。
![スクリーンショット 2021-06-24 7.56.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214523/bb6414c8-f18b-e368-2793-30250e23d2e7.png)
メニュー→File→Open Workspace...を選択して確認してみます。
![スクリーンショット 2021-06-24 8.00.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214523/6adb93b4-230d-cf31-b08b-c3aa0c46354b.png)
![スクリーンショット 2021-06-24 8.00.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214523/eccaa061-4694-02f8-0841-f1e827c182c3.png)

ここまでで、Cloud Shellの準備はOKです。

# Cloud Run にデプロイする
次に、Cloud Shell のテンプレートをビルドして [Cloud Run](https://cloud.google.com/run?hl=ja) にデプロイしていきます。

Cloud Run は GCPのコンテナサービスですね。AWSの Fargate？ すみません、Fargateを使ったことないのでよく分かりませんが。

イメージは、ローカルで作成した Dockerファイルをアップロードして、Cloud RunのDocker環境で実行するような感じかな。。。

## GCPプロジェクトの作成
Cloud Run を実行するには GCPプロジェクトが1つ必要なので、ない場合は作成しておきます。
下記のリンクからプロジェクトを作成します。
[create a new one and enable billing](https://console.cloud.google.com/projectcreate?hl=ja)

作成ボタン押下でGCPのプロジェクトが作成されます。
プロジェクト名は今回デフォルトでセットされた名前をそのまま使います。
![スクリーンショット 2021-06-24 8.23.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214523/0dc17cf9-f910-426e-694e-2b6332ab0c1e.png)


## Cloud Run にデプロイ

ステータスバーの Cloud Code メニューを押下して、Deploy to Cloud Run.を選択します。
![スクリーンショット 2021-06-24 8.12.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214523/5569c782-8cfc-6802-db41-a6a75c55d5c9.png)
![スクリーンショット 2021-06-24 8.12.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214523/9d38ebbe-e4f6-9be8-3960-ca3fcd9851e2.png)

## GCPの認証

Cloud Codeから GCPへの呼び出しのために認証のダイアログが表示されるので、承認ボタンを押下します。
![スクリーンショット 2021-06-24 8.18.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214523/c0b519d5-4102-bd96-1286-9e7546e7117c.png)


## GCPプロジェクトの選択
Cloud Runで利用するGCPプロジェクトを選択します。
Select GCP Projectボタンを押下
![スクリーンショット 2021-06-24 8.19.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214523/be4f3d55-a1a0-788e-5141-bca27b0e2ce9.png)

プロジェクトを選択
![スクリーンショット 2021-06-24 8.26.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214523/0a1fcd6c-30f7-122b-1cbe-c45a296046ae.png)


## APIの有効化
Enable API ボタンを押下
![スクリーンショット 2021-06-24 8.26.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214523/d130bc02-fbe7-2d60-d0d1-e473176c3675.png)

```
Checking Docker Dependency Status.
Checking Skaffold Dependency Status.
Checking Cloud SDK Dependency Status.
Retrieving builders.
Getting Gcloud Login State.
Getting Gcloud Login State.
Using picked GCP Project "flawless-star-317823"
Checking Cloud Run API status.
Enabling Cloud Run API (run.googleapis.com).
Getting Cloud Run Services for project "flawless-star-317823".
```

## GCP プロジェクト設定
GCPプロジェクトの設定画面が表示されます。
そのままでもOKですが、リージョンだけ東京リージョン を選択してみました。
![スクリーンショット 2021-06-24 8.34.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214523/9eb9c94e-0877-2748-a77d-2ddedcf23bcd.png)
 
## デプロイ
デプロイボタンを押下します。
![スクリーンショット 2021-06-24 8.35.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214523/aad36265-1fe9-fb0d-65a3-69169508c78e.png)

しばらく時間がかかりますので、Show Detailed Logsボタンを押下して、ログでも眺めながら待ちます。

```
Executing Skaffold build.
Running skaffold command: /usr/bin/skaffold init --artifact {"image":"gcr.io/flawless-star-317823/hello-world-2","builder":"Docker","payload":{"path":"Dockerfile"}} --skip-deploy --filename /tmp/cloud-code-cloud-run-3dl9Zv/skaffold.yaml --force
Setting build tagPolicy to SHA256.
Setting statusCheckDeadlineSeconds to 5 minutes
Setting build environment to 'local'
Created the file /tmp/cloud-code-cloud-run-3dl9Zv/skaffold.yaml.
Running skaffold command: build --filename /tmp/cloud-code-cloud-run-3dl9Zv/skaffold.yaml --kube-context=''
Generating tags...
- gcr.io/flawless-star-317823/hello-world-2 ->
gcr.io/flawless-star-317823/hello-world-2:latest
Checking cache...
- gcr.io/flawless-star-317823/hello-world-2: Not found. Building
Starting build...
Found [''] context, using local docker daemon.
Building [gcr.io/flawless-star-317823/hello-world-2]...
Sending build context to Docker daemon    385kB
Step 1/6 : FROM python:3.8
3.8: Pulling from library/python
（略）

0bc3020d05f1: Pulling fs layer
0f9055ba88f3: Pull complete
Digest: 
Status: Downloaded newer image for python:3.8
---> 95a6101eab8f
Step 2/6 : WORKDIR /app
---> Running in 569186a99c0c
---> bf9e184b6505
Step 3/6 : COPY requirements.txt .
---> a5269700f4e1
Step 4/6 : RUN pip install --trusted-host pypi.python.org -r requirements.txt
---> Running in cd215dd76689
Collecting Flask==2.0.1
Downloading Flask-2.0.1-py3-none-any.whl (94 kB)
（略）
Installing collected packages: MarkupSafe, Werkzeug, urllib3, Jinja2, itsdangerous, idna, click, chardet, certifi, requests, ptvsd, Flask
Successfully installed Flask-2.0.1 Jinja2-3.0.1 MarkupSafe-2.0.1 Werkzeug-2.0.1 certifi-2021.5.30 chardet-4.0.0 click-8.0.1 idna-2.10 itsdangerous-2.0.1 ptvsd-4.3.2 requests-2.25.1 urllib3-1.26.5
[91mWARNING: Running pip as root will break packages and permissions. You should install packages reliably by using venv: https://pip.pypa.io/warnings/venv
[0m
---> dbf7ae44262c
Step 5/6 : COPY . .
---> 025ec4bd3b6a
Step 6/6 : ENTRYPOINT ["python", "app.py"]
---> Running in 14326f8e4dc5
---> 226538be639a
Successfully built 226538be639a
Successfully tagged gcr.io/flawless-star-317823/hello-world-2:latest
The push refers to repository [gcr.io/flawless-star-317823/hello-world-2]
9acddda56357: Preparing
（略）

Executing Gcloud Run Deploy
Running gcloud command: run deploy hello-world-2 --project flawless-star-317823 --image gcr.io/flawless-star-317823/hello-world-2 --client-name Cloud Code for VS Code --client-version 1.12.0 --platform managed --region asia-northeast1 --allow-unauthenticated --port 8080 --cpu 1 --memory 256Mi --concurrency 80 --timeout 300 --clear-env-vars
Deploying container to Cloud Run service [hello-world-2] in project [flawless-star-317823] region [asia-northeast1]
Deploying new service...
Setting IAM Policy................done
Creating 
（略）
Routing traffic.....done
Done.
Service [hello-world-2] revision [hello-world-2-00001-vev] has been deployed and is serving 100 percent of traffic.
Service URL: https://hello-world-2-5atdxje4jq-an.a.run.app
```

## Cloud Run 実行
デプロイが無事完了して、Cloud Runでコンテナが実行されると、下記のような表示がされます。
![スクリーンショット 2021-06-24 8.43.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214523/629f03a2-7fd0-e374-045e-e6ed3d1b782e.png)

リンクをクリックしてサーバーが実行されていることを確認します。
![スクリーンショット 2021-06-24 8.46.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214523/338f8649-61f4-bfab-c8f7-2ed93a4f2e7e.png)

# ローカルサーバーによる動作確認方法
テンプレートのコード app.py は、Cloud Shell ローカル環境にて、開発用のWebサーバーを起動して、動作確認をすることができます。

https://cloud.google.com/shell/docs/using-web-preview

app.py をエディタで開いた状態で、右上の矢印を押下するとコンソールでコードが実行されます。

![スクリーンショット 2021-06-24 11.24.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214523/d7667ddf-5b9a-c7e8-45e0-1c29e7ad7938.png)

コンソールでWebサーバーの起動を確認します。
![スクリーンショット 2021-06-24 11.24.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214523/1dd1aa18-5ba1-ad88-32d5-d10283fa6dae.png)

ウェブでプレビューから ポート8080でプレビュー を選択します。
![スクリーンショット 2021-06-24 11.20.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214523/4223316e-22d7-dd22-2a03-9d2a020b25b9.png)

ローカルサーバーでWebサービスの実行を確認できます。
![スクリーンショット 2021-06-24 11.25.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214523/d7144e41-8b18-31df-4e61-81b3ad755a5c.png)

# コードの編集
app.py の一部を書き換えてみます。


```app.py
def hello():
    """Return a friendly HTTP greeting."""
    # message = "It's running!"
    message = "Hello Cloud Run!"
```

コンソールからサーバーをCtrl+Cで停止して、再度起動します。
プレビュー画面を再読み込みして、変更が反映されることを確認します。

![スクリーンショット 2021-06-24 11.42.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214523/06b5e824-bd84-f655-4e0e-994b2752c833.png)

# Cloud Run に変更をデプロイする
ローカルで確認できたら、Cloud Run にデプロイして、変更を反映します。
Cloud Code メニューから、Deploy to Cloud Run を選択します。
![スクリーンショット 2021-06-24 11.44.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214523/1460bcc5-ba6a-7646-57fd-8d2614aba8d1.png)

GCPの認証ダイアログが表示される場合は承認ボタンを押下します。
デプロイは、Cloud Code から API経由で GCPに接続する仕組みのようです。
![スクリーンショット 2021-06-24 11.46.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214523/5f363d06-1570-f418-d069-a83545e44688.png)

Deployボタンを押下します。
![スクリーンショット 2021-06-24 11.50.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214523/54ce3a6d-f48b-be61-eed2-05c406141c2f.png)

Cloud Runのサーバー画面を再読み込みします。
![スクリーンショット 2021-06-24 11.52.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214523/eecbbf52-a740-d202-87bc-9174fcc54485.png)

変更が反映されていることが確認できたらチュートリアルは終わりです。
最後に作成したプロジェクトを削除します。

# Cloud Run の確認
GCPのプロジェクトの画面で、デプロイして実行されている Cloud Run の環境を確認できます。

プロジェクトを選択して、サービスメニューから Cloud Run を選択します。
![スクリーンショット 2021-06-24 12.14.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214523/95435489-7a00-75df-9c14-e15962a49b35.png)

デプロイしたコンテナサービスを選択します。
![スクリーンショット 2021-06-24 12.14.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214523/0cc81577-9a22-77d4-93a2-7acb28a97cf9.png)

動作中のコンテナの状況が表示されます。
![スクリーンショット 2021-06-24 12.15.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214523/f52b42e0-144d-fa23-d69c-4f886d9d11b8.png)


# プロジェクトの削除
起動したままだと課金されるので、作成したプロジェクトを削除します。

下記からプロジェクトページを開きます。
[Projects page](https://console.cloud.google.com/cloud-resource-manager?hl=ja)

![スクリーンショット 2021-06-24 12.33.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214523/024026b7-f66d-e0d3-d9df-462963276eb3.png)

※IAMと管理→リソースの管理から入っても同じメニューです。
![スクリーンショット 2021-06-24 12.31.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214523/8d117da9-bd25-d728-d8b9-933460019d07.png)

削除対象のプロジェクトにチェックして、削除を押下します。
![スクリーンショット 2021-06-24 12.33.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214523/4fa8943c-7c8c-690c-0405-cf2a0d61482f.png)

削除確認のダイアログが表示されるます。
![スクリーンショット 2021-06-24 12.33.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214523/7c8ea050-c1ca-9914-5234-9a2c4be6fca6.png)
プロジェクトIDを入力してシャットダウンを選択します。
![スクリーンショット 2021-06-24 12.33.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214523/90d5d420-9fdd-2a82-6f9d-d3edd0257d1e.png)

下記が表示されたらプロジェクトの削除が完了です。
![スクリーンショット 2021-06-24 12.34.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214523/bdbb0c2b-7945-1f56-97ee-eece4b1818ec.png)

念のためプロジェクト一覧から削除されていることを確認します。
![スクリーンショット 2021-06-24 12.35.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214523/f906fcdc-f183-413d-d804-ce001e3e7962.png)


お疲れ様でした。


# 参考

https://cloud.google.com/shell


https://cloud.google.com/code/docs?hl=ja


https://cloud.google.com/run?hl=ja