GoをCloud Runで動かしてみる。コードとDockerfileそれぞれでデプロイ
Goをデプロイしてみます。
前提条件として、GCPはちょっと知っていないとだめそうですね。
GCPは大昔触ったことがありましたが、プロジェクトとかの分け方がよくわかってないため、そのあたりからおさらいでやっていきます。
これを参考にしてやってみます。
まず、クイックスタートをやってみたいと思います。
その前に、公式のドキュメントもチェックしておきます。
チュートリアルは、なんかトピックが多すぎて、だめだ。
クイックスタートはなんか軽そうだし、上のQiitaの記事でも参考にしていたので、これを確認します。
ちょうどGoのやつがありました。これでいいじゃん。
「Cloud Shell」でできるみたいなので、これで進める。
1. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。
プロジェクトを作成します。
作成できました。
2. Cloud プロジェクトに対して課金が有効になっていることを確認します。詳しくは、プロジェクトで課金が有効になっているかどうかを確認する方法をご覧ください。
大丈夫そうでした。というより、新規アカウントで作成したので、そのときに登録しました。
300$クレジットげっと!
3. Google Cloud CLI をインストールして初期化します。
3-1. gcloudをmacにinstallしてみます。
Quickstart: Install the Google Cloud CLI | Google Cloud CLI Documentation
と、これをやろうとしたのですが、brewでありそうなので、そっちでやってみます。
brewのバージョンを確認
installします。
完了後、以下を.zshrcに追記
以下実行
これでパスが通りましたわ。
初期化も必要みたいなので、やっておきます。
ブラウザで認証画面になるので、使いたいアカウントを設定します。
使用するプロジェクトもここで選ぶように言われるので選びます。
なんかzennの記事だとできなかったので、普通にbrewの指示通りにやったらできました。やはり公式が正義か。。
Cloud Run サービスのデフォルト プロジェクトを設定するには
(gcloud initで選択済みなのでこれは必要なさそうだったが、まあいい)
4. サンプル アプリケーションを作成する
helloworldディレクトリを作成して、
go.modファイルを以下で作成
以下でも良いようだが、goのバージョンが上がっていそうなので、素直に上記ファイルを作成した。
main.goを以下で作成
5. ソースから Cloud Run にデプロイする
main.goのあるディレクトリで以下コマンド
諸々聞かれるオプションを適当に設定していく。
と、エラーになった。
アカウント作ってから何もいじってないからadminユーザーとして実行しているような気がするんだがー
もう一回実行してみたら、行けました。
たぶん途中で待ち時間の間にオプションに変な文字が入ってしまっていて正しく入力できていなかったのかもしれません。
との表示があったのでアクセスすると、Hello, Worldの文字が!
成功!?
デプロイ簡単すぎわろたぁ〜
クイックスタートはここで終わりです。
すぐに終わって物足りない感あったので、もう少し見てみます。
<サービスを開発する>
軽く読みました。
<全般的な開発のヒント>
以下自分が気になった部分の引用と、まとめです。
・バックグラウンド アクティビティ
・Cloud Run はリクエストを 10 秒以上維持しないため、コンテナの起動に 10 秒以上かかる場合は、最小インスタンス数を 1 以上に設定する必要があります。
・Cloud Run では、リクエスト間でサービスの状態が維持されるとは限りません。ただし、Cloud Run はコンテナ インスタンスを再利用してトラフィックの処理を継続するため、グローバル スコープで変数を宣言することで、その値を以降の呼び出しで再利用できます。個々のリクエストで値が再利用されるかどうかを事前に確認することはできません。
・グローバル変数の扱いに注意する
・alpineかscratch等、小さいサイズのベースイメージを使用する。
<コンテナをビルドする>
Dockerfileからデプロイ
大枠はこれで良さそうですが、Dockerfileとか含め、実際に絶対に動くやつでまずは確認したいので、そういった情報を探してみます。
これを参考にしてやってみる。
新しいプロジェクトを作ってトライします。
`main.go`
以下実行
ブラウザからhttp://localhost:3000 にアクセス。
「Hello, world」が表示されました。良さそうです。
`Dockerfile`
→成功。
→http://localhost:3000 にアクセスして成功。hello, worldが表示される。
Container RegistryへのPush
Container RegistryよりもArtifact Registryの方が推奨されているみたいなので、使ってみるか?
一旦GCRの方でやってみて、すぐ変更できそうな気もするのであとでやる。
Container Registryにまずはpushしてみる。
push するイメージを取得する
イメージを Container Registry に追加する
イメージを Container Registry に push する
GCPコンソールにイメージが確認できました。
Artifact Registryのクイックスタートも見てみます。
Artifact Registryのクイックスタート
Dockerリポジトリを作成する
リポジトリが作成されたことを確認
→OK
認証を構成
pushするイメージを取得
イメージにレジストリ名をタグ付けする
イメージをArtifact Registryにpushする
GCPコンソールでイメージがpushされていることが確認できました!
qiitaの記事に戻る
imageのpushをします。
qiitaの記事ではContainer Registryを使っていましたが、Artifact Registryを使っていきます。
先にArtifact RegistryのGCPコンソールからリポジトリを作っておきます。
イメージにタグをつける
pushする
→ GCPコンソールから確認できました。
サービスの作成
うまくいかない。
イメージからCloud Runにデプロイをやってみると、以下のエラーメッセージが出てデプロイ失敗してしまいました。
localでは動いていたのに、、
これもやってみました。
これではちゃんと表示されていたので、なおさらおかしいですね。
以下のDockerfileとmain.goでやってみてもだめでした。
これを見て解決できるか?
ポートは問題ないと思うけどなぁ。
注: ARM ベースのマシンでコンテナ イメージを作成した場合、Cloud Run で意図したとおりに動作しないことがあります。この問題を解決するには、Cloud Build を使用してイメージをビルドします。
ARMベースじゃなくてApple M1 Proなんだけど、もしかしてこのあたりが問題なのか?
結論、以下で解決しました。
以下オプションを付けてbuildしてみる。
これでbuildしたらいけました!
Artifact RegistryのイメージからCloud Runにデプロイを選択して、リージョンはasia-northeast1にして、認証は「未認証の呼び出しを許可」にして「作成」
すると、サービスが作成されて、表示されたURLにアクセスすると、Hello World!の文字が!
くぅ〜これにて完結です!
このあたりは一回どっかできれいにまとめたいところ。