はじめに
少し前のアップデートになりますが、Amazon Redshiftにおいて、データベースのモニタリング機能が強化され、拡張クエリモニタリングが可能となりました(1)。
このアップデート記事内で、クエリ全体を分析するためにはSYS:MONITORロールを割り当てることが必要とありましたが、データベース内部のSYS:MONITORロールを、AWS マネジメントコンソール側にどう関連づけるのかイメージできましたか...?
実は私の場合、AWSの公式ドキュメント等も読んでもいまいちピンと来ませんでした。
そこで、実際にどう割り当てるのか?をやってみましたので、その内容を共有したいと思い、記事に起こしてみました。
また、SYS:MONITORロールを割り当てることでRedshift内全体のクエリの分析をすることもできるようになるため、パフォーマンス改善やシステム障害時の調査等をする際には一読しておくことをおすすめします。
拡張クエリモニタリングって何でしたっけ?
拡張クエリモニタリングは、データウェアハウス内のクエリのパフォーマンスをAWS コンソールから分析するために設計された新しい機能であり、クエリ実行の詳細な統計データを収集します。
Amazon Redshift のプロビジョン済みのクラスターまたはサーバーレスワークグループのパフォーマンスとこれらに対して実行されるクエリを分析するための AWS Management Console 機能である
(公式ドキュメントより抜粋)

なぜSYS:MONITOR ロール?
拡張クエリモニタリングは、AWS マネジメントコンソールからいつでもクエリ分析をできますが、デフォルトでは自身のクエリしか表示できません。何も設定していなければ、下の画像のように、自身のクエリしか見えないということです。 SYS:MONITORロールは、その他のユーザのすべてのクエリを表示するために必要なロールとなります。
デフォルトでは、自分のクエリのみを表示できます。他のユーザーが所有するクエリを表示するには、自分のアカウントに SYS:MONITOR ロールを付与してください。

SYS:MONITOR ロールを使ってみた
SYS:MONITORロールを割り当てるには、大まかに以下の流れとなります。
なお、本筋から外れますので、Redshiftのクラスターは既に作成されている前提とします。
- データベースに、管理者ユーザで接続する
- MONITORロールを作成し、MONITORロールにSYS:MONITORロールを割り当てる
- AWS マネジメントコンソールにて、任意のユーザまたはロールにRedshiftDbRolesタグを設定する
- クエリとデータベースモニタリングを見てみる
1. データベースに、管理者ユーザで接続する
デフォルトのデータベース(dev)に、管理者ユーザで接続します。
管理者ユーザ名やパスワードは、プロパティタブに表示されています。

- データベースの接続には、クエリエディタv2を使用すれば、AWS マネジメントコンソールで作業が完結します。

クエリエディタv2
2. MONITORロールを作成し、MONITORロールにSYS:MONITORロールを割り当てる
設定前の状態で、select * from SVV_ROLE_GRANTS;を実行すると、まだMONITORロールが作成されていないことが分かります。

以下のクエリを実行し、 MONITORロールの作成とSYS:MONITORロールの割り当てを行います。
create role monitor; grant role sys:monitor to role monitor;
再度、select * from SVV_ROLE_GRANTS;を実行すると、MONITORロールが作成されています。

3. AWS マネジメントコンソールにて、任意のユーザまたはロールにRedshiftDbRolesタグを設定する
IAMの操作画面に移り、任意のユーザまたはロールに、以下のようにタグを設定します。
タグ名:RedshiftDbRoles タグ値:monitor

4. クエリとデータベースモニタリングを見てみる
クエリとデータベースモニタリングにて、再度データベースへ接続します。
接続時の認証は、「Temporary credentials using IAM Identity」を選択すれば、IAMの認証情報で接続できます。
- 注意:RedshiftDbRolesのタグが付与されたIAMユーザまたはロールに切り替えたうえで接続します
接続後、無事に設定されていれば、USERSのタブに自分以外のユーザのクエリも表示されているはずです。

別のUSERのクエリの数字をクリックすると、そのユーザのみのクエリのヒストリーの画面にも遷移できます。

まとめ
IAMロールにタグを割り当てておけば、クエリを分析するメンバーが入れ替わっても運用負荷は小さく、全体の運用効率が向上するのではないかなと感じました。
予めSYS:MONITORロールをIAMユーザやロールに関連付けておけば、クエリの分析をする際に担当者が権限など意識せずで拡張クエリモニタリングを使用できるようになるので、ぜひ皆さんも設定してみてください。
おまけ
RedshiftDbRolesのタグを、どのIAMロールに付与したか確認したい場合は、AWS CloudShellで以下のコマンドを実行することで、付与したロールの一覧を確認できます。 この方法以外では、AWS Resource Explorerでリソースを検索するのがシンプルですが、執筆時点ではIAMユーザ・ロールのタグ情報は拾えないので、今後のアップデートに期待です...
aws iam list-roles --query 'Roles[].RoleName' --output text | while IFS= read -r -d $'\t' role; do
aws iam list-role-tags --role-name $role --query 'Tags[?Key==`RedshiftDbRoles` && Value==`monitor`]'|grep RedshiftDbRoles > tempfile && if wc -m tempfile > 0;then
echo $role
fi
done