Amazon Managed GrafanaをOkta認証を用いてセットアップしてみた

#はじめに
NTTドコモサービスイノベーション部1年目の上野です。
本記事はNTTドコモ R&D Advent Calendar 2021の12日目の記事です。
自チームで開発しているシステムを簡単に監視したいということからAmazon Managed Service for Grafana（AMG）を触ってみたので最初の設定などをまとめてみたいと思います。
今回は普段よく活用しているOktaと連携してセットアップしてみました。また、最近（投稿日：2021年12月12日）プラグインとして追加されたRedshiftとの接続も確認してみたいと思います。調べてみて、AMGはリリースしたばかりだからなのか、ネット上では参考となる記事がまだ少なかったので少しでも参考になれば良いなと思います。

#Amazon Managed Service for Grafanaとは？
Grafanaはログ・データ可視化ツールです。Amazon Managed Service for GrafanaはこのGrafanaがAWS上でマネージドサービスとして活用できるサービスです。大きな特徴としてAmazon CloudWatch、Amazon Elasticsearch Service、Amazon Timestream、AWS IoT SiteWise、AWS X-Ray、Amazon Managed Service for Prometheus (AMP), Amazon Athena, Amazon RedshiftといったAWSのサービスと簡単に連携して可視化をすることが可能となります。

#概要
AMGでは認証アクセスとしてAWS SSOとSAML認証に対応しています。今回はOktaをIDプロバイダーとして、SAML認証を用いてAMGをセットアップしていきたいと思います。セットアップ後はCloudWatch, RedshiftをAMGと接続するまで行いたいと思います。
SAML認証の設定は他にも下記を参考にできると思います。
[非Orgnizations環境のAWSアカウントからSAML認証を使ってAmazon Managed Grafanaをセットアップしてみる](https://dev.classmethod.jp/articles/amazon-managed-grafana-saml/)
またSSOの設定は下記を参考にすると良いと思います。
[Amazon Managed Grafanaをセットアップして使ってみる](https://dev.classmethod.jp/articles/amazon-managed-grafana-awssso/)

#セットアップ
では、実際にAMGのセットアップを行っていきます。

##ワークスペースの作成
最初にワークスペースの作成をしましょう。今回は簡単に名前を”Grafana-Workspace”とします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294931/fc562062-87d9-9455-7852-ebed42a5c13e.png)
認証アクセスはOkta認証を活用するためSAML認証とし、アクセス許可タイプはサービスマネージドとします。サービスマネージドは選択したデータソースに応じて自動的にIAMロールを作成してくれます。ここでは、後に接続するCloudWatchとRedshiftをデータソースとして選択します。独自に各サービスへのアクセス制限をしたい場合にはカスタマーマネージドを選ぶと良いです。これでワークスペースの作成は完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294931/50825895-9fd5-b14a-4680-d34ebed498e3.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294931/af632cb0-1e32-2f9b-98a7-3a6e9caa5dd6.png)


##SAMLの設定
AMGは認証アクセスが必要となります。そのため、まずはoktaの設定からしていきます。
最初にOktaの画面から[Applications] > [Applications] から[Browse App Catalog]を選択し、検索からAmazon Managed Grafanaを探し、[Add]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294931/3510fb78-f57e-4bbe-8b8d-551a43f6c028.png)
次にOkta上のセットアップをしていきます。[Sign On]タブからSettingを編集し、Advanced Sign-On Settingsの”Name Space”と”Region”の欄を入力します。この二つはGrafanaワークスペースURLを確認することでわかります。URLは以下ような形式で生成されています。
**[Name Space].grafana-workspace.[Region].amazonaws.com**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294931/db15292f-1883-54d7-ad2c-e546a846a227.png)
また、使用するユーザも登録しておきます。[Assignments]タブからOkta上のユーザの登録を行います。今回は「Admin User」と「Read User」を登録しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294931/2a94f6ec-b285-5970-1a1a-6505237fff40.png)
次にAWS上でのセットアップをしていきます。SAMLの「セットアップを完了する」を選択します。
最初にメタデータのインポートを行います。インポート方法としてURLを選択し、Okta上からメタデータURLを入力します。[Sign On]タブからSettingsの中にある[Identity Provider metadata]のリンクを取得します。このリンクを入力すればこの設定は完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294931/4c8e6cf1-6e92-f1b9-c5d6-4cef2f6396e5.png)
アサーション属性のマッピングはとりあえず適当な値に設定をします。後に管理者権限の設定としてOkta上の設定で用います。アサーション属性ロールに”Admin_Role”を、管理者ロールの値に”Admin”を設定しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294931/5003be45-b263-7342-efaf-913b7a5bcc0c.png)
これでSAML設定を保存します。この設定が終了するとGrafanaワークスペースURLから下記（左）の画面に行くことができます。実際にログインしてみます。[Sign in with SAML]を選択し、Okta画面から「Admin User」でログインしてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294931/58fdba46-6827-b775-d9d0-af14faefc976.png)
ログインできました。しかし、このままだと閲覧者権限しか与えられません。そのためダッシュボードの作成などを行うことはできません。AMGでは先ほどのアサーション属性のマッピングに対応しているユーザ以外は全て閲覧者権限となります。そのため、管理者権限を与えるためにはユーザにアサーション属性のマッピングを対応させる必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294931/e5d98aa6-aa74-d4f1-7acf-246f950b3d1e.png)

##管理者権限の設定
では、管理者権限の設定を行います。今回はOkta上のユーザの属性にあるUser typeが”Admin”のユーザを管理者とします。ユーザの属性は[Directory] > [People]の[Profile]タブから編集することができます。
まずはAMGのSAML設定上にあるアサーション属性ロールをOktaのユーザ属性に対応させます。[Sign On]タブからSettingsを編集し、SAML2.0の中にあるAttributes(Optional)の欄に入力します。Nameにアサーション属性で設定した”Admin_Role”を、ValueにUser typeを示す”user.userType”を入力します。前者がAWS上で設定した値、後者がOkta上で設定した値となります。
次にAMGのSAML設定上にある管理者ロールの値をOkta上のユーザ属性の設定に対応させます。「Admin User」の[Profile]タブからUser typeを管理者ロールの値で設定した”Admin”に設定します。「Read User」ではこれを"Reader"に設定しておきます。
これで設定は完了です。複雑ですね、、、もしかするともう少し簡単な方法があるかもしれません。簡単に対応させた図を下に示しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294931/2332ab5e-f8a9-c5aa-871b-c47a09720256.png)
では、ログインしてみます。「Admin User」でログインしてみると管理者権限でログインできました！当たり前ですが、管理者権限だと選べる項目がかなり多く感じますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294931/384f4d20-a024-b336-d0bb-149de7586841.png)
ちなみに「Read User」でログインしてみると先程と同じような閲覧者権限の画面が出てきます。AMG上でユーザを確認するとそれぞれ権限分けできているのが確認できますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294931/c4c3728d-d9f0-affc-63ec-a5144a2183f0.png)

#データソースとの接続
セットアップしたAMGとデータソースを接続してみます。今回はCloudWatchとRedshiftとの接続を行っていきたいと思います。

##CloudWatchとの接続
まずCloudWatchと接続してみます。接続はものすごく簡単です。画面左の[aws]タブを押して、[CloudWatch]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294931/54f364cf-4a8b-09b9-9bdd-eda6bdd532da.png)
選択後は自分が用いているリージョンを選択し、[Add data source]を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294931/7e50c45d-34b9-53e4-132e-2a8f712a7e5a.png)
そうすると下記のように接続データソース名が下に表示されるのでこれで接続は完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294931/62b24ec3-d299-4975-cdfa-6ea80ce6408f.png)
[Go to Setting]を押すと、詳細の設定を行うことができますが、設定しなくても接続はできています。試しに押すと、詳細な設定に移動します。ここで何も設定を変えずに[Save & test]を押してみると、正常に接続されていることが確認できます。接続は詳細な設定もせずにできるのでとても簡単ですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294931/910aa6c5-49b7-9ee7-7e94-0204849f32d7.png)
設定したCloudWatchを用いてグラフを作ってみましょう。ダッシュボード上のグラフは下記みたいに要素を選択することによって簡単に作成することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294931/47dead92-5a6e-2a6f-0314-33f08def34a3.png)

##Redshiftとの接続
さて、続いてRedshiftへの接続を行いたいと思います。本当は「Redshiftを使いたかったのですが、接続は対応していなかったです(TдT)」というのをこの記事のオチにしようと思っていました。しかし、直近でAMGについて調べてみると、こんな記事を発見しました。
[Amazon Managed Grafana が Amazon Athena および Amazon Redshift データソースと Geomap の視覚化のサポートを追加]( https://aws.amazon.com/jp/about-aws/whats-new/2021/11/amazon-grafana-athena-redshift-data-sources-geomap/)
つ、追加されている！！
ということで、実際に接続をしてみます。
最初はCloudWatchと同様に画面左の[aws]タブを押して、[Redshift]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294931/7e101387-974e-7730-3736-636a7c579f28.png)
リージョンを選択した後に、自分が接続したいクラスターを選択し、[Add data source]を押すと、データソースの設定を行うことができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294931/4eaaa9b9-84ae-a004-4d53-7d5788082d88.png)
詳細な設定に移動してみます。AMGでは”GetClusterCredentials”というポリシーを用いてデータベースへのアクセス権限が許可されているようですね。そのため、ログイン時に使用するパスワードは必要ないようです。Cluster Identifier, Database, Database Userを設定した後に[Save & test]を選択してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294931/203a4fc4-5350-74de-ed5f-0102177c44e0.png)
エラーが出てきました... よく読んでみると”redshift-data:ExecuteStatement”というポリシーが足りていないように見えます。そのため、ワークスペース作成時に自動的に生成されたIAMロールにRedshiftのデータ閲覧ポリシーを作成し、追加してみます。（”redshift-data:ExecuteStatement”だけでもデータソースへの接続はできますが、その他のポリシーがないとダッシュボードの作成時にテーブル一覧などの確認がUI上でできなくなります。）

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "DataAPIPermissions",
            "Action": [
                "redshift-data:DescribeTable",
                "redshift-data:ExecuteStatement",
                "redshift-data:ListTables",
                "redshift-data:ListSchemas"
            ],
            "Effect": "Allow",
            "Resource": "*"
        }    
　　　　　　　　]
}

```

同様に[Save & test]を選択してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294931/8e54fecf-9c83-e1fe-c382-ef2cf132d0b7.png)
今度は指定したデータベースユーザに対して”redshift:GetClusterCredentials”のポリシーが足りていないと書かれています。そのため、先ほど作成したポリシーにこの内容追加してみます。

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "redshift:GetClusterCredentials",
            "Resource": [
                "arn:aws:redshift:*:*:dbuser:*/*"
            ]
        },
　　　　　　　　　　　　　　　　{
            "Sid": "DataAPIPermissions",
            "Action": [
                "redshift-data:DescribeTable",
                "redshift-data:ExecuteStatement",
                "redshift-data:ListTables",
                "redshift-data:ListSchemas"
            ],
            "Effect": "Allow",
            "Resource": "*"
        }
    ]
}
```
再度、挑戦！！無事接続できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294931/b6f93efa-f3ed-8ea9-2ca0-65a2fe046132.png)
今回追加したポリシーは自動的に生成されたIAMロールに付与されているポリシーの”AmazonGrafanaRedshiftAccess”にも存在します。しかし、条件がついており、それを満たしていなかったため追加での設定が必要でした。（”redshift:GetClusterCredentials”アクションではデータベースユーザ名が”redshift_data_api_user”に対してのみ許可されるような内容になっていました。）
少し大変でしたが、比較的簡単に設定することができますね。

#まとめ
今回はAmazon Managed Service for Grafanaを、Okta認証を用いてセットアップしてみました。また、セットアップしたAMGとCloudWatch, Redshiftの接続を行ってみました。AWS歴一年目の自分としてはSAML認証でのセットアップの部分で多少難しい部分はありましたが、データソースへの接続などは比較的簡単にできるなと感じました。できて一年ほどのサービスですが、プラグインで様々なサービスが追加されつつあるので、今後様々なサービスを簡単に可視化できるのではないかと期待しています。（Redshiftが追加された時はかなり驚きました。）
AMGを使いたいみなさんのお力になれればと幸いです。以上、ここまでお読みいただきありがとうございました。