Cloud Run を使ってみる
環境設定
https://cloud.google.com/run/docs/setup?hl=ja#before-you-begin
事前準備
- Cloud Run APIを有効にする
- gcloud CLI のインストール
- Docker のインストール
- ソースとDockerfileを準備(ソースはローカルで実行できることを確認済み)
コンポネをアプデする
$ gcloud components update
リージョンを設定する
$ gcloud config set run/region REGION
東京リージョンもあるぽいけど us-central1にしてしまった
コンテナをビルドする
コンテナのビルドにはローカルでビルドするか、Cloud Build を使う方法がある。
ローカルで Docker コンテナをビルドする
https://cloud.google.com/run/docs/building/containers?hl=ja
Dockerfile のあるディレクトリで
$ docker build --tag IMAGE_NAME:TAG_NAME .
IMAGE_URL は、コンテナ イメージへの参照(us-docker.pkg.dev/cloudrun/container/hello:latest など)に置き換えます。
コンテナイメージへの参照は例えば Docker hub みたいなプライベートリポジトリかな?使ってないので、今回は素直に Cloud Build を使うことにする
Cloud Build でビルドする
$ gcloud builds submit --pack \
image=[ホスト名]/[GCPプロジェクトID]/[GCP内でのイメージ名]:[タグ]
IMAGE_URL をコンテナ イメージ URL(たとえば、gcr.io/myproject/myservice)で置き換えます。
ビルド始まる
...
ビルド〜
...
-----------------------------------------------------------------------------------------
ID CREATE_TIME DURATION SOURCE IMAGES STATUS
xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx 2023-02-11T06:41:59+00:00 1M13S gs://PROJECT_ID_cloudbuild/source/xxxxxxxxxx.xxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.tgz gcr.io/PROJECT_ID/IMAGE_NAME (+1 more) SUCCESS
成功すると Container Registory (GCR) にアップロードされる
今度は、Google Cloud CLI から Container Registory へのリクエストを許可するおまじないが必要らしい
$ gcloud auth configure-docker
...
// ~.docker/config.jsonというファイルができた模様。
Docker configuration file updated.
Cloud Runにデプロイする
https://cloud.google.com/run/docs/deploying?hl=ja
$ gcloud run deploy --project ${PROJECT_ID} \
--image gcr.io/${PROJECT_ID}/IMAGE_NAME
Service name (サジェストされた名前): // Enterで進む
Allow unauthenticated invocations to [サジェストされた名前] (y/N)? // Noでいい
エラー出る、詰む
ERROR: (gcloud.run.deploy) The user-provided container failed to start
and listen on the port defined provided by the PORT=8080 environment variable.
Cloud Run サービスの場合、コンテナはリクエストの送信先ポートで 0.0.0.0 のリクエストをリッスンする必要があります。デフォルトでリクエストは 8080 に送信されますが、選択したポートにリクエストを送信するように Cloud Run を構成することもできます。Cloud Run は、PORT 環境変数をコンテナに追加します。Cloud Run コンテナ インスタンス内では、リクエスト送信先ポートが PORT 環境変数の値に常に反映されます。デフォルトは 8080 です。
Cloud Run は特定のポートでのリッスンが必須なのか?Cloud Run はwebサイト、API以外のアプリの実行はできないのだろうか?(スクレイピングとか。今回は Twitter のタイムライン監視アプリを作った。)
作ったアプリがリッスンが不要なのでここへ来て困ってしまった。
そもそも要件に Cloud Run の用途があっていなかったのかもしれない。
gae がいいかもしれん
次回、Google App Engine(GAE)を使ってみる
イメージを削除する
gcloud container images delete [HOSTNAME]/[PROJECT-ID]/[IMAGE]@sha256:[IMAGE_DIGEST]
IMAGE_DIGEST は sha:256 のハッシュ値 sha256:<digest>
ERROR: Tags:
ERROR: (gcloud.container.images.delete) This operation will implicitly delete the tags \ listed above. Please manually remove with the `untag` command or re-run with \
--force-delete-tags to confirm.
untag
するか --force-delete-tags
しろと怒られる
$ gcloud container images delete [HOSTNAME]/[PROJECT-ID]/[IMAGE]:[TAG] --force-delete-tags
CLIから削除を確認。
イメージが削除されているか、Container Registory を確認したがすぐには反映されない模様
結局、コンソールから削除した。
コンテナの削除
Cloud Run のコンソールから簡単に削除ができた。