GrafanaをCloudRun上で起動する
記事の内容
GrafanaをCloudRun上で動作させる方法を紹介します。
対象読者
- Grafanaを使いたいが、Kubernetesクラスターは運用したくない人
記事の長さ
1分で読めます
Grafana on CloudRun
GrafanaはKubernetesと一緒に使われることが多く、Kubernetesクラスター上でGrafanaを運用する事例をよく聞く。
一方、CloudRun上でGrafanaを起動することもできるが、それに関する記事がなかなか見つからなかったため、GrafanaをCloudRunで起動するフローをこの記事に書いていく
Dockerの作成
CloudRunでアプリケーションを動作させるためには、Dockerイメージを作成する必要がある。
そのため、まずはGrafanaアプリケーションが動作するDocker Imageを作成する。
Dockerfile
FROM grafana/grafana-enterprise
COPY ./datasources /etc/grafana/provisioning/datasources
COPY ./dashboard-settings /etc/grafana/provisioning/dashboards
COPY ./dashboards /var/lib/grafana/dashboards
上記Dockerfileを元にDocker Imageを作成する。
- datasources
- datasourceの設定ファイルを入れるディレクトリ
- dashboard-settings
- dashboardの設定ファイルを入れるディレクトリ
- dashboards
- dashboardのjsonファイルを入れるディレクトリ
というディレクトリ構成だ。
このディレクトリ構成や各ファイルの中身に関しては、以下の記事で解説しているので、興味がある方は読んでほしい。
Docker Build
Dockerfileができたので、Docker Buildを実行して、Docker Imageを作成する。
$ docker build . -t cloudrun-grafana
M1/M2 Macの人はこちらでBuild
$ docker build --platform linux/amd64 . -t cloudrun-grafana
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
cloudrun-grafana latest a6a1315e4e17 15 seconds ago 408MB
正常にDocker Imageが作成できた。
念の為、今ビルドしたDockerImageをローカル環境で実行してみる。
$ docker run -p 1111:3000 cloudrun-grafana
にて起動し、http://localhost:1111 にアクセスすると、Grafanaの初期画面が表示される。
Docker Push
Docker Imageが完成したので、次はCloudRunで実行するために、Docker ImageをGCRにPushする。
$ docker tag cloudrun-grafana gcr.io/<Project ID>/cloudrun-grafana
$ docker push gcr.io/<Project ID>/cloudrun-grafana:latest
上記コマンドでGCRにPushができた。
CloudRunを実行する
CloudRunで実行するためのDocker Imageの準備が完了したので、最後にCloudRunを実行する。
resource "google_cloud_run_v2_service" "this" {
project = var.project_id
name = "grafana-cloudrun"
location = "asia-northeast1"
ingress = "INGRESS_TRAFFIC_ALL"
template {
containers {
image = "gcr.io/${var.project_id}/cloudrun-grafana:latest"
}
}
}
data "google_iam_policy" "noauth" {
binding {
role = "roles/run.invoker"
members = ["allUsers"]
}
}
resource "google_cloud_run_v2_service_iam_policy" "policy" {
project = var.project_id
location = "asia-northeast1"
name = google_cloud_run_v2_service.this.name
policy_data = data.google_iam_policy.noauth.policy_data
}
上記のTerraformは、先ほど作ったDocker ImageをCloudRun上で動作させるためのソースだ。
これをTerraform Applyすることで、CloudRunを起動する。
$ terraform apply
google_cloud_run_v2_service.this: Creating...
google_cloud_run_v2_service.this: Still creating... [10s elapsed]
google_cloud_run_v2_service.this: Still creating... [20s elapsed]
google_cloud_run_v2_service.this: Still creating... [30s elapsed]
google_cloud_run_v2_service.this: Still creating... [40s elapsed]
google_cloud_run_v2_service.this: Still creating... [50s elapsed]
google_cloud_run_v2_service.this: Still creating... [1m0s elapsed]
google_cloud_run_v2_service.this: Still creating... [1m11s elapsed]
google_cloud_run_v2_service.this: Still creating... [1m21s elapsed]
google_cloud_run_v2_service.this: Still creating... [1m31s elapsed]
╷
│ Error: Error waiting to create Service: Error waiting for Creating Service: Error code 13, message: Revision 'grafana-cloudrun-00001-dhx' is not ready and cannot serve traffic. The user-provided container failed to start and listen on the port defined provided by the PORT=8080 environment variable. Logs for this revision might contain more information.
...
│
すると、上記のようなエラーが発生します。CloudRunはデフォルトで8080ポートで起動するためGrafanaのリッスンするポートを8080に変更しないといけません。
Grafanaの起動ポートを変更する
Dockerfile
COPY ./grafana.ini /etc/grafana/grafana.ini
grafana.init
[server]
http_port = 8080
上記設定を追加して、再度Docker BuildとDocker Pushを実行してください。
再度、terraform applyを実行します。
$ terraform apply
...
無事、CloudrunにGrafanaイメージをデプロイできました。
最後に、ブラウザからアクセスして確認します。CloudRunのコンソール画面にいくとCloudRunのURLが確認できるので、そのURLにアクセスしてください。
すると、Grafanaの管理画面にログインできます!
まとめ
今回は、GrafanaをCloudRun上で起動しました。
Dashboard・Datasourceともにソースコードで管理しているため、データベースへの接続をせずともGrafanaの運用を開始できます。
また、初期設定のため、Grafanaのログインユーザーは初期ユーザーのままで、本番運用する場合は、IAPを導入するかOAuthでログイン設定をする等の実装を行なってください。
サンプルソース
こちらに、今回作成したソースのサンプルソースを配置してあります!
note
勉強法やキャリア構築法など、エンジニアに役立つ記事をnoteで配信しています。
Discussion
非常に参考になりました!ありがとうございます!
nits.
文中で、grafana.initとなっている箇所がありますが、ご存知の通りgrafana.iniと思われます!
ありがとうございます!(どこかのタイミングで修正しておきます!