クロスアカウントのフェデレーションクエリの有効化
フェデレーションクエリを使用すると、AWS Lambda にデプロイされたデータソースコネクタを使用して Amazon S3 以外のデータソースをクエリできます。クロスアカウントのフェデレーションクエリ機能を使用すると、Lambda 関数とクエリ対象のデータソースを異なるアカウントに配置できます。
データ管理者は、データコネクタをデータアナリストのアカウントと共有することでクロスアカウントの串刺検索を有効化できます。また、データアナリストは、データ管理者から共有された 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 と Lambda 関数を共有するには、アカウント B に Lambda の呼び出し関数と流出バケットのアクセスが必要です。したがって、アカウント A では、Lambda 関数へのリソースベースのポリシーと Amazon S3 内の流出バケットへのプリンシパルアクセスを追加する必要があります。
-
次のポリシーは、アカウント 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
" } ] } -
次のポリシーは、アカウント 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
/*" ] } ] } -
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. }
-
-
アカウント A のコネクタをアカウント B と共有するには、AWS Security Token Service の AssumeRole API アクションを呼び出すことでアカウント A が引き受ける
AthenaCrossAccountCreate-
というロールをアカウント B で作成する必要があります。account-A-id
CreateDataCatalog
アクションを許可する次のポリシーは、アカウント B で作成され、アカウント B がアカウント A に対して作成するAthenaCrossAccountCreate-
ロールに追加される必要があります。account-A-id
{ "Effect": "Allow", "Action": "athena:CreateDataCatalog", "Resource": "arn:aws:athena:*:
account-B-id
:datacatalog/*" }
アカウント A のデータソースをアカウント B と共有する
アクセス許可を設定したら、Athena コンソールの [Data sources] (データソース) ページで、アカウント (アカウント A) のデータコネクタを別のアカウント (アカウント B) と共有できます。アカウント A は、コネクタの完全な制御と所有権を保持しています。アカウント A がコネクタの設定を変更すると、更新された設定がアカウント B の共有されたコネクタに適用されます。
アカウント A の Lambda データソースをアカウント B と共有するには
https://console.aws.amazon.com/athena/
で Athena コンソールを開きます。 コンソールのナビゲーションペインが表示されない場合は、左側の展開メニューをクリックします。
-
[Data sources] (データソース) を選択します。
-
[Data sources] (データソース) ページで、共有するコネクタのリンクを選択します。
-
Lambda データソースの詳細ページで、右上隅の [Share] (共有) オプションを選択します。
-
[Share
Lambda-name
with another account] (別のアカウントと Lambda-name を共有) ダイアログボックスで、必要な情報を入力します。-
[Data source name] (データソース名) については、コピーしたデータソースの名前を他のアカウントで表示したいとおりに入力します。
-
[Account ID] (アカウント ID) については、データソースを共有するアカウントの ID を入力します (この場合、アカウント B)。
-
-
[共有] を選択します。指定した共有のデータコネクタが、アカウント B で作成されます。アカウント A のコネクタに対する設定の変更は、アカウント B のコネクタに適用されます。
アカウント A からアカウント B への共有データソースの追加
データアナリストとして、データ管理者からアカウントに追加するコネクタの ARN が与えられる場合があります。Athena コンソールの [Data sources] (データソース) ページで、管理者から提供された Lambda ARN をアカウントに追加します。
共有されたデータコネクタの Lambda ARN をアカウントに追加するには
https://console.aws.amazon.com/athena/
で Athena コンソールを開きます。 -
新しいコンソールエクスペリエンスを使用しており、ナビゲーションペインが表示されない場合は、左側の展開メニューを選択します。
-
[Data sources] (データソース) を選択します。
-
[Data sources] (データソース) タブで [Connect data source] (データソースを接続する) をクリックします。
-
[Custom or shared connector] (カスタムまたは共有されたコネクタ) 選択します。
-
[Lambda function] (Lambda 関数) セクションで、[Use an existing Lambda function] (既存の Lambda 関数の使用) オプションが選択されていることを確認します。
-
[Choose or enter a Lambda function] (Lambda 関数の選択または入力) については、アカウント A の Lambda ARN を入力します。
-
[Connect data source] (データソースを接続する) をクリックします。
トラブルシューティング
アカウント A にアカウント B のロールを引き受けるアクセス許可がないというエラーメッセージが表示された場合は、アカウント B で作成されたロールの名前のスペルが正しいこと、適切なポリシーがアタッチされていることを確認してください。