GrafanaをGitLab のアカウントでログインできるようにする

## はじめに
本記事では、[Grafana](https://grafana.com/)を、GitLab のアカウントでログインできるようにします。
設定手順と、よくあるエラーの対応策を説明します。
なお、本記事の正確性や完全性について保証しませんので、ご注意ください。

## 設定手順

  基本的には以下の公式説明のとおりです。

https://grafana.com/docs/grafana/latest/setup-grafana/configure-security/configure-authentication/gitlab/

#### GitLab OAuth アプリの作成

GitLab 上でGrafanaのApplicationを作成します。
GitLabのトップページから Admin -> Applications で新しいApplicationを作成します。

Redirect URIには以下のようにGrafanaのURIを指定します。

```
https://grafana.YOUR.DOMAIN/login/gitlab
```

末尾の`login/gitlab`を忘れないようにしてください。

その他の設定は各自環境に合わせてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/774545/be751f62-996d-756b-6d59-ae7bedd79d08.png)

作成したら、GITLAB_APPLICATION_ID と GITLAB_SECRET が表示されますので記録しておきます。  
GITLAB_SECRET は一度しか表示されないので記録を忘れないようにしましょう。忘れた場合は作ったApplication設定を開いて[Renew Secret]ボタンでSECRETを再生成できます。

#### Grafana側へGitLab Authの設定

Grafana側でGitLabにログインできるように設定を追加します。
設定項目については[公式ドキュメントを確認してください](https://grafana.com/docs/grafana/latest/setup-grafana/configure-security/configure-authentication/gitlab/#enable-gitlab-in-grafana)。
また、環境変数からGrafanaの設定を追加することも可能です。環境変数から設定する場合は、設定名の頭に`GF_{セクション名}_{項目名}`とすることで環境変数からGrafanaの設定を上書きできます。例えば、GitLab ログイン有効化のための設定項目は`enabled`、セクションは`auth_gitlab`のため、環境変数の設定名は`GF_AUTH_GITLAB_ENABLED`になります。
以下の例は、Amazon ECSを利用している場合の、設定例（タスク定義の環境変数）です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/774545/82e32aed-f09e-d50d-09f8-8d9b695dc13e.png)

基本的には上記の設定だけで、Grafanaのログイン画面上にGitLabでログインするためのボタンが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/774545/29032548-61df-b582-ed3e-2d2dde6de024.png)

ログインボタンを押して、GitLab側でGitLabにログインし、利用権限確認を承認するとGrafanaにログインできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/774545/ed0aabec-97c9-7ef4-9716-3f05febe06da.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/774545/3ef5dc99-94be-1024-1890-c5b7f26a15f4.png)


## TIPS

以下は問題が起きた場合の対応策やその他のTIPSです。

#### リダイレクトURIのエラー ：The redirect URI inclueded is not valid.

Grafana上のGitLabログインボタンをクリック後に、以下の画像のようにエラー(`The redirect URI inclueded is not valid`)が発生する場合があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/774545/6e6f029b-bbb7-1bcf-fc57-d2ec5ba27503.png)

上記エラーは、GitLab側のApplicationで設定したRedirect URIと、Grafanaが指定しているRedirect URIが異なっていると発生します。
Grafanaが指定しているRedirect URIは、上記エラー発生時のURLのパラメータ(redirect_uri)に埋め込まれています。
```
https://your.gitlab.jp/oauth/authorize?client_id=xxxx&redirect_uri=http%3A%2F%2Flocalhost%3A3000%2Flogin%2Fgitlab&response_type=code&scope=read_api&state=xxx
```
パラメータとGitLab側で設定したRedirect_URIが一致しているか確認してください。
Grafana側が指定しているRedirect_URL(URLのredirect_uriパラメータ)がおかしい場合、Grafanaの`server.domain`設定が適切でない可能性があります。
この場合は、Grafana側の設定(環境変数で設定する場合は`GF_SERVER_DOMAIN`)でGrafana自身の適切なドメインを設定してください。

プロキシの背後などにGrafanaがある場合は設定方法が異なりますので以下のドキュメントを参照してください。

https://grafana.com/tutorials/run-grafana-behind-a-proxy/

#### リダイレクト後タイムアウト：login.OAuthLogin(NewTransportWithCode)

GitLab側で権限確認を承認後、リダイレクト待機状態になり一定期間後タイムアウト、Grafanaにリダイレクトし、以下の画面のようなエラー `login.OAuthLogin(NewTransportWithCode)`になる場合があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/774545/219a7562-9bfc-1a45-4669-fcf4674a3952.png)

この場合は、Grafanaリダイレクト時に、GrafanaからGitLabへtoken取得リクエストが発行されますが、このリクエストがうまく処理できていない可能性が高いです。  
Grafanaの`GF_AUTH_GITLAB_TOKEN_URL` が正しい場合は、GrafanaからGitLabの経路が確立できているかを確認してください。
特にGitLabを独自に構築している場合、ファイアウォールで接続元を制限していないかなど確認しましょう。

#### ログインできるグループを制限

GrafanaにログインできるGitLabユーザを制限したい場合、グループを指定することで可能です。
※GitLab社提供のクラウドサービスgitlab.comを利用時はグループを制限しないと、gitlab.comのユーザであれば誰でもGrafanaにログインできるようになってしまうので注意しましょう。

Grafana側の設定`allowed_groups`を指定することでGrafanaにログインできるGitLabのグループを制限できます。

```
# GitLabグループのteam1とteam2のサブグループ(viewer)のみを許可
allowed_groups = team1, team2/viewer
```

環境変数で設定する場合は、`GF_AUTH_GITLAB_ALLOWED_GROUPS`を設定してください。

また、このままだとGrafana上のロールとの紐づけが行われません。ログイン自体はできますが、ログイン時に時間がかかることがあります）。サーバログに以下のようなエラーが出ます。

```
logger=oauth.gitlab t=2023-04-12T11:20:45.375047249Z level=warn msg="No valid role found. Skipping role sync. In Grafana 10, this will result in the user being assigned the default role and overriding manual assignment. If role sync is not desired, set oauth_skip_org_role_update_sync to true"
```

紐づけたい場合は`role_attribute_path`(環境変数では `GF_AUTH_GITLAB_ROLE_ATTRIBUTE_PATH`)を設定をしてください。

```
# GitLabのteam1に所属するユーザは Editorロール、それ以外はViewerロール
role_attribute_path	contains(groups[*], 'sic') && 'Editor' || 'Viewer'
```

紐づけをしない場合（Grafanaのロールは独自に管理したい場合）は`skip_org_role_sync`(環境変数では`GF_AUTH_GITLAB_SKIP_ORG_ROLE_SYNC`)を`true`に設定してください。

許可されていないグループのユーザがログインしようとすると以下のようなエラーが発生します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/774545/e0e61930-db66-1be0-308b-a6d402d645b2.png)

サーバーログには以下のようなログが吐かれます。

```
logger=context userId=0 orgId=0 uname= t=2023-04-12T11:30:13.401093711Z level=error msg="login.OAuthLogin(get info from gitlab)" error="user not a member of one of the required groups"
```

## おわりに

本記事では、GrafanaをGitLabのアカウントでログインできるようにOAuthを設定しました。  
GitLabとの連携によってアカウント管理が簡単になるのでGitLabをお使いの方は、ぜひ試してみてください。

## 商標
記載の会社名、製品名、サービス名等はそれぞれの会社の商標または登録商標です。