はじめに
QuickSightでRedshiftに接続する方法は、以下のようにデータソースにDBユーザーとパスワードを指定する方法があります。
しかし、2023年10月にIAMロールを使ってRedshiftへの接続が出来るようになりました!
この機能を用いると、IAMロールの認証情報を使ってDBユーザーにアクセスするため、DBユーザーのパスワードを入力する必要がありません。
つまり、利用者はパスワードを覚える必要がなく、管理者はパスワード流失セキュリティインシデントの懸念が減ります。
今回は、この接続方法を試してみます。
前提条件
- RedshiftのRA3クラスターをバージニア北部リージョン(us-east-1)に作成済み
- パブリックアクセスを有効にしています
- QuickSightを同じくバージニア北部リージョン(us-east-1)に作成済み
2024年2月9日時点では、RedshiftとQuickSightが同じアカウントに存在する必要があります。試してみましたが、確かに同じアカウントでないとエラーとなりました。
やってみる
以下のドキュメントを見ながらやっていきます。
IAMロールを作成する
TestRedshiftRoleForQuickSight
という名前のIAMロールを作成します。
ドキュメントではCLIで作成していますが、私はGUIで作成しました。
IAMポリシーを作成する
RedshiftGetClusterCredentialsPolicy1
という名前のIAMポリシーを作成します。
ポリシーの内容は以下です。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "RedshiftGetClusterCredentialsPolicy",
"Effect": "Allow",
"Action": [
"redshift:GetClusterCredentials"
],
"Resource": [
"*"
]
}
]
}
こちらも、ドキュメントではCLIで作成していますが、私はGUIで作成しました。
redshift:GetClusterCredentials
は、指定のRedshiftのDBユーザーの認証情報を取得するアクションです。現在はResource句が*
となっていますが、ここでDBユーザーを指定することで特定のDBユーザーのみアクセスさせることが可能です。このAWSドキュメントが参考になります。
ロールにポリシーをアタッチする
先ほど作成したIAMロールTestRedshiftRoleForQuickSight
に、2つのIAMポリシーをアタッチします。
1つは先ほど作成したIAMポリシーRedshiftGetClusterCredentialsPolicy1
、もう1つはQuickSightが自動生成するAWSQuickSightRedshiftPolicy
です。
ちなみに、QuickSightが自動生成するAWSQuickSightRedshiftPolicy
は以下のような内容になっています。
QuickSightはRedshiftの接続情報としてcluster-nameのみ(cluster-idとAWSリージョンなし)を指定できますが、この時redshift:DescribeClusters
を呼び出してcluster-nameから必要な情報(cluster-idとAWSリージョン)を取得しています。それができるように、ここでredshift:Describe*
を許可しているものと思われます。
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"redshift:Describe*"
],
"Effect": "Allow",
"Resource": "*"
}
]
}
参考:
データソースを作成する
こちらでようやくQuickSightのデータソースを作成します。
ここで注意ですが、IAMロールを利用したデータソースについては、2024年2月9日現在ではCLIでしか作成できません。そのため、Cloud Shellを利用して実行していきます。
まずは、ローカルで以下のjsonをredshift-data-source-iam.json
という名前で作成します。
値はそれぞれご自身の環境に併せて変更してください。
{
"AwsAccountId": "123456789012",
"DataSourceId": "test-redshift-iam-role",
"Name": "test-redshift-iam-role",
"Type": "REDSHIFT",
"DataSourceParameters": {
"RedshiftParameters": {
"Database": "db_name",
"Host": "cluster-name.jhageijtksjd.us-east-1.redshift.amazonaws.com",
"Port": 5439,
"ClusterId": "cluster-name",
"IAMParameters": {
"RoleArn": "arn:aws:iam::123456789012:role/TestRedshiftRoleForQuickSight",
"DatabaseUser": "db_user"
}
}
},
"Permissions": [
{
"Principal": "arn:aws:quicksight:us-east-1:123456789012:user/default/qs_user",
"Actions": [
"quicksight:DescribeDataSource",
"quicksight:DescribeDataSourcePermissions",
"quicksight:PassDataSource",
"quicksight:UpdateDataSource",
"quicksight:DeleteDataSource",
"quicksight:UpdateDataSourcePermissions"
]
}
]
}
次に、作成したredshift-data-source-iam.json
をCloud Shellでアップロードします。
その後、以下のコマンドを実行します。
aws quicksight create-data-source \
--region us-east-1 \
--endpoint https://quicksight.us-east-1.amazonaws.com/ \
--cli-input-json file://redshift-data-source-iam.json
成功すると、以下のようにStatus 202
が返ってくるはずです。
{
"Status": 202,
"Arn": "arn:aws:quicksight:us-east-1:123456789012:datasource/test-redshift-iam-role",
"DataSourceId": "test-redshift-iam-role",
"CreationStatus": "CREATION_IN_PROGRESS",
"RequestId": "e7d1edba-5155-4bc0-a050-a2e71f1f9ffc"
}
QuickSightの画面を見てみると、データソースがちゃんとできていますね。ただし、このままの状態だと接続できません。Redshift側のセキュリティグループを設定する必要があります。
Redshiftのセキュリティグループを作成して付与する
バージニア北部のQucikSightのIPアドレスからの通信を、セキュリティグループで許可してあげる必要があります。
以下のサイトから確認すると、バージニア北部リージョン(us-east-1)のデータソース接続のIPアドレス範囲は52.23.63.224/27
とのことでした。
Redshiftのコンソールから、接続先のクラスターの詳細を開き、「プロパティタブ」をクリックします。
その中の「ネットワークとセキュリティの設定」に、「VPC セキュリティグループ」があるのでそこをクリックすると付与されているセキュリティグループの設定画面に飛べます。
そこで、以下のように先ほど調べたIPアドレスからの接続を許可しましょう。
QuickSightから接続確認
QuickSightの画面に戻り、データセットを作成してみます。
データソースを選択して「データセットを作成」を押すと、以下のようにスキーマとテーブルを選択します。
選択してデータセットを作成し、データのプレビューを見てみます。
以下のように、データが参照できました。
注意事項
- QuickSightとRedshiftのリージョンが異なる環境で実施すると、エラーでうまく接続できませんでした。
- 以下のドキュメントを参考にすると、Cloud Shellにアップロードするjsonの中のRedshiftParameters句の中は、"Host"と"Port"が記載されていれば"ClusterId"は省略可能なはずです。ただ、省略するとエラーで接続できませんでした。
おわりに
リージョンの指定を誤って何回かエラーとなりましたが、無事にロールでRedshiftに接続できました。Redshiftと色々なサービスを接続して使うことは多いと思いますが、それぞれ全てロールで接続が統一できると楽になりそうです。ただし、現在はクロスアカウントで使えないようなので、是非使えるようになってほしいですね。