Amazon Redshift Data API へのアクセスの認可 - Amazon Redshift

Amazon Redshift Data API へのアクセスの認可

ユーザーは Data API へのアクセスが許可されている必要があります。事前定義済みの AWS Identity and Access Management (IAM) ポリシーである管理ポリシーをユーザーに追加して、ユーザーに Data API へのアクセスを許可できます。ベストプラクティスとして、アクセス許可ポリシーを IAM ロールにアタッチし、それを必要に応じてユーザーやグループに割り当てることをお勧めします。詳細については、「Amazon Redshift での Identity and Access Management」を参照してください。マネージドポリシーによって許可および拒否されるアクセス許可を確認するには、IAM コンソール (https://console.aws.amazon.com/iam/) 参照してください。

Amazon Redshift は、AmazonRedshiftDataFullAccessマネージドポリシーを提供します。このポリシーは、Amazon Redshift Data API オペレーションへのフルアクセスを提供します。このポリシーでは、Amazon Redshift クラスターまたは Redshift Serverless ワークグループの認証とアクセスに必要な特定の Amazon Redshift、AWS Secrets Manager、IAM API オペレーションへのスコープ付きアクセスも許可されます。

特定のリソースへのアクセスを許可する独自の IAM ポリシーを作成することもできます。ポリシーを作成するには、AmazonRedshiftDataFullAccessポリシーを開始テンプレートとして使用します。作成したポリシーは、Data API にアクセスする必要がある各ユーザーに追加します。

ユーザーに関連付けられた IAM ポリシーの以下の要件を考慮してください。

  • AWS Secrets Manager を使用して認証する場合、ポリシーでは secretsmanager:GetSecretValue アクションの使用が許可され、キー RedshiftDataFullAccess でタグ付けされたシークレットを取得できることを確認します。

  • 一時的な認証情報を使用してクラスターに対して認証する場合、ポリシーでは、クラスター内の任意のデータベースのデータベースユーザー名 redshift_data_api_user に対する redshift:GetClusterCredentials アクションの使用が許可されることを確認します。このユーザー名は、データベースにすでに作成されている必要があります。

  • 一時的な認証情報を使用してサーバーレスワークグループへの認証を行う場合は、ポリシーで redshift-serverless:GetCredentials キーでタグ付けされたワークグループを取得するための RedshiftDataFullAccess アクションの使用が許可されていることを確認します。データベースユーザーが、ソース AWS Identity and Access Management (IAM) ID に対して 1:1 にマップされています。例えば、ユーザー sample_user はデータベースユーザー IAM:sample_user にマップされ、IAM ロール sample_role は IAMR:sample_role にマップされます。IAM ID の詳細については、「IAM ユーザーガイド」の「IAM ID (ユーザー、ユーザーグループ、ロール)」を参照してください。

別のアカウントが所有するクラスターでクエリを実行するには、呼び出すアカウントで Data API がロールを引き受けることができる IAM ロールを所有アカウントより提供してもらう必要があります。例えば、アカウント A がアクセスする必要のあるクラスターを、アカウント B が所有しているとします。アカウント B は、AWS管理ポリシー AmazonRedshiftDataFullAccess をアカウント B の IAM ロールにアタッチできます。次に、アカウント B は、次のような信頼ポリシーを使用してアカウント A を信頼します:

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": [ "arn:aws:iam::accountID-of-account-A:role/someRoleA" ] }, "Action": "sts:AssumeRole" } ] }

最後に、アカウント A の IAM ロールでアカウント B の IAM ロールを引き受けることができなければなりません。

{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": "sts:AssumeRole", "Resource": "arn:aws:iam::accountID-of-account-B:role/someRoleB" } }

次のリンクから、IAM ユーザーガイドで AWS Identity and Access Management についての詳細情報をご覧いただけます。

AWS Secrets Manager へのデータベース認証情報の保存

Data API を呼び出すと、AWS Secrets Manager のシークレットを使用してクラスターまたはサーバーレスワークグループの認証情報を渡すことができます。この方法で認証情報を渡すには、シークレットの名前またはシークレットの Amazon リソースネーム (ARN) を指定します。

Secrets Manager で認証情報を保存するには、SecretManagerReadWriteマネージドポリシー権限が必要です。最小のアクセス許可についての詳細は、AWS Secrets Managerユーザーガイドの「Creating and Managing Secrets with AWS Secrets Manager」を参照してください。

Amazon Redshift クラスターのシークレットに認証情報を保存するには
  1. AWS Secrets Manager コンソールを使用して、クラスターの認証情報が含まれるシークレットを作成します。

    • [Store a new secret (新しいシークレットを保存する)] を選択する場合は、[Credentials for Redshift cluster (Redshift クラスターの認証情報)]を選択します。

    • [User name] (ユーザー名) (データベースユーザー)、[Password] (パスワード)、および [DB cluster] (DB クラスター) (クラスター識別子) の値をシークレットに保存します。

    • キー RedshiftDataFullAccess でシークレットにタグを付けます。AWS 管理ポリシー AmazonRedshiftDataFullAccess は、キー RedshiftDataFullAccess でタグ付けされたシークレットに対してのみアクション secretsmanager:GetSecretValue を許可します。

    手順については、AWS Secrets Managerユーザーガイド の「Creating a Basic Secret」を参照してください。

  2. AWS Secrets Manager コンソールを使用して、作成したシークレットの詳細を表示するか、aws secretsmanager describe-secretの AWS CLI コマンドを実行します。

    シークレットの名前と ARN を書き留めます。これらは、Data API への呼び出しで使用できます。

サーバーレスワークグループのシークレットに認証情報を保存するには
  1. サーバーレスワークグループの認証情報を含むシークレットを保存するには、AWS Secrets Manager AWS CLI コマンドを使用します。

    • ファイルにシークレットを作成します。例: mycreds.json という名前の JSON ファイル。ファイルで [ユーザー名] (データベースユーザー) と [パスワード] の値を指定します。

      { "username": "myusername", "password": "mypassword" }
    • 値をシークレットに保存し、シークレットに RedshiftDataFullAccess キーでタグを付けます。

      aws secretsmanager create-secret --name MyRedshiftSecret --tags Key="RedshiftDataFullAccess",Value="serverless" --secret-string file://mycreds.json

      出力は以下のようになります。

      { "ARN": "arn:aws:secretsmanager:region:accountId:secret:MyRedshiftSecret-mvLHxf", "Name": "MyRedshiftSecret", "VersionId": "a1603925-e8ea-4739-9ae9-e509eEXAMPLE" }

    詳細については、AWS Secrets Manager ユーザーガイドの「AWS CLI を使用したベーシックシークレットの作成」を参照してください。

  2. AWS Secrets Manager コンソールを使用して、作成したシークレットの詳細を表示するか、aws secretsmanager describe-secretの AWS CLI コマンドを実行します。

    シークレットの名前と ARN を書き留めます。これらは、Data API への呼び出しで使用できます。

Data API に Amazon VPC エンドポイント (AWS PrivateLink) を作成する

Amazon Virtual Private Cloud (Amazon VPC) を使用すると、Amazon Redshift クラスターやアプリケーションなどの AWS リソースを仮想プライベートクラウド (VPC) 内に起動できます。AWS PrivateLink は、仮想プライベートクラウド (VPC) と AWS サービス間のプライベートな接続を Amazon ネットワーク上で安全に提供します。AWS PrivateLink を使用すると、VPC エンドポイントを作成できます。これにより、Amazon VPC に基づいて、異なるアカウントや VPC のサービスに接続できます。AWS PrivateLink の詳細については、Amazon Virtual Private Cloud ユーザーガイドの「VPC エンドポイントサービス (AWS PrivateLink)」を参照してください。

Amazon VPC エンドポイントを使用して Data API を呼び出すことができます。Amazon VPC エンドポイントを使用することで、パブリック IP アドレスなしで Amazon VPC 内のアプリケーションと AWS ネットワーク内の Data API 間のトラフィックを維持できます。Amazon VPC エンドポイントは、公共のインターネット接続の制限に関連するコンプライアンスおよび規制要件を満たすのに役立ちます。例えば、Amazon VPC エンドポイントを使用する場合、Amazon EC2 インスタンスで実行されているアプリケーションと、それらを含む VPC 内の Data API 間のトラフィックを維持できます。

Amazon VPC エンドポイントを作成したら、アプリケーションでコードや設定を変更せずに、エンドポイントの使用をスタートできます。

Data API に Amazon VPC エンドポイントを作成するには
  1. AWS Management Console にサインインして、Amazon VPC コンソール (https://console.aws.amazon.com/vpc/) を開きます。

  2. [ エンドポイント] を選択し、[エンドポイントの作成] を選択します。

  3. [エンドポイントの作成] ページの [サービスカテゴリ] で [AWS サービス] を選択します。を使用する場合[サービス名] で、[redshift Data(com.amazonaws.region.redshift-data)]。

  4. [VPC] の場合は、VPC を選択してエンドポイントを作成します。

    Data API コールを行うアプリケーションを含む VPC を選択します。

  5. [サブネット] で、アプリケーションを実行している AWS のサービスによって使用される各アベイラビリティーゾーン (AZ) のサブネットを選択します。

    Amazon VPC エンドポイントを作成するには、エンドポイントにアクセスできるプライベート IP アドレスの範囲を指定します。これを行うには、各アベイラビリティーゾーンのサブネットを選択します。これにより、VPC エンドポイントは各アベイラビリティーゾーンに固有のプライベート IP アドレス範囲に制限され、各アベイラビリティーゾーンに Amazon VPC エンドポイントが作成されます。

  6. [DNS 名を有効にする] で、[このエンドポイントで有効にする] を選択します。

    プライベート DNS は、スタンダードの Data API DNS ホスト名 (https://redshift-data.region.amazonaws.com) を、Amazon VPC エンドポイントに固有の DNS ホスト名に関連付けられたプライベート IP アドレスに解決します。その結果、Data API エンドポイント URL を更新するためのコードや設定を変更せずに、AWS CLIまたは AWS SDK を使用して Data API VPC エンドポイントにアクセスできます。

  7. セキュリティグループで、Amazon VPC エンドポイントに関連付けるセキュリティグループを選択します。

    アプリケーションを実行している AWS のサービスへのアクセスを許可するセキュリティグループを選択します。例えば、Amazon EC2 インスタンスでアプリケーションを実行している場合は、Amazon EC2 インスタンスへのアクセスを許可するセキュリティグループを選択します。セキュリティグループを使用すると、VPC 内のリソースから Amazon VPC エンドポイントへのトラフィックを制御できます。

  8. [Create endpoint (エンドポイントの作成)] を選択します。

エンドポイントを作成したら、AWS Management Consoleでリンクを選択して、エンドポイントの詳細を表示します。

エンドポイントの [Details (詳細)] タブには、Amazon VPC エンドポイントの作成中に生成された DNS ホスト名が表示されます。

スタンダードエンドポイント (redshift-data.region.amazonaws.com) または VPC 固有のエンドポイントの 1 つを使用して、Amazon VPC 内の Data API を呼び出すことができます。スタンダード Data API エンドポイントは、自動的に Amazon VPC エンドポイントにルーティングします。このルーティングは、Amazon VPC エンドポイントの作成時にプライベート DNS ホスト名が有効になったために発生します。

Data API コールで Amazon VPC エンドポイントを使用すると、アプリケーションと Data API 間のすべてのトラフィックは、それらを含む Amazon VPC に残ります。Amazon VPC エンドポイントは、任意のタイプの Data API コールに使用できます。Data API を呼び出す方法については、「Amazon Redshift Data API を呼び出す際の考慮事項」を参照してください。

クラスターへの接続時にデータベースグループに参加する

データベースグループは、データベースユーザーのコレクションです。データベース権限はグループに付与できます。管理者は、SQL を Data API で実行するときに、これらのデータベースグループを考慮に入れて IAM ロールを設定できます。データベースグループの詳細については、「Amazon Redshift データベース開発者ガイド」の「グループ」を参照してください。

Data API がクラスターに接続したときに、呼び出しで指定したデータベースユーザーがデータベースグループに参加するように、Data API 呼び出し元の IAM ロールを設定できます。この機能は、プロビジョニングされたクラスターに接続する場合にのみサポートされます。Redshift Serverless ワークグループに接続する場合はサポートされません。Data API の呼び出し元の IAM ロールでは、redshift:JoinGroup アクションも許可する必要があります。

これを設定するには、IAM ロールにタグを追加します。呼び出し元の IAM ロールの管理者は、キー RedshiftDbGroups およびデータベースグループのリストのキー値を使用してタグを追加します。値は、コロン (:) で区切られたデータベースグループの名前のリストで、全長は最大 256 文字です。データベースグループは、接続されたデータベースで事前に定義しておく必要があります。指定したグループがデータベースに見つからない場合、そのグループは無視されます。例えば、データベースグループ accounting および retail の場合、キー値は accounting:retail です。タグのキーおよび値のペア {"Key":"RedshiftDbGroups","Value":"accounting:retail"} は、Data API への呼び出しで、どのデータベースグループが指定のデータベースユーザーに関連付けられているかを Data API で判断するために使用します。

データベースグループをタグとして IAM ロールに追加するには
  1. AWS Management Console にサインインして、IAM コンソール (https://console.aws.amazon.com/iam/) を開きます。

  2. コンソールのナビゲーションペインで、ロール を選択し、編集するロールの名前を選択します。

  3. [タグ] タブ、[タグを管理] の順に選択します。

  4. [タグを追加] を選択し、キー RedshiftDbGroups と値 (database-groups-colon-separated のリスト) を追加します。

  5. [Save changes] (変更の保存) をクリックします。

    これで、この IAM ロールがアタッチされた IAM プリンシパルから Data API を呼び出すと、指定したデータベースユーザーが IAM ロールに指定されたデータベースグループに参加します。

IAM ロールや IAM ユーザーなど、プリンシパルにタグをアタッチする方法については、「IAM ユーザーガイド」の「IAM リソースのタグ付け」を参照してください。