外部 Hive メタストアへの Lambda 関数アクセスを許可する
アカウントで Lambda 関数を呼び出すには、以下の許可を持つロールを作成する必要があります。
-
AWSLambdaVPCAccessExecutionRole
– 関数を VPC に接続する Elastic Network Interface を管理する AWS Lambda 実行ロールアクセス許可。利用可能なネットワークインターフェイスと IP アドレスが十分であることを確認します。 -
AmazonAthenaFullAccess
– AmazonAthenaFullAccess マネージドポリシーは、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-1
で external-hms-service-new
Lambda 関数を呼び出して、eu-central-1
から Hive メタストアデータを取得することができます。
注記
カタログは、Athena クエリを実行するのと同じ AWS リージョン に登録する必要があります。
アカウント間で Lambda 関数を呼び出す
時折、別のアカウントから Hive メタストアへのアクセスが必要になる場合があります。例えば、Hive メタストアを実行するために、Athena クエリに使用するアカウントとは異なるアカウントを使用することがあります。異なるグループやチームが、VPC 内の異なるアカウントで Hive メタストアを実行することもできます。または、異なるグループやチームから異なる Hive メタストアのメタデータにアクセスすることもできます。
Athena は、クロスアカウントアクセスに対する AWS Lambda サポート
注記
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 データにアクセスします。