👩🏻‍🏫

Cloud Run のハンズオンで Cloud Shell と teachme コマンドが便利だった

2023/12/13に公開

Cloud Shell は Google Cloud の管理コンソールから利用できるシェル環境です。こちらのイベントにて、ブログアプリケーションを Cloud Run へデプロイするハンズオンを実施しました。

このハンズオンでteachmeコマンドを利用して手順を進めました。チューター視点で便利だったポイントを記録します。イベントへ参加してくださった方、会場を用意していただいたGoogle Cloud Japanさま、スタッフの方々、ありがとうございました。

便利だったところ

今回のハンズオンでは、Cloud Shellをつかうことで、新しくインストールするツールもなく、ほとんどの手順がそこで完結できるというのがありがたいポイントでした。この手のハンズオンイベントは、参加者のOSやエディタの違いで具体的な手順へ入る前に手間取るケースがあります。その可能性を限りなく小さくできるというだけで、利用する価値があります。具体的には以下のような点が便利でした:

それぞれ紹介します。

teachmeコマンドが使える

teachmeは Cloud Shell に組み込まれているコマンドです。実行するとどうなるかみてみます。

  1. cloud shell を起動する
  2. git clone https://github.com/zenn-dev/google-cloud-workshop-202311-xenn.git を実行する(ハンズオンで実際に利用した公開リポジトリです)
  3. cd google-cloud-workshop-202311-xenn を実行する
  4. teachme tutorial_ja.md を実行する

右ペインに、チュートリアルの領域が表示されたことがわかります。これは、ハンズオン用に用意したMarkdownファイルの一部です。

https://github.com/zenn-dev/google-cloud-workshop-202311-xenn/blob/main/tutorial_ja.md#L1-L13

Markdownファイルを作法にのっとって作成すれば、それだけでいい感じにハンズオン資料が作れる作れるということがわかりました。作法については、以下のページに詳しく説明があります。

リンク先はチュートリアルのチュートリアルがある構成で、細かく把握したい場合は便利です。大まかには、次の点を把握しておけばそれなりの資料が作成できると思います。

  • h1は資料にひとつだけで、ハンズオンのタイトルを入力する
  • h2は改ページ(別ステップ)になる
  • h3はページ単位での見出しに役立つ。ただし、フォントの関係なのか日本語は細く表示されるため、### **Cloud SQL をわざと停止する** にように太字で指定するのがよさそう
  • コードブロックの言語を sh などシェル系にすると、内容をそのまま Cloud Shell へ打ち込んでくれる(が、こちらは使わずコピペのほうがいいかもしれない、後述)

なお、画面を操作してもらうシーンではスクリーンショットなど画像(![](/画像.jpg))を貼りたくなりますが、どうやら対応していない様子でした。やり方あれば教えてください。

コードブロックの転送は使わないほうがいいかも?

私が正しく使えていないだけの可能性もありますので、記録として見てください。ハンズオン資料のMarkdown資料では、次のようにコードブロックを書くと、

```sh
gcloud config set run/region asia-northeast1
gcloud config set run/platform managed
```

画面では次のような表示になり、

左側のシェルアイコンを押すと、 Cloud Shell へ直接内容を転送できます。しかし、次のようなヒアドキュメントをつかったコマンドの場合、意図したどおりには転送してくれない可能性があります。

```sh
XENN_API_ROOT_URL=$(gcloud run \
    services describe xenn-api \
    --region asia-northeast1 \
    --format json | jq -r \
    '.status.url' )
cd ~/$GITHUB_REPOSITORY_NAME/web \
    && cat << EOF > .env.production
NEXT_PUBLIC_API_ROOT=$XENN_API_ROOT_URL
EOF
```

Cloud Shell で打ち込んでほしいコマンドは、手数をかけるデメリットを許容してもらい、コピペで実行してもらうのが無難かもしれません。

gcloud コマンドがはじめからつかえる

Cloud Shell によるハンズオンの良い点ふたつ目です。AWS CloudShellでも同様だと思いますが、クラウドプラットフォーム専用のCLIが最初から利用できるのはやはりありがたいです。また、ログインしているプリシパルと同等のコンテキストでgcloudコマンドを利用できるため、サービスアカウントや権限を設定する手間も省けます。

今回は、アプリケーション開発にフォーカスしたハンズオンにしたい意向がありました。gcloudコマンドがはじめからつかえることで、短い時間で本題に入れ、時間を有効に使えました。

terraform コマンドがはじめからつかえる

Terraform は、IaCを実現するためのツールのひとつで、とくに Google Cloud においては積極的に使われている印象があります。Zennでも、インフラの管理には Terraform を利用しています。

https://zenn.dev/waddy/articles/terraform-google-cloud

ハンズオンに必要なGoogle Cloudリソースは、gcloudコマンドでも作成できます。しかし実際の開発では、複数メンバーでリソースを管理することもあるでしょう。今回のハンズオンではTerraformを使うかどうか迷ったのですが、terraformコマンドがCloud Shellに組み込まれていることが後押ししてくれました。

エディタが使える

Cloud Run そのもののハンズオンは、公式のチュートリアルも充実していますし、Google Cloud Japanさまがさまざまなイベントで用意してくださったものもあります。

https://github.com/google-cloud-japan/gcp-getting-started-cloudrun

差別化に当たり「アプリケーションの運用」まで踏み込んだハンズオンを考えました。具体的に入れた手順が、

  • コードを修正してデプロイしなおす
  • モニタリングをおこなう

でした。このうち、コードを修正する際にエディタが役に立ちました。さすがにローカルに起動してローカルDBとつなげて…というところまではできませんでしたが、実際のアプリケーション運用に近い体験を用意できたと思います。


APIのコード修正・再デプロイの手順ではCloud Shellエディタを利用しました

反省点

直接入力ではなくコピペのほうが無難かもしれない

先述のとおりです。ハンズオンのなかではAPIと疎通できないという形で露見し、原因がわからず困っていました。参加者の方に「もしかしたらEOF付きのコマンドをCloud Shellに直接送るとうまくいかないかも」とピンポイントで指摘していただいてことなきを得ました。焦りました。ありがとうございました。

プロジェクトによってAPIが有効でないケースがある

これもGoogle Cloudハンズオンあるあるだと思いますが、あらかじめ利用するAPIをすべて有効にするのは難しいかもしれません。有効にするべきAPIは、terraform applygcloud 時にエラーになりエラー出力で有効化のためのURLを教えてくれるため、都度有効にしていくと割り切っても良さそうです。

真似したいハンズオン資料

これからあたらしくハンズオン資料をつくるとして、お手本がほしいところです。幸いにも Google Cloud Japanさまが日本語でチュートリアル資料を公開してくださっているため、私はそちらを参照させていただきました。

https://github.com/google-cloud-japan/gcp-getting-started-cloudrun

https://github.com/GoogleCloudPlatform/gcp-getting-started-lab-jp

おわりに

ハンズオンのイベントを振り返りながら、Cloud Shell の便利な点について記録しました。

Cloud Shell と teachme コマンドを活用することで、環境の差分が少なく、時間をより有効に使えるハンズオンを構成できます。ブログや動画も学習リソースとして有用ですが、それに加えて実際の環境で動かせるアプリケーションを構築できるのは、理解の一助となります。今後もハンズオンやオンボーディングで活用していきたいです。

ハンズオンで利用したリポジトリ

https://github.com/zenn-dev/google-cloud-workshop-202311-xenn

Discussion