クロスアカウントフェデレーテッドクエリを有効にする - Amazon Athena

クロスアカウントフェデレーテッドクエリを有効にする

フェデレーションクエリを使用すると、AWS Lambda にデプロイされたデータソースコネクタを使用して Amazon S3 以外のデータソースをクエリできます。クロスアカウントのフェデレーションクエリ機能を使用すると、Lambda 関数とクエリ対象のデータソースを異なるアカウントに配置できます。

注記

この方法は、フェデレーティッドデータソースを AWS Glue Data Catalog に登録していない場合にのみ使用します。データソースを AWS Glue Data Catalog に登録している場合は、AWS Glue Data Catalog クロスアカウント機能とアクセス許可モデルを使用します。詳細については、「AWS Glue ユーザーガイド」の「クロスアカウントアクセス許可の付与」を参照してください。

データ管理者は、データコネクタをデータアナリストのアカウントと共有することでクロスアカウントの串刺検索を有効化できます。また、データアナリストは、データ管理者から共有された Lambda ARN を使用してアカウントに追加することでクロスアカウントの串刺検索を有効化できます。元のアカウントのコネクタの設定を変更すると、更新された設定は自動的に他のユーザーのアカウントのコネクタの共有インスタンスに適用されます。

考慮事項と制限事項

  • クロスアカウントのフェデレーションクエリ機能は、Lambda ベースのデータソースを使用する Hive 以外のメタストアデータのコネクタで使用できます。

  • AWS Glue Data Catalog データソース型では、この機能は使用できません。AWS Glue Data Catalog へのクロスアカウントアクセスの詳細については、「AWS Glue データカタログへのクロスアカウントアクセスを構成する」を参照してください。

  • コネクタの Lambda 関数からの応答が Lambda 応答サイズの制限である 6 MB を超えると、Athena は自動的に応答を暗号化してバッチ処理し、設定した Amazon S3 バケットに流出します。Athena が流出したデータを読み取るには、Athena クエリを実行するエンティティが流出場所にアクセスできる必要があります。クエリが完了するとデータが不要になるため、流出場所からオブジェクトを削除するように Amazon S3 ライフサイクルポリシーを設定することをお勧めします。

  • AWS リージョン をまたいだフェデレーションクエリの使用はサポートされていません。

必要なアクセス許可

必要なアクセス許可を設定するには、アカウント A とアカウント B の両方でアクションを実行する必要があります。

アカウント A のアクション

データ管理者のアカウント A がデータアナリストのアカウント B と Lambda 関数を共有するには、アカウント B に Lambda の呼び出し関数と流出バケットのアクセスが必要です。したがって、アカウント A では、Lambda 関数へのリソースベースのポリシーと Amazon S3 内の流出バケットへのプリンシパルアクセスを追加する必要があります。

  1. 次のポリシーは、アカウント A の Lambda 関数で Lambda の呼び出し関数のアクセス許可をアカウント B に付与します。

    { "Version": "2012-10-17", "Statement": [ { "Sid": "CrossAccountInvocationStatement", "Effect": "Allow", "Principal": { "AWS": ["arn:aws:iam::account-B-id:user/username"] }, "Action": "lambda:InvokeFunction", "Resource": "arn:aws:lambda:aws-region:account-A-id:function:lambda-function-name" } ] }
  2. 次のポリシーは、アカウント B のプリンシパルに流出バケットへのアクセスを許可します。

    { "Version": "2008-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": ["arn:aws:iam::account-B-id:user/username"] }, "Action": [ "s3:GetObject", "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::spill-bucket", "arn:aws:s3:::spill-bucket/*" ] } ] }
  3. Lambda 関数がフェデレーション SDK によって提供されるデフォルトの暗号化ではなく、AWS KMS キーを使用して流出バケットを暗号化している場合、次の例のようにアカウント A の AWS KMS キーポリシーで、アカウント B のユーザーにアクセス権を付与する必要があります。

    { "Sid": "Allow use of the key", "Effect": "Allow", "Principal": { "AWS": ["arn:aws:iam::account-B-id:user/username"] }, "Action": [ "kms:Decrypt" ], "Resource": "*" // Resource policy that gets placed on the KMS key. }

アカウント B のアクション

アカウント A のコネクタをアカウント B と共有するには、AWS Security Token Service の AssumeRole API アクションを呼び出すことでアカウント A が引き受ける AthenaCrossAccountCreate-account-A-id というロールをアカウント B で作成する必要があります。

  1. IAM コンソールまたは AWS CLI を使用して、カスタム信頼ポリシーロールとして AthenaCrossAccountCreate-account-A-id ロールを作成します。カスタムの信頼ポリシーを使用すると、アクセスを委任し、他のユーザーに自分の AWS アカウントでのアクションの実行を許可できます。詳細については、「IAM ユーザーガイド」の「カスタム信頼ポリシーを使用してロールを作成する」を参照してください。

    信頼関係には、次の例のように、キーが AWS で、値がアカウント A の ARN であるプリンシパルオブジェクトが必要です。

    ... "Principal": { "AWS": ["arn:aws:iam::account-A-id:user/username"] }, ...
  2. また、アカウント B で、CreateDataCatalog アクションを許可する次のようなポリシーを作成します。

    { "Effect": "Allow", "Action": "athena:CreateDataCatalog", "Resource": "arn:aws:athena:*:account-B-id:datacatalog/*" }
  3. アカウント B を使用して作成した AthenaCrossAccountCreate-account-A-id ロールに CreateDataCatalog アクションを許可するポリシーを追加します。

アカウント A のデータソースをアカウント B と共有する

アクセス許可を設定すると、Athena コンソールの [データソースとカタログ] ページで、アカウント (アカウント A) のデータコネクタを別のアカウント (アカウント B) と共有できます。アカウント A は、コネクタの完全な制御と所有権を保持しています。アカウント A がコネクタの設定を変更すると、更新された設定がアカウント B の共有されたコネクタに適用されます。

注記

Lambda タイプのデータソースのみを共有でき、AWS Glue 接続を使用するデータソースは共有できません。詳細については、「使用可能なデータソースコネクタ」を参照してください。

アカウント A の Lambda データソースをアカウント B と共有するには
  1. https://console.aws.amazon.com/athena/ で Athena コンソールを開きます。

  2. コンソールのナビゲーションペインが表示されない場合は、左側の展開メニューをクリックします。

    展開メニューを選択します。
  3. [データソースとカタログ] を選択します。

  4. [データソースとカタログ] ページで、共有するコネクタのリンクを選択します。

  5. Lambda データソースの詳細ページで、右上隅の [Actions] (アクション) メニューから [Share] (共有) オプションを選択します。

  6. [Share Lambda-name with another account?] (別のアカウントと Lambda-name を共有) ダイアログボックスで、必要な情報を入力します。

    • [Data source name] (データソース名) については、コピーしたデータソースの名前を他のアカウントで表示したいとおりに入力します。

    • [Account ID] (アカウント ID) については、データソースを共有するアカウントの ID を入力します (この場合、アカウント B)。

  7. [共有] を選択します。指定した共有のデータコネクタが、アカウント B で作成されます。アカウント A のコネクタに対する設定の変更は、アカウント B のコネクタに適用されます。

アカウント A からアカウント B への共有データソースの追加

データアナリストとして、データ管理者からアカウントに追加するコネクタの ARN が与えられる場合があります。Athena コンソールの [データソースとカタログ] ページを使用して、管理者から提供された Lambda ARN をアカウントに追加できます。

共有されたデータコネクタの Lambda ARN をアカウントに追加するには
  1. https://console.aws.amazon.com/athena/ で Athena コンソールを開きます。

  2. ナビゲーションペインが表示されない場合は、左側の展開メニューをクリックします。

  3. [データソースとカタログ] を選択します。

  4. [データソースとカタログ] ページで [データソースを作成] を選択します。

  5. [Choose a data source] (データソースの選択) ページで、[Custom or shared connector] (カスタムまたは共有されたコネクタ) を選択します。

  6. [Next] を選択します。

  7. [Enter data source details] (データソースの詳細を入力) ページの [Connection details] (接続の詳細) セクションで、[Select or enter a Lambda function] (Lambda 関数を選択または入力) については、アカウント A の Lambda ARN を入力します。

  8. [Next] を選択します。

  9. [Review and create] (確認して作成) ページで、[Create data source] (データソースを作成) を選択します。

トラブルシューティング

アカウント A にアカウント B のロールを引き受けるアクセス許可がないというエラーメッセージが表示された場合は、アカウント B で作成されたロールの名前のスペルが正しいこと、適切なポリシーがアタッチされていることを確認してください。