CloudWatch ダッシュボードを Cognito 認証を使って共有する

## はじめに
みなさま、[Amazon CloudWatch ダッシュボード](https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/CloudWatch_Dashboards.html) 使ってますか？
私はバリバリ使っています。
なぜ、CloudWatch ダッシュボード を使うかというと、New Relic や Datadog のお金を払えないからです！！笑
とはいえ、実は CloudWatch ダッシュボードは色々な機能があります。
例えば、以下のようなことができます。
- [複数のリージョンやアカウント](https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/create_xaxr_dashboard.html)に跨ってメトリクスやログ、トレースを集約できる
- [ダッシュボード変数](https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/cloudwatch_dashboard_variables.html)を使って、複数のウィジェットでさまざまなコンテンツをすばやく切り替えられる
- [ライブデータ](https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/cloudwatch-live-data.html) を使ってリアルタイムで分析できる
- [グラフ、メトリクス、線、数値、ゲージ、テキスト、アラームテーブル、リンクといったさまざまなウィジェット](https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/create-and-work-with-widgets.html)が用意されている
- [AWS アカウントに直接アクセスできないユーザーと共有](https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/cloudwatch-dashboard-sharing.html)できる
- その他、CloudWatch 外のデータをメトリクス化して表示したり（たとえば Prometheus や RDS など）、カスタムウィジェットを使って(Lambdaをつかって)表示を自由にカスタマイズしたりすることも可能

より詳しく CloudWatch ダッシュボード の機能を知りたい場合は AWSが用意している [One Observability Workshop](https://catalog.workshops.aws/observability/ja-JP/aws-native/dashboards) をご覧頂くとイメージがつきやすいです。

## やりたいこと
さて、ここから本題ですが、CloudWatch ダッシュボードをAWSアカウントへのアクセス権のない人にも使わせたいということはないでしょうか。
例えば、SREだけでなくアプリ側のエンジニアとダッシュボードを共有したい。むしろ、ビジネス側とSLOやエラーバジェットを共有したい。そもそも、AWSアカウントへのログインがめんどくさい。といったことがあると思います。

CloudWatch ダッシュボードを共有する場合、３つの選択肢があります。１つはリンクを知っている人全ての共有する方法。もう一つはユーザー/パスワードをCloudWatchに登録してその認証でログイン共有する方法。最後に、SSOを利用して共有する方法です。

これらを考えたときに、１つ目の方法はセキュリティ上、好ましくありません。２つ目の方法は利用者のパスワード管理が増えてしまい、あまりやりたくありません。そのため、SSO認証を利用して管理したいと考えました。ただし、私の場合は外部のSSOプロバイダーを利用しておらず、かつ Google Workspace ユーザーと共に(業務委託などで)個別にユーザーID/パスワードを発行する２つのユーザー管理を使う必要がありました。そのため、要望を満たせる Cognito を使おうと思いました。

今回、Cognito User pool は2つ必要です。
![スクリーンショット 2024-12-26 19.30.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1005574/bafde958-67b4-e63d-f6ef-0e76f5271553.png)
1つは CloudWatch Dashbord が自動で生成される 「CloudWatchDashboardSharing」です。もう1つは 「CloudWatchDashboardSharing」 の Identity provider として利用する 「CloudWatchIdentityProvider」です。
いやいや、そもそも「CloudWatchDashboardSharing」でユーザー管理まですれば良いじゃないかと思われるかもしれません。私は初めそう思いました。しかし、CloudWatch ダッシュボード共有で SSO プロバイダーとして認識するのは「CloudWatchDashboardSharing」に登録した「Identity provider」のみであり、必ず「Identity provider」を追加しなければなりません。そのため、「Identity provider」として Cognito User pool をもう1つ作成しなければなりませんでした。
なお、Cognito User pool の Identity provider として Cognito を利用する方法は、こちらの記事を参考にさせていただきました。 

https://qiita.com/wanwan_fox/items/86a75ec004331ae82ee2

## やってみた
### Cognito User pool「CloudWatchIdentityProvider」を作成する
- マネジメントコンソールで Cognito の画面を開き、左のメニューから「User pools」を選択します。
![スクリーンショット 2024-12-26 19.42.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1005574/3d30ae0b-1989-75af-cc99-f99e7b1eb86d.png)

- 「User pools」の画面で「Create user pool」をクリックします。
![スクリーンショット 2024-12-26 19.44.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1005574/0d670d79-13dc-2e2c-6989-787aeb1e0c05.png)

- 「Set up your application」ページが開きます。
![スクリーンショット 2024-12-26 19.46.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1005574/750ce79d-c622-8c2a-97bb-4dd140118210.png)

- 「Application type」を「Traditional web application」、「Name your application」に「CloudWatchIdentityProvider」を入力します。
![スクリーンショット 2024-12-26 19.47.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1005574/f55832b3-1f2f-6894-888a-49fd08721e32.png)

- 「Options for sign-in identifiers」は「Email」を選択し、「Required attributes for sign-up」は「email」を選択します。
![スクリーンショット 2024-12-26 19.49.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1005574/61679823-97c5-ef37-ac1b-000b900eda5d.png)

- 「Add a return URL」は入力せずに、「Create」を選択します。
- 「Set up your application」は何もする必要はないため、下までスクロールして「Go to overview」をクリックします。
![スクリーンショット 2024-12-26 19.53.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1005574/bef73b51-493a-665d-e2e3-7f7e79afaddc.png)

- 「Overview: User pool - xxxx」ページが開きます。「User pool ID」は後で利用するため、コピーしておきます。また、分かりやすいように名前をつけておきます。「Rename」をクリックします。
![https___qiita-image-store.s3.ap-northeast-1.amazonaws.com_0_1005574_beb8cd0f-a65a-1a58-ee65-14c689a4d440のコピー.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1005574/f63c1973-113a-adf4-4287-0d0a460b2398.jpeg)

- 「User pool name」に「CloudWatchIdentityProvider」を入力し、「Save changes」を選択します。
![スクリーンショット 2024-12-26 19.58.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1005574/3ec259ae-49b5-0fd3-1d34-ee8f23215a8d.png)

- これで名前が変わりました。次に、App client を確認します。左メニューの「App clients」を選択します。
![スクリーンショット 2024-12-26 20.01.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1005574/4c6f9437-5a61-09ec-8112-146ff776ddf1.png)

- 「CloudWatchIdentityProvider」を選択します。
![スクリーンショット 2024-12-26 20.02.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1005574/eabec9cc-e9b9-1267-2900-27ce621ea647.png)


- 「Client ID」と「Client secret」を後で使うため、コピーします。
![スクリーンショット 2024-12-26 20.07.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1005574/4c31a5f7-fc59-eb1d-2951-f6411227a6a3.png)

次に、Cognito User pool「CloudWatchDashboardSharing」を作成します。ただし、再度「App client: CloudWatchIdentityProvider」ページに戻りますので後続は別のタブを開いて作業します。

### Cognito User pool「CloudWatchDashboardSharing」を作成する
「CloudWatchDashboardSharing」は CloudWatchダッシュボードから作成します。
- マネジメントコンソールで CloudWatch ダッシュボード を開き、「Actions > Share dashbord」 をクリックします。
![スクリーンショット 2024-12-25 12.53.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1005574/23c190dd-3733-50a9-4b6c-cb262fd81779.png)

- 「Go to CloudWatch setting」をクリックし、CloudWatch 設定の Dashboard sharing を開きます。
![スクリーンショット 2024-12-25 12.55.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1005574/1d4ee20c-8c8d-3231-fed5-03db2f4043d7.png)

- 「Available SSO providers」の選択肢がないことを確認し、「Manage SSO providers」をクリックして Amazon Cognito User pools を開きます。
![スクリーンショット 2024-12-25 12.57.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1005574/b2f01cc6-6455-80d8-f8b7-e5653c71d382.png)

- 「CloudWatchDashboardSharing」という User pools が追加されていますので、選択します。
![スクリーンショット 2024-12-25 12.59.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1005574/b5a5be72-1178-d528-d464-11a3da112dae.png)

- 左メニューの「Authentication > Social and custom providers」を選択します。
![スクリーンショット 2024-12-25 13.08.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1005574/01ef4ec1-842e-9d7f-a68d-b48232ac8261.png)

- 「Add Identity provider」を選択します。
![スクリーンショット 2024-12-25 13.11.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1005574/5b5e0820-8ea1-af44-7fae-b3c72b829b04.png)

- 「OpenID Connect (OIDC)」を選択します。
![スクリーンショット 2024-12-26 20.12.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1005574/f606200e-4888-442f-d59c-35ac57e154e5.png)
なお、[ドキュメント](https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/share-cloudwatch-dashboards-setup-SSO.html)には以下のような情報が書かれています。
![スクリーンショット 2024-12-26 20.15.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1005574/55247ba8-04ba-b8b0-1d28-d2e5ff622f49.png)
今回は SSOプロバイダーに Cognito を利用しているため問題なしと判断しました。もし、この方法を利用する場合はご注意ください。

- 「Provider name」に「CloudWatchIdentityProvider」を入力します。
![スクリーンショット 2024-12-26 20.17.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1005574/705b27e1-8c53-8b52-2aaa-41f45b7f44b5.png)

- 「Client ID」と「Client secret」に User pool 「CloudWatchIdentityProvider」の App client でコピーした「Client ID」と「Client secret」を入力します。
![スクリーンショット 2024-12-26 20.18.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1005574/b7f2640f-d8da-f0b3-cb8a-fa41028f9b97.png)

- 「Authorized scopes」に「openid email aws.cognito.signin.user.admin」を入力します。
![スクリーンショット 2024-12-26 20.20.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1005574/c8ebc5e8-42c7-9e70-5f20-5f1f31f41093.png)

- 「Issuer URL には 「https://cognito-idp.us-east-1.amazonaws.com/[UserPoolID]」 を入力します。[UserPoolID] は User pool 「CloudWatchIdentityProvider」の「User pool ID」です。
![スクリーンショット 2024-12-26 20.26.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1005574/3b26185a-3d3f-066e-bc2e-a1dada9cf8b3.png)

- 「Add identity provider」をクリックします。
![スクリーンショット 2024-12-26 20.28.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1005574/ad6e754b-365f-c04c-4bd1-881669f67505.png)

- 画面が一覧に戻り、追加した Identity provider がリストに表示されます。
![スクリーンショット 2024-12-26 20.30.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1005574/a6281112-1c91-1590-ee07-cb3ab76fb7d2.png)

次に、Cognito User pool「CloudWatchDashboardSharing」の「App client」を作成します。

### Cognito User pool「CloudWatchDashboardSharing」の「App client」を作成する
Cognito User pool「CloudWatchDashboardSharing」の「App client」は CloudWatch が自動で作成します。

- 先ほど開いていた「Dashboard sharing」を再度表示します。「Available SSO providers」に「CloudWatchIdentityProvider」が選択できるようになっているので選択します。「Save changes」を選択します。
![スクリーンショット 2024-12-26 20.36.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1005574/c5f5c9a9-0f9c-20fe-48ae-1868506d0525.png)

- 保存すると「SSO enabled」と表示が変わります。
![スクリーンショット 2024-12-26 20.38.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1005574/b60ef771-d2eb-f5b2-ee2a-1eebe4837928.png)

- 次に、 Cognito User pool の 「CloudWatchDashboardSharing」の画面を開き、「App clients」を選択します。すると、「CloudWatchDashboardSharingFederated」が追加されていることが確認できます。「CloudWatchDashboardSharingFederated」を選択します。
![スクリーンショット 2024-12-26 20.40.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1005574/cf081c0f-fef2-4dc7-84f5-0f309c688384.png)

- 「Login pages」タブを開き、「Edit」を選択します。
![スクリーンショット 2024-12-26 20.43.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1005574/61a84572-452b-f4d2-b27a-6e8d088aa92f.png)

- 「OpenID Connect scopes」で「Profile」を削除し、「Save changes」を選択します。
![スクリーンショット 2024-12-26 20.45.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1005574/89314854-2c70-7350-7eca-1b2f8201bbf6.png)

- 次に、「Domain」を選択します。「Domain」の url は後で使うためコピーします。
![スクリーンショット 2024-12-26 20.48.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1005574/25f43e2d-8c44-9765-93f6-d6af6afa443b.png)


### Cognito User pool 「CloudWatchIdentityProvider」の「App client」を更新する
- 次に、「CloudWatchIdentityProvider」の「App client」を設定します。先ほど残していた「CloudWatchIdentityProvider」の「App clients」タブを再度開きます。App client の「CloudWatchIdentityProvider」を選択します。
![スクリーンショット 2024-12-26 20.53.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1005574/091830ef-d473-7248-788f-020bc50fcec6.png)

- 「Login pages」タブを開き、「Edit」を選択します。
![スクリーンショット 2024-12-26 20.54.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1005574/42970311-ac92-c6d4-4312-6a9bde424328.png)

- 「Allowed callback URLs」に先ほどコピーした User pool「CloudWatchDashboardSharing」の「Domain」の url を利用し、末尾に「/oauth2/idpresponse」を追加します。
![スクリーンショット 2024-12-26 21.02.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1005574/fc444d4b-b20e-7b9b-8a5c-950c716a933d.png)

- 「OAuth 2.0 grant types」で「Implicit grant」を追加します。
![スクリーンショット 2024-12-26 20.59.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1005574/698cb451-54e7-c4b0-fa20-3edf450730b8.png)

- 「OpenID Connect scopes」で「Phone」を削除し、「aws.cognito.signin.user.admin」を追加します。
![スクリーンショット 2024-12-26 21.00.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1005574/3e92f47c-c574-9937-9f13-93cd0209777d.png)

- 「Save changes」を選択します。これで、「App client: CloudWatchIdentityProvider」の更新は完了です。
![スクリーンショット 2024-12-26 21.00.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1005574/b28d7a6f-cf21-668e-fb48-b90256e7c723.png)

### Cognito User pool 「CloudWatchIdentityProvider」にユーザーを追加する

- Cognito User pool 「CloudWatchIdentityProvider」の左のメニューから「Users」を選択します。「Create user」を選択します。
![スクリーンショット 2024-12-26 21.05.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1005574/1edd2977-191a-9497-f92e-51206703b22f.png)

- 任意の「Email address」と「Password」を入力し、「Create user」を選択します。
![スクリーンショット 2024-12-26 21.06.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1005574/63acb458-5b89-8840-e853-afc3ea05ff23.png)

これで設定は完了です。それでは動作を確認します。

### 動作を確認する
- マネジメントコンソールで CloudWatch ダッシュボードを表示します。「Actions > Share dashbord」を選択します。
![スクリーンショット 2024-12-26 21.10.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1005574/a3e96443-26c3-8091-fc2b-55bab676942d.png)

- 「Shareable link」をクリックし、新しいタブを開きます。
![スクリーンショット 2024-12-26 21.11.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1005574/ee3bc005-f224-4774-65ed-c6ec088e36f3.png)

- 「CloudWatchIdentityProvider」を選択します。
![スクリーンショット 2024-12-26 21.12.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1005574/1e7bb0d8-c5ab-28ef-d886-0370f919a749.png)

- 「Email address」を入力し、「Next」を選択します。![スクリーンショット 2024-12-26 21.13.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1005574/b74e4d06-a6ca-1ab9-61a2-5e702728e27b.png)

- 「Password」を入力し、「Continue」をクリックします。
![スクリーンショット 2024-12-26 21.14.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1005574/97d723a2-1c37-8bf3-efdd-581544ae0907.png)

- 「Change password」が表示される場合はパスワードを変更します。
![スクリーンショット 2024-12-26 21.15.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1005574/42b2dd53-7cc5-8970-1c84-fc6fd0698bd2.png)

- 問題なければ、CloudWatch ダッシュボードの画面が表示されます！！
![スクリーンショット 2024-12-26 21.16.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1005574/5daa10c5-080b-819d-6981-c2bb793b9984.png)

**これで、CloudWatch ダッシュボードを Cognito 認証を使って共有できました！！**


## 最後に
今回、CloudWatch ダッシュボードの共有に　Cognito User Pool のみを利用して行なってみました。
通常は SAML に対応したIdP プロバイダーを使うところCognito のみで完結させることで、AWSに閉じた世界でかつ、AWSアカウントにアクセス権を付与せずに共有できました。
同じようなことをやろうと思った方の助けになればと思います。


## あとがき
実際にやってみると色々エラーになり躓きましたので、それについても書いておきます。

#### 「"Client is not enabled for OAuth2.0 flows"」エラーが発生した。
「App clients」の「Allowed callback URLs」「大文字」を使っていたのが問題でした。「Branding > Domain」をみるとわかる通り、全て小文字である必要があります。


#### 「CloudWatchDashboardSharing」に 「App client」を追加が別のURLにリダイレクトされた
 「Dashboard sharing」でSSO Providers を選択すると、 App Clinet に「CloudWatchDashboardSharingFederated」が自動で追加され、これが使われていました。

#### Cognito のログイン画面で「Create an account」を非表示にする
上記で作成した User pool 「CloudWatchIdentityProvider」はセルフサインアップを許可されています。そのため、誰でもユーザーを作れる状態です。そのため、セルフサインアップを禁止する必要があります。
- マネジメントコンソールで Cognito  > User pools を開きます。「CloudWatchIdentityProvider」を選択します。
![スクリーンショット 2024-12-27 10.29.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1005574/d0fd8f15-6102-b76e-45c5-336c4d2d55b9.png)

- 左のメニューの「Sign-up」を選択します。
![スクリーンショット 2024-12-27 10.32.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1005574/bac6b3e1-028c-20ba-e823-37cf6eeb8cbd.png)

- 下にスクロールし、「Self-service sign-up」の「Edit」を選択します。
![スクリーンショット 2024-12-27 10.34.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1005574/de006bdd-5b4c-ff97-c12a-515e8adc7ce8.png)

- 「Enable self-registration」のチェックを外し、「Save changes」を選択します。!
![スクリーンショット 2024-12-27 10.36.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1005574/fdf3382f-c918-f71b-899f-eac6324ab9ed.png)

- 「Sign in」ページを開くと「Create an account」が消えていることが確認できます。
![スクリーンショット 2024-12-27 10.37.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1005574/07ae36dc-7481-e7bf-94a6-df12b84c498d.png)