

# 外部 Hive メタストアへの Lambda 関数アクセスを許可する
<a name="hive-metastore-iam-access-lambda"></a>

アカウントで Lambda 関数を呼び出すには、以下の許可を持つロールを作成する必要があります。
+ `AWSLambdaVPCAccessExecutionRole` – 関数を VPC に接続する Elastic Network Interface を管理する [AWS Lambda 実行ロール](https://docs.aws.amazon.com/lambda/latest/dg/lambda-intro-execution-role.html)アクセス許可。利用可能なネットワークインターフェイスと IP アドレスが十分であることを確認します。
+ `AmazonAthenaFullAccess` – [AmazonAthenaFullAccess](security-iam-awsmanpol.md#amazonathenafullaccess-managed-policy) マネージドポリシーは、Athena への完全なアクセス許可を付与します。
+ Lambda 関数に Amazon S3 への書き込みを許可し、Athena に S3 からの読み取りを許可する S3 ポリシーです。

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

------
#### [ JSON ]

****  

```
{ "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 でのセキュリティベストプラクティス](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)」を参照してください。

## Lambda 関数を作成する
<a name="hive-metastore-iam-access-lambda-creating-lambda-functions"></a>

アカウント内で Lambda 関数を作成するには、関数の開発許可、または `AWSLambdaFullAccess` ロールが必要です。詳細については、「[AWS Lambda のアイデンティティベースの IAM ポリシー](https://docs.aws.amazon.com/lambda/latest/dg/access-control-identity-based.html)」を参照してください。

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

## カタログ登録とメタデータ API オペレーションのアクセス許可を設定する
<a name="hive-metastore-iam-access-lambda-catalog-registration-and-metadata-api-operations"></a>

カタログ登録およびメタデータオペレーションへの API アクセスには、[AmazonAthenaFullAccess マネージドポリシー](security-iam-awsmanpol.md#amazonathenafullaccess-managed-policy)を使用できます。`AmazonAthenaFullAccess` ポリシーを使用しない場合は、以下の API オペレーションを Athena ポリシーに追加します。

------
#### [ JSON ]

****  

```
{
    "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 関数を呼び出す
<a name="hive-metastore-iam-access-lambda-cross-region-invocation"></a>

デフォルトで、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 関数を呼び出す
<a name="hive-metastore-iam-access-lambda-cross-account-invocation"></a>

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

Athena は、[クロスアカウントアクセスに対する AWS Lambda サポート](https://aws.amazon.com/blogs/compute/easy-authorization-of-aws-lambda-functions/)を使用して、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 関数を呼び出す](#hive-metastore-iam-access-lambda-cross-region-invocation)」を参照してください。

### データに対するクロスアカウントアクセス許可を付与する
<a name="hive-metastore-iam-access-lambda-granting-cross-account-access-to-data"></a>

Athena クエリを実行する前に、Amazon S3 内のデータへのクロスアカウントアクセス許可を付与する必要があります。これは、次のいずれかの方法で行うことができます。
+ [正規ユーザー ID](https://docs.aws.amazon.com/general/latest/gr/acct-identifiers.html) で Amazon S3 バケットのアクセスコントロールリストポリシーを更新します。
+ Amazon S3 バケットポリシーに対するクロスアカウントアクセス許可を追加します。

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

------
#### [ JSON ]

****  

```
{ "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 データにアクセスします。\]](http://docs.aws.amazon.com/ja_jp/athena/latest/ug/images/hive-metastore-iam-access-lambda-1.png)
