NRIネットコム Blog

NRIネットコム社員が様々な視点で、日々の気づきやナレッジを発信するメディアです

GrafanaのOAuth認証にAmazon Cognitoを使用する方法とHTTPS化について考えてみる

はじめに

こんにちは。2年目の大林です。
本ブログでは、GrafanaのOAuth認証にAmazon Cognitoを使用する方法とHTTPS化について書いていきたいと思います。
Grafanaとは、Grafana Labs社が開発したオープンソースのデータ分析ツールで、データの視覚化や監視をすることができます。
ブログの題名にはGrafanaと書いていますが、本ブログを読むことでAmazon Cognitoを使用した認証やAmazon Certificate Managerを使用したHTTPS化についても学ぶことができます。

今回の課題

Grafanaを使用してAWSリソースを監視しようとしました。Grafanaを使用する方法は、オープンソースのGrafanaをサーバー内にインストールする方法とAWSが提供しているAmazon Managed Grafanaを使用する方法の2つがあります。当初の計画では、メンテナンスの手間が簡略化されることからAmazon Managed Grafanaを使用することにし、認証にはAmazon Cognitoを使用する予定でした。
ですが、調べたところAmazon Managed Grafanaの認証にAmazon Cognitoを使用することはできないことがわかりました。
そのため、Amazon Managed Grafanaを使用する方針からEC2インスタンスにオープンソースのGrafanaをインストールする方針に変え、OAuth認証にAmazon Cognitoを使用することにしました。

docs.aws.amazon.com

今回の構成

Grafanaのセットアップ

①構成図の通りにVPC、サブネット、NATゲートウェイを作成して、プライベートサブネットにEC2インスタンスを起動する
②EC2インスタンスに接続してGrafanaをインストールする
  1. # Grafanaをインストール
  2. sudo yum install -y https://dl.grafana.com/oss/release/grafana-10.1.4-1.x86_64.rpm
  3. # Grafanaを実行
  4. sudo systemctl start grafana-server
  5. # 自動起動を有効
  6. sudo systemctl enable grafana-server
  7. # ステータスを確認
  8. sudo systemctl status grafana-server
③ALBを設定する

Grafanaのデフォルトポートは3000です。そのため、ユーザーからALB間でのポートは80、ALBからEC2インスタンスに間では3000を指定します。
具体的には、ALBのリスナー設定ではポート80、ターゲットグループのポート設定では3000を指定します。

④セキュリティグループを設定する
AWSサービス インバウンドルール アウトバウンドルール
ALB HTTP / ポート80 / マイIP すべてのトラフィック / すべて / 0.0.0.0/0
EC2インスタンス カスタムTCP / ポート3000 / ALBに設定されているセキュリティグループ すべてのトラフィック / すべて / 0.0.0.0/0
⑤ALBのDNS名からアクセスしてみる

ALBのDNS名を指定してアクセスすると以下のような画面が表示されます。

「Email or username」と「Password」に「admin」と入力するとパスワードを変更できる画面に遷移します。好きなパスワードを入力して「submit」をクリックすればGrafanaのHome画面にログインすることができます。

ACMを証明書を発行してHTTPS化する

※この手順の前提として、ホストゾーンを作成しておく必要があります。

①AWS Certificate Managerで証明書をリクエストする

AWS Certificate Managerのマネジメントコンソールを開き、証明書をリクエストしていきます。
ここでは、Route53で作成したドメインと追加のサブドメインを指定します。
(例:example.com / test.example.com)
リクエストした証明書のドメインのCNAME 名とCNAME 値をコピーします。

②ホストゾーンにレコードを作成する

Route53のマネジメントコンソールから上記でコピーしたCNAME 名とCNAME 値を追加していきます。 Route53のマネジメントコンソールから「レコードを作成」をクリックして、レコードタイプはCNAMEを選択します。 レコード名にCNAME 名、値にはCNAME 値を指定します。

AWS Certificate Managerでリクエストした証明書を確認すると、ドメインの検証が成功して、証明書が「発行済み」になっているはずです。
「発行済み」になっていない場合は、ホストゾーンで追加したレコードのCNAME 名とCNAME 値が適切であるか確認してください。
(失敗するレコード名の例:_XXXXXXXXX.example.com.example.com)
もう一度Route53のマネジメントコンソールを開いてレコードを作成します。 上記の手順と同様にレコードタイプはCNAMEを選択します。レコード名は証明書をリクエストする際に追加したサブドメインを指定して、値にはALBのドメイン名を指定します。

③ALBに証明書を設定する

ALBのリスナーを開いて、プロトコルをHTTPS、ポートを443に指定します。
セキュアリスナーの設定で作成した証明書を選択します。

④セキュリティグループの設定を変更する
AWSサービス インバウンドルール アウトバウンドルール
ALB HTTPS / ポート443 / マイIP すべてのトラフィック / すべて / 0.0.0.0/0
EC2インスタンス カスタムTCP / ポート3000 / ALBに設定されているセキュリティグループ すべてのトラフィック / すべて / 0.0.0.0/0


⑤Grafanaにアクセスしてみる

https://サブドメイン名にアクセスすると以下のようにHTTPS通信が可能になります。

OAuth認証にAmazon Cognitoを設定する

①Amazon Cognitoのユーザープールの作成と設定をする

マネジメントコンソール上からユーザープールを作成していきます。サインインオプションは「ユーザー名」と「Eメール」を選択し、ユーザー名の要件は「ユーザーが任意のユーザー名でサインインすることを許可」と「ユーザー名の大文字と小文字を区別する」を選択します。

セキュリティ要件を設定する

サインアップエクスペリエンスを設定する

メッセージ配信を設定する

アプリケーション統合を設定する
※既存のCognitoドメインと被らないように注意する

許可されているコールバックURLに「https://サブドメイン/login/generic_oauth」を指定します。

高度なアプリケーション設定の認証フローの設定に「ALLOW_ADMIN_USER_PASSWORD_AUTH」と「ALLOW_USER_PASSWORD_AUTH」を選択します。

OpenID Connectのスコープでは、「OpenID」、「Eメール」、「aws.cognito.signin.user.admin」、「プロファイル」を選択します。
許可されているサインアウトURLには、「https://サブドメイン/login/」を指定します。

後ほどGrafanaの設定で使用するので、クライアントIDとクライアントシークレットをメモしておきます。

Cognitoでユーザーを作成する ユーザー名、Eメールアドレス、パスワードを設定して、ユーザーを作成していきます。

②Grafanaの設定ファイルでOAuth認証の設定を編集する
  1. # Grafanaの設定ファイルを編集する
  2. sudo vi /etc/grafana/grafana.ini
  3. # OAuthの設定を以下に変更する
  4. [auth.generic_oauth]
  5. enabled = true
  6. name = OAuth
  7. allow_sign_up = true
  8. client_id = クライアントID
  9. client_secret = クライアントシークレット
  10. scopes = email profile aws.cognito.signin.user.admin openid
  11. auth_url = https://ユーザープール名.auth.ap-northeast-1.amazoncognito.com/oauth2/authorize
  12. token_url = https://ユーザープール名.auth.ap-northeast-1.amazoncognito.com/oauth2/token
  13. api_url = https://ユーザープール名.auth.ap-northeast-1.amazoncognito.com/oauth2/userInfo
  14. # Grafanaを再起動する
  15. sudo systemctl restart grafana-server


再度Grafanaにアクセスしてみます。
「Sign in with OAuth」を選択すると以下の画面に遷移します。
ユーザー名とパスワードを求められるので、Cognitoユーザー作成時に設定したユーザー名とパスワードを入力すると無事にログインできます。 ※サインインの画面にエラーメッセージが出ていた場合、Cognitoの許可されているコールバック URLに指定したURLにアクセスしてみるとサインイン画面が表示されるかもしれません。


おわりに

今回はGrafanaのOAuth認証にAmazon Cognitoを使用する方法とHTTPS化の手順ついて説明していきました。全てのリソースを作成するとブログが長くなってしまうので一部割愛させていただきましたが、少しでもお役に立てれば幸いです。私はCognitoを使用した経験が多いわけではなかったのでブログを書いていて大変勉強になりました。