外部 Hive メタストアへの Lambda 関数アクセスを許可する - Amazon Athena

外部 Hive メタストアへの Lambda 関数アクセスを許可する

アカウントで Lambda 関数を呼び出すには、以下の許可を持つロールを作成する必要があります。

  • AWSLambdaVPCAccessExecutionRole – 関数を VPC に接続する Elastic Network Interface を管理する AWS Lambda 実行ロールアクセス許可。利用可能なネットワークインターフェイスと IP アドレスが十分であることを確認します。

  • AmazonAthenaFullAccessAmazonAthenaFullAccess マネージドポリシーは、Athena への完全なアクセス権を付与します。

  • Lambda 関数に Amazon S3 への書き込みを許可し、Athena に S3 からの読み取りを許可する S3 ポリシーです。

たとえば、次のポリシーは、スピル場所 s3:\\mybucket\spill のアクセス許可を定義します。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:GetBucketLocation", "s3:GetObject", "s3:ListBucket", "s3:PutObject" ], "Resource": [ "arn:aws:s3:::amzn-s3-demo-bucket/spill" ] } ] }

IAM ポリシーを使用するときは、常に IAM のベストプラクティスに従うようにしてください。詳細については、「IAM ユーザーガイド」の「IAM でのセキュリティベストプラクティス」を参照してください。

Lambda 関数を作成する

アカウント内で Lambda 関数を作成するには、関数の開発許可、または AWSLambdaFullAccess ロールが必要です。詳細については、「AWS Lambda のアイデンティティベースの IAM ポリシー」を参照してください。

Athena は AWS Serverless Application Repository を使用して Lambda 関数を作成するため、Lambda 関数を作成するスーパーユーザーまたは管理者には、Athena の横串検索を許可する IAM ポリシーも必要です。

カタログ登録とメタデータ API オペレーションのアクセス許可を設定する

カタログ登録およびメタデータオペレーションへの API アクセスには、AmazonAthenaFullAccess マネージドポリシーを使用できます。AmazonAthenaFullAccess ポリシーを使用しない場合は、以下の API オペレーションを Athena ポリシーに追加します。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "athena:ListDataCatalogs", "athena:GetDataCatalog", "athena:CreateDataCatalog", "athena:UpdateDataCatalog", "athena:DeleteDataCatalog", "athena:GetDatabase", "athena:ListDatabases", "athena:GetTableMetadata", "athena:ListTableMetadata" ], "Resource": [ "*" ] } ] }

リージョン間で Lambda 関数を呼び出す

デフォルトで、Athena は同じリージョンで定義された Lambda 関数を呼び出します。Athena クエリを実行しているリージョン以外の AWS リージョン で Lambda 関数を呼び出すには、Lambda 関数の完全な ARN を使用します。

次の例は、欧州 (フランクフルト) リージョンのカタログが、米国東部 (バージニア北部) リージョンの Lambda 関数を指定して、欧州 (フランクフルト) リージョンの Hive メタストアからデータを取得する方法を示しています。

arn:aws:lambda:us-east-1:111122223333:function:external-hms-service-new

この方法で完全な ARN を指定すると、Athena は us-east-1external-hms-service-new Lambda 関数を呼び出して、eu-central-1 から Hive メタストアデータを取得することができます。

注記

カタログは、Athena クエリを実行するのと同じ AWS リージョン に登録する必要があります。

アカウント間で Lambda 関数を呼び出す

時折、別のアカウントから Hive メタストアへのアクセスが必要になる場合があります。例えば、Hive メタストアを実行するために、Athena クエリに使用するアカウントとは異なるアカウントを使用することがあります。異なるグループやチームが、VPC 内の異なるアカウントで Hive メタストアを実行することもできます。または、異なるグループやチームから異なる Hive メタストアのメタデータにアクセスすることもできます。

Athena は、クロスアカウントアクセスに対する AWS Lambda サポートを使用して、Hive メタストアのクロスアカウントアクセスを可能にします。

注記

Athena のクロスアカウントアクセスは、通常 Amazon S3 内のメタデータとデータの両方に対するクロスアカウントアクセスを意味することに注意してください。

以下のシナリオを想像してください。

  • アカウント 111122223333 は、EMR クラスターで実行されている Hive メタストアにアクセスするために、Athena で us-east-1 の Lambda 関数 external-hms-service-new をセットアップします。

  • アカウント 111122223333 は、アカウント 444455556666 に Hive メタストアデータへのアクセスを許可しようとしています。

アカウント 444455556666 に Lambda 関数 external-hms-service-new へのアクセス権を付与するため、アカウント 111122223333 は以下の AWS CLI add-permission コマンドを使用します。コマンドは、読みやすい形式にしてあります。

$ aws --profile perf-test lambda add-permission --function-name external-hms-service-new --region us-east-1 --statement-id Id-ehms-invocation2 --action "lambda:InvokeFunction" --principal arn:aws:iam::444455556666:user/perf1-test { "Statement": "{\"Sid\":\"Id-ehms-invocation2\", \"Effect\":\"Allow\", \"Principal\":{\"AWS\":\"arn:aws:iam::444455556666:user/perf1-test\"}, \"Action\":\"lambda:InvokeFunction\", \"Resource\":\"arn:aws:lambda:us-east-1:111122223333:function:external-hms-service-new\"}" }

Lambda 許可をチェックするには、以下の例にあるように get-policy コマンドを使用します。コマンドは、読みやすい形式にしてあります。

$ aws --profile perf-test lambda get-policy --function-name arn:aws:lambda:us-east-1:111122223333:function:external-hms-service-new --region us-east-1 { "RevisionId": "711e93ea-9851-44c8-a09f-5f2a2829d40f", "Policy": "{\"Version\":\"2012-10-17\", \"Id\":\"default\", \"Statement\":[{\"Sid\":\"Id-ehms-invocation2\", \"Effect\":\"Allow\", \"Principal\":{\"AWS\":\"arn:aws:iam::444455556666:user/perf1-test\"}, \"Action\":\"lambda:InvokeFunction\", \"Resource\":\"arn:aws:lambda:us-east-1:111122223333:function:external-hms-service-new\"}]}" }

許可を追加した後は、以下にあるように、カタログ ehms の定義時に us-east-1 で Lambda 関数の完全な ARN を使用できます。

arn:aws:lambda:us-east-1:111122223333:function:external-hms-service-new

クロスリージョン呼び出しの詳細については、このトピックの「リージョン間で Lambda 関数を呼び出す」を参照してください。

データに対するクロスアカウントアクセス権を付与する

Athena クエリを実行する前に、Amazon S3 内のデータへのクロスアカウントアクセス権を付与する必要があります。これには以下の 2 つの方法があります。

  • 正規ユーザー ID で Amazon S3 バケットのアクセスコントロールリストポリシーを更新します。

  • Amazon S3 バケットポリシーに対するクロスアカウントアクセス権を追加します。

例えば、アカウント 111122223333 の Amazon S3 バケットポリシーに以下のポリシーを追加して、アカウント 444455556666 が指定された Amazon S3 の場所からデータを読み取ることを許可します。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "Stmt1234567890123", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::444455556666:user/perf1-test" }, "Action": "s3:GetObject", "Resource": "arn:aws:s3:::athena-test/lambda/dataset/*" } ] }
注記

データだけでなく、Amazon S3 のスピルの場所へのクロスアカウントアクセス権も付与する必要がある場合があります。レスポンスオブジェクトのサイズが指定されたしきい値を超えると、Lambda 関数は余分なデータをスピルの場所にスピルします。サンプルポリシーについては、このトピックの最初を参照してください。

現在の例では、444455556666, にクロスアカウントアクセスが許可された後、444455556666 が独自の account のカタログ ehms を使用して、アカウント 111122223333 で定義されたテーブルをクエリできます。

次の例では、SQLワークベンチプロファイル perf-test-1 は、アカウント 444455556666 用です。このクエリは、カタログ ehms を使用して、アカウント 111122223333 の Hive メタストアと Amazon S3 データにアクセスします。

SQL Workbench でアカウント全体の Hive メタストアと Amazon S3 データにアクセスします。