1
1

QuickSightでIAMロールを使ってRedshiftにクエリを実行する

Posted at

はじめに

QuickSightでRedshiftに接続する方法は、以下のようにデータソースにDBユーザーとパスワードを指定する方法があります。

image.png

しかし、2023年10月にIAMロールを使ってRedshiftへの接続が出来るようになりました!

この機能を用いると、IAMロールの認証情報を使ってDBユーザーにアクセスするため、DBユーザーのパスワードを入力する必要がありません。
つまり、利用者はパスワードを覚える必要がなく、管理者はパスワード流失セキュリティインシデントの懸念が減ります。

image.png

今回は、この接続方法を試してみます。

前提条件

  • RedshiftのRA3クラスターをバージニア北部リージョン(us-east-1)に作成済み
    • パブリックアクセスを有効にしています
  • QuickSightを同じくバージニア北部リージョン(us-east-1)に作成済み

2024年2月9日時点では、RedshiftとQuickSightが同じアカウントに存在する必要があります。試してみましたが、確かに同じアカウントでないとエラーとなりました。

やってみる

以下のドキュメントを見ながらやっていきます。

IAMロールを作成する

TestRedshiftRoleForQuickSightという名前のIAMロールを作成します。
ドキュメントではCLIで作成していますが、私はGUIで作成しました。

image.png

IAMポリシーを作成する

RedshiftGetClusterCredentialsPolicy1という名前のIAMポリシーを作成します。
ポリシーの内容は以下です。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "RedshiftGetClusterCredentialsPolicy",
            "Effect": "Allow",
            "Action": [
                "redshift:GetClusterCredentials"
            ],
            "Resource": [
                "*"
            ]
        }
    ]
}

こちらも、ドキュメントではCLIで作成していますが、私はGUIで作成しました。

image.png

redshift:GetClusterCredentials は、指定のRedshiftのDBユーザーの認証情報を取得するアクションです。現在はResource句が*となっていますが、ここでDBユーザーを指定することで特定のDBユーザーのみアクセスさせることが可能です。このAWSドキュメントが参考になります。

ロールにポリシーをアタッチする

先ほど作成したIAMロールTestRedshiftRoleForQuickSightに、2つのIAMポリシーをアタッチします。
1つは先ほど作成したIAMポリシーRedshiftGetClusterCredentialsPolicy1、もう1つはQuickSightが自動生成するAWSQuickSightRedshiftPolicyです。

image.png

ちなみに、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という名前で作成します。
値はそれぞれご自身の環境に併せて変更してください。

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でアップロードします。

image.png

その後、以下のコマンドを実行します。

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側のセキュリティグループを設定する必要があります。

image.png

image.png

Redshiftのセキュリティグループを作成して付与する

バージニア北部のQucikSightのIPアドレスからの通信を、セキュリティグループで許可してあげる必要があります。
以下のサイトから確認すると、バージニア北部リージョン(us-east-1)のデータソース接続のIPアドレス範囲は52.23.63.224/27とのことでした。

Redshiftのコンソールから、接続先のクラスターの詳細を開き、「プロパティタブ」をクリックします。
その中の「ネットワークとセキュリティの設定」に、「VPC セキュリティグループ」があるのでそこをクリックすると付与されているセキュリティグループの設定画面に飛べます。
そこで、以下のように先ほど調べたIPアドレスからの接続を許可しましょう。

image.png

QuickSightから接続確認

QuickSightの画面に戻り、データセットを作成してみます。
データソースを選択して「データセットを作成」を押すと、以下のようにスキーマとテーブルを選択します。

image.png

選択してデータセットを作成し、データのプレビューを見てみます。
以下のように、データが参照できました。

image.png

注意事項

  • QuickSightとRedshiftのリージョンが異なる環境で実施すると、エラーでうまく接続できませんでした。
  • 以下のドキュメントを参考にすると、Cloud Shellにアップロードするjsonの中のRedshiftParameters句の中は、"Host"と"Port"が記載されていれば"ClusterId"は省略可能なはずです。ただ、省略するとエラーで接続できませんでした。

おわりに

リージョンの指定を誤って何回かエラーとなりましたが、無事にロールでRedshiftに接続できました。Redshiftと色々なサービスを接続して使うことは多いと思いますが、それぞれ全てロールで接続が統一できると楽になりそうです。ただし、現在はクロスアカウントで使えないようなので、是非使えるようになってほしいですね。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1