外部 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:::mybucket/spill" ] } ] }

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

Lambda 関数の作成

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

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

カタログ登録とメタデータ API オペレーション

カタログ登録 API およびメタデータ API オペレーションにアクセスするには、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 関数を呼び出すには、Lambda 関数の完全な ARN を使用します。デフォルトで、Athena は同じリージョンで定義された Lambda 関数を呼び出します。Athena クエリを実行するリージョン以外のリージョンにある Hive メタストアにアクセスするための Lambda 関数を呼び出す必要がある場合は、Lambda 関数の完全な ARN を指定する必要があります。

例えば、欧州 (フランクフルト) リージョン eu-central-1 のカタログ ehms を、米国東部 (バージニア北部) リージョンで以下の Lambda 関数を使用するように定義するとします。

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 メタストアデータを取得することができます。

注記

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

Lambda のクロスアカウント呼び出し

時折、別のアカウントから Hive メタストアへのアクセスが必要になる場合があります。例えば、Hive メタストアを実行するために、Athena クエリに使用するアカウントとは異なるアカウントから EMR クラスターを起動することがあります。異なるグループやチームが、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 データにアクセスします。