

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# Amazon EMR 統合シナリオ用の Apache Ranger プラグイン
<a name="emr-ranger-plugins"></a>

Apache Ranger プラグインは、Apache Ranger ポリシー管理サーバーで定義された認可ポリシーに対してユーザーのアクセスを検証します。

**Topics**
+ [Amazon EMR と Apache Ranger の統合用 Apache Hive プラグイン](emr-ranger-hive.md)
+ [Amazon EMR と Apache Ranger の統合用 Apache Spark プラグイン](emr-ranger-spark.md)
+ [Amazon EMR と Apache Ranger の統合用 EMRFS S3 プラグイン](emr-ranger-emrfs.md)
+ [Ranger と Amazon EMR の統合用の Trino プラグイン](emr-ranger-trino.md)

# Amazon EMR と Apache Ranger の統合用 Apache Hive プラグイン
<a name="emr-ranger-hive"></a>

Apache Hive は Hadoop エコシステム内の普及している実行エンジンです。Amazon EMR は、Hive のきめ細かなアクセスコントロールを提供できる Apache Ranger プラグインを提供しています。このプラグインはオープンソースの Apache Ranger 管理サーバーバージョン 2.0 以降と互換性があります。

**Topics**
+ [サポートされている機能](#emr-ranger-supported-features)
+ [サービス設定のインストール](#emr-ranger-hive-service-config)
+ [考慮事項](#emr-ranger-hive-considerations)
+ [制限事項](#emr-ranger-hive-limitations)

## サポートされている機能
<a name="emr-ranger-supported-features"></a>

EMR 上の Hive 用の Apache Ranger プラグインは、データベース、テーブル、列レベルのアクセスコントロール、行フィルタリング、データマスキングなど、オープンソースプラグインのすべての機能をサポートしています。Hive コマンドおよび関連する Ranger アクセス許可の表については、「[Hive commands to Ranger permission mapping](https://cwiki.apache.org/confluence/display/RANGER/Hive+Commands+to+Ranger+Permission+Mapping)」を参照してください。

## サービス設定のインストール
<a name="emr-ranger-hive-service-config"></a>

Apache Hive プラグインは、Apache Hive Hadoop SQL 内の既存の Hive サービス定義と互換性があります。

![\[Hadoop SQL の Apache Hive サービス定義。\]](http://docs.aws.amazon.com/ja_jp/emr/latest/ManagementGuide/images/ranger_service_mgr.png)


上記のように Hadoop SQL の下にサービスのインスタンスがない場合には、インスタンスを作成できます。Hadoop SQL の横の **[\$1]** をクリックします。

1. **[Service Name]** (サービス名): これが表示されている場合は、サービス名を入力します。推奨値は **amazonemrhive** です。このサービス名をメモしておいてください。EMR セキュリティ設定を作成するときに必要です。

1. **[Display Name]** (表示名): サービスに対して表示する名前を入力します。推奨値は **amazonemrhive** です。

![\[Hadoop SQL の Apache Hive サービスの詳細。\]](http://docs.aws.amazon.com/ja_jp/emr/latest/ManagementGuide/images/ranger_create_service.png)


Apache Hive 設定プロパティは、HiveServer2 を使用して Apache Ranger 管理サーバーへの接続を確立し、ポリシーの作成時にオートコンプリートを実装するために使用されます。永続的な HiveServer2 プロセスがない場合は、以下のプロパティは正確である必要はなく、任意の情報を入力できます。
+ **[Username]** (ユーザー名): HiveServer2 インスタンスのインスタンスへの JDBC 接続のユーザー名を入力します。
+ **[Password]** (パスワード): 上記のユーザー名のパスワードを入力します。
+ **jdbc.driver.ClassName**: Apache Hive 接続用の JDBC クラスのクラス名を入力します。デフォルト値を使用できます。
+ **jdbc.url**: HiveServer2 への接続時に使用する JDBC 接続文字列を入力します。
+ **[Common Name for Certificate]** (証明書の共通名): クライアントプラグインから管理サーバーに接続するために使用する証明書内の CN フィールド。この値は、プラグイン用に作成された TLS 証明書の CN フィールドと一致する必要があります。

![\[Apache Hive サービス設定プロパティ。\]](http://docs.aws.amazon.com/ja_jp/emr/latest/ManagementGuide/images/ranger_config_props.png)


**[Test Connection]** (接続のテスト) ボタンでは、上記の値を使用して HiveServer2 インスタンスに正常に接続できるかどうかをテストします。サービスが正常に作成されると、サービスマネージャは以下のようになります。

![\[HiveServer2 インスタンスに接続されている\]](http://docs.aws.amazon.com/ja_jp/emr/latest/ManagementGuide/images/ranger_config_connected.png)


## 考慮事項
<a name="emr-ranger-hive-considerations"></a>

**Hive メタデータサーバー**

Hive メタデータサーバーには、不正アクセスから保護するために、信頼されたエンジン (具体的には Hive および `emr_record_server`) からしかアクセスできません。また、Hive メタデータサーバーには、クラスター上のすべてのノードからもアクセスできます。ポート 9083 は必須で、メインノードへのすべてのノードアクセスを提供します。

**認証**

デフォルトでは、Apache Hive は EMR セキュリティ設定で構成された Kerberos を使用して認証するように設定されています。HiveServer2 は、LDAP を使用してユーザーを認証するように設定することもできます。「[Implementing LDAP authentication for Hive on a multi-tenant Amazon EMR cluster](https://aws.amazon.com/blogs/big-data/implementing-ldap-authentication-for-hive-on-a-multi-tenant-amazon-emr-cluster/)」を参照してください。

## 制限事項
<a name="emr-ranger-hive-limitations"></a>

Amazon EMR 5.x での Apache Hive プラグインの現在の制限事項は次のとおりです。
+ Hive ロールは、現在サポートされていません。Grant、Revoke ステートメントはサポートされていません。
+ Hive CLI はサポートされていません。JDBC/Beeline だけが Hive を接続するために認可されている方法です。
+ `hive.server2.builtin.udf.blacklist` 設定には、安全ではないと判断される UDF を入力する必要があります。

# Amazon EMR と Apache Ranger の統合用 Apache Spark プラグイン
<a name="emr-ranger-spark"></a>

Amazon EMR には EMR RecordServer が統合されており、SparkSQL のきめ細かなアクセスコントロールを実現しています。EMR の RecordServer は、Apache Ranger 対応クラスター上のすべてのノードで実行される特権プロセスです。Spark ドライバーまたはエグゼキューターが SparkSQL ステートメントを実行すると、すべてのメタデータおよびデータリクエストが RecordServer を経由します。EMR RecordServer の詳細については、「[Apache Ranger で使用する Amazon EMR コンポーネント](emr-ranger-components.md)」ページを参照してください。

**Topics**
+ [サポートされている機能](#emr-ranger-spark-supported-features)
+ [INSERT、ALTER、または DDL ステートメントを使用するように、サービス定義を再デプロイする](#emr-ranger-spark-redeploy-service-definition)
+ [サービス定義のインストール](#emr-ranger-spark-install-servicedef)
+ [SparkSQL ポリシーの作成](#emr-ranger-spark-create-sparksql)
+ [考慮事項](#emr-ranger-spark-considerations)
+ [制限事項](#emr-ranger-spark-limitations)

## サポートされている機能
<a name="emr-ranger-spark-supported-features"></a>


| SQL ステートメント/Ranger アクション | STATUS | サポートされている EMR リリース | 
| --- | --- | --- | 
|  SELECT  |  サポート  |  5.32 以降  | 
|  SHOW DATABASES  |  サポート  |  5.32 以降  | 
|  SHOW COLUMNS  |  サポート  |  5.32 以降  | 
|  SHOW TABLES  |  サポート  |  5.32 以降  | 
|  SHOW TABLE PROPERTIES  |  サポート  |  5.32 以降  | 
|  DESCRIBE TABLE  |  サポート  |  5.32 以降  | 
|  INSERT OVERWRITE  |  サポート  |  5.34 および 6.4 以降  | 
| INSERT INTO | サポート | 5.34 および 6.4 以降 | 
|  ALTER TABLE  |  サポート  |  6.4 以降  | 
|  CREATE TABLE  |  サポート  |  5.35 および 6.7 以降  | 
|  CREATE DATABASE  |  サポート  |  5.35 および 6.7 以降  | 
|  DROP TABLE  |  サポート  |  5.35 および 6.7 以降  | 
|  DROP DATABASE  |  サポート  |  5.35 および 6.7 以降  | 
|  DROP VIEW  |  サポート  |  5.35 および 6.7 以降  | 
|  CREATE VIEW  |  サポート外  |    | 

SparkSQL を使用する場合、次の機能がサポートされています。
+ Hive Metastore 内のテーブルに対するきめ細かいアクセスコントロール、およびポリシーを、データベース、テーブル、および列レベルで作成できます。
+ Apache Ranger ポリシーには、ユーザーおよびグループへの付与ポリシーと拒否ポリシーを含めることができます。
+ 監査イベントは CloudWatch Logs に送信されます。

## INSERT、ALTER、または DDL ステートメントを使用するように、サービス定義を再デプロイする
<a name="emr-ranger-spark-redeploy-service-definition"></a>

**注記**  
Amazon EMR 6.4 以降、INSERT INTO、INSERT OVERWRITE、ALTER TABLE の各ステートメントを使用して Spark SQL を使用できます。Amazon EMR 6.7 以降では、Spark SQL を使用してデータベースとテーブルを作成したり削除したりできます。Apache Spark サービス定義がデプロイされた Apache Ranger サーバー上の既存のインストール環境がある場合は、次のコードを使用してサービス定義を再デプロイします。  

```
# Get existing Spark service definition id calling Ranger REST API and JSON processor
curl --silent -f -u <admin_user_login>:<password_for_ranger_admin_user> \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-k 'https://*<RANGER SERVER ADDRESS>*:6182/service/public/v2/api/servicedef/name/amazon-emr-spark' | jq .id

# Download the latest Service definition
wget https://s3.amazonaws.com/elasticmapreduce/ranger/service-definitions/version-2.0/ranger-servicedef-amazon-emr-spark.json

# Update the service definition using the Ranger REST API
curl -u <admin_user_login>:<password_for_ranger_admin_user> -X PUT -d @ranger-servicedef-amazon-emr-spark.json \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-k 'https://*<RANGER SERVER ADDRESS>*:6182/service/public/v2/api/servicedef/<Spark service definition id from step 1>'
```

## サービス定義のインストール
<a name="emr-ranger-spark-install-servicedef"></a>

EMR の Apache Spark サービス定義をインストールするには、レンジャー管理サーバーを設定する必要があります。「[Amazon EMR と統合するように Ranger 管理サーバーを設定する](emr-ranger-admin.md)」を参照してください。

Apache Spark サービス定義をインストールするには、次の手順に従います。

**ステップ 1: Apache Ranger 管理サーバーに SSH で接続する**

例: 

```
ssh ec2-user@ip-xxx-xxx-xxx-xxx.ec2.internal
```

**ステップ 2: サービス定義および Apache Ranger 管理サーバープラグインをダウンロードする**

一時ディレクトリに、サービス定義をダウンロードします。このサービス定義は Ranger 2.x バージョンでサポートされています。

```
mkdir /tmp/emr-spark-plugin/
cd /tmp/emr-spark-plugin/

wget https://s3.amazonaws.com/elasticmapreduce/ranger/service-definitions/version-2.0/ranger-spark-plugin-2.x.jar
wget https://s3.amazonaws.com/elasticmapreduce/ranger/service-definitions/version-2.0/ranger-servicedef-amazon-emr-spark.json
```

**ステップ 3: Amazon EMR 用の Apache Spark プラグインをインストールする**

```
export RANGER_HOME=.. # Replace this Ranger Admin's home directory eg /usr/lib/ranger/ranger-2.0.0-admin
mkdir $RANGER_HOME/ews/webapp/WEB-INF/classes/ranger-plugins/amazon-emr-spark
mv ranger-spark-plugin-2.x.jar $RANGER_HOME/ews/webapp/WEB-INF/classes/ranger-plugins/amazon-emr-spark
```

**ステップ 4: Amazon EMR の Apache Spark サービス定義を登録する**

```
curl -u *<admin users login>*:*_<_**_password_ **_for_** _ranger admin user_**_>_* -X POST -d @ranger-servicedef-amazon-emr-spark.json \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-k 'https://*<RANGER SERVER ADDRESS>*:6182/service/public/v2/api/servicedef'
```

このコマンドが正常に実行されると、次の図に示すように、Ranger 管理 UI に「AMAZON-EMR-SPARK」という新しいサービスが表示されます (Ranger バージョン 2.0 が示されています)。

![\[Ranger 管理に「AMAZON-EMR-SPARK」が登録されています。\]](http://docs.aws.amazon.com/ja_jp/emr/latest/ManagementGuide/images/ranger-amazon-emr-spark.png)


**ステップ 5: AMAZON-EMR-SPARK アプリケーションのインスタンスを作成する**

**[Service Name]** (サービス名): 使用されるサービス名 (表示されている場合)。推奨値は **amazonemrspark** です。このサービス名をメモしておいてください。EMR セキュリティ設定を作成するときに必要になります。

**[Display Name]** (表示名): このインスタンスに表示される名前。推奨値は **amazonemrspark** です。

**[Common Name For Certificate]** (証明書の共通名): クライアントプラグインから管理サーバーに接続するために使用する証明書内の CN フィールド。この値は、プラグイン用に作成された TLS 証明書の CN フィールドと一致する必要があります。

![\[Ranger 管理のサービス作成。\]](http://docs.aws.amazon.com/ja_jp/emr/latest/ManagementGuide/images/ranger-create-service.png)


**注記**  
このプラグインの TLS 証明書は、Ranger 管理サーバーのトラストストアに登録されている必要があります。詳細については、「[Apache Ranger と Amazon EMR の統合のための TLS 証明書](emr-ranger-admin-tls.md)」を参照してください。

## SparkSQL ポリシーの作成
<a name="emr-ranger-spark-create-sparksql"></a>

新しいポリシーを作成する場合、入力するフィールドは次のとおりです。

**[Policy Name]** (ポリシー名): このポリシーの名前。

**[Policy Label]** (ポリシーラベル): このポリシーにつけることができるラベル。

**[Database]** (データベース): このポリシーが適用されるデータベース。ワイルドカード「\$1」はすべてのデータベースを表します。

**[Table]** (テーブル): このポリシーが適用されるテーブル。ワイルドカード「\$1」はすべてのテーブルを表します。

**[EMR Spark Column]** (EMR Spark 列): このポリシーが適用される列。ワイルドカード「\$1」はすべての列を表します。

**[Description]** (説明): このポリシーの説明。

![\[Ranger 管理の SparkSQL ポリシーの作成の詳細。\]](http://docs.aws.amazon.com/ja_jp/emr/latest/ManagementGuide/images/ranger-create-policy-details.png)


ユーザーとグループを指定するには、以下のユーザーおよびグループを入力してアクセス許可を付与します。**[許可]** 条件および **[拒否]** 条件の除外を指定することもできます。

![\[Ranger 管理の SparkSQL ポリシーの詳細の許可条件。\]](http://docs.aws.amazon.com/ja_jp/emr/latest/ManagementGuide/images/ranger-create-policy-allow-conditions.png)


許可条件と拒否条件を指定したら、**[Save]** (保存) をクリックします。

## 考慮事項
<a name="emr-ranger-spark-considerations"></a>

EMR クラスター内の各ノードは、ポート 9083 でメインノードに接続できる必要があります。

## 制限事項
<a name="emr-ranger-spark-limitations"></a>

Apache Spark プラグインの現在の制限事項は次のとおりです。
+ レコードサーバーは常に Amazon EMR クラスターで実行されている HMS に接続します。必要に応じて、リモートモードに接続するように HMS を設定します。Apache Spark Hive-site.xml 設定ファイル内に設定値を入れないでください。
+ CSV または Avro で Spark データソースを使用して作成されたテーブルは、EMR RecordServer を使用して読み取ることができません。Hive を使用してデータの作成および書き込みを行い、Record を使用して読み取りを行います。
+ Delta Lake、Hudi および Iceberg テーブルはサポートされていません。
+ ユーザーは、デフォルトのデータベースにアクセスできる必要があります。これは Apache Spark の要件です。
+ Ranger 管理サーバーはオートコンプリートをサポートしていません。
+ Amazon EMR 用 SparkSQL プラグインは、行フィルターやデータマスキングをサポートしていません。
+ Spark SQL で ALTER TABLE を使用する場合、パーティションの場所はテーブルの場所の子ディレクトリである必要があります。パーティションの場所がテーブルの場所と異なるパーティションへのデータの挿入はサポートされていません。

# Amazon EMR と Apache Ranger の統合用 EMRFS S3 プラグイン
<a name="emr-ranger-emrfs"></a>

マルチテナントクラスター上の S3 内のオブジェクトに対するアクセスコントロールを容易に提供できるようにするために、EMRFS S3 プラグインは、EMRFS 経由で S3 内のデータにアクセスするときに S3 内のデータへのアクセスコントロールを提供します。S3 リソースへのアクセスは、ユーザーおよびグループレベルで許可できます。

これを実現するために、アプリケーションが S3 内のデータにアクセスしようとすると、EMRFS は認証情報のリクエストをシークレットエージェントプロセスに送信し、そこでリクエストが Apache Ranger プラグインに対して認証され、認可されます。リクエストが認可されると、シークレットエージェントは制限されたポリシーを使用して Apache Ranger エンジンの IAM ロールを引き受けて、アクセスを許可した Ranger ポリシーにのみアクセスできる認証情報を生成します。その後、その認証情報が EMRFS に戻され、S3 にアクセスできるようになります。

**Topics**
+ [サポートされている機能](#emr-ranger-emrfs-features)
+ [サービス設定のインストール](#emr-ranger-emrfs-service-config)
+ [EMRFS S3 ポリシーの作成](#emr-ranger-emrfs-create-policies)
+ [EMRFS S3 ポリシーの使用に関する注意事項](#emr-ranger-emrfs-considerations)
+ [制限事項](#emr-ranger-emrfs-limitations)

## サポートされている機能
<a name="emr-ranger-emrfs-features"></a>

EMRFS S3 プラグインは、ストレージレベルの認可を提供します。ポリシーを作成して、S3 バケットおよびプレフィックスに対すアクセス権をユーザーおよびグループに提供できます。認可は EMRFS に対してのみ行われます。

## サービス設定のインストール
<a name="emr-ranger-emrfs-service-config"></a>

EMRFS サービス定義をインストールするには、Ranger 管理サーバーを設定する必要があります。サーバーをセットアップするには、「[Amazon EMR と統合するように Ranger 管理サーバーを設定する](emr-ranger-admin.md)」を参照してください。

EMRFS サービス定義をインストールするには、次の手順に従います。

**ステップ 1: Apache Ranger 管理サーバーに SSH で接続する**。

例えば、次のようになります。

```
ssh ec2-user@ip-xxx-xxx-xxx-xxx.ec2.internal
```

**ステップ 2: EMRFS サービス定義をダウンロードする**。

一時ディレクトリに、Amazon EMR サービス定義をダウンロードします。このサービス定義は Ranger 2.x バージョンでサポートされています。

```
wget https://s3.amazonaws.com/elasticmapreduce/ranger/service-definitions/version-2.0/ranger-servicedef-amazon-emr-emrfs.json
```

**ステップ 3: EMRFS S3 サービス定義を登録する**。

```
curl -u *<admin users login>*:*_<_**_password_ **_for_** _ranger admin user_**_>_* -X POST -d @ranger-servicedef-amazon-emr-emrfs.json \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-k 'https://*<RANGER SERVER ADDRESS>*:6182/service/public/v2/api/servicedef'
```

このコマンドが正常に実行されると、次の図に示すように、Ranger 管理 UI に「AMAZON-EMR-S3」という新しいサービスが表示されます (Ranger バージョン 2.0 が示されています)。

![\[Ranger 管理の EMRFS S3 サービス作成。\]](http://docs.aws.amazon.com/ja_jp/emr/latest/ManagementGuide/images/ranger-create-service-EMRFS.png)


**ステップ 4: AMAZON-EMR-EMRFS アプリケーションのインスタンスを作成する**。

サービス定義のインスタンスを作成します。
+ AMAZON-EMR-EMRFS の横の **[\$1]** をクリックします。

以下のフィールドに入力します。

**[Service Name]** (サービス名) (表示されている場合): 推奨値は **amazonemrs3** です。このサービス名をメモしておいてください。EMR セキュリティ設定を作成するときに必要になります。

**[Display Name]** (表示名): このサービスに対して表示する名前。推奨値は **amazonemrs3** です。

**[Common Name For Certificate]** (証明書の共通名): クライアントプラグインから管理サーバーに接続するために使用する証明書内の CN フィールド。この値は、プラグイン用に作成された TLS 証明書の CN フィールドと一致する必要があります。

![\[Ranger 管理の EMRFS S3 サービスの編集。\]](http://docs.aws.amazon.com/ja_jp/emr/latest/ManagementGuide/images/ranger-edit-service-EMRFS.png)


**注記**  
このプラグインの TLS 証明書は、Ranger 管理サーバーのトラストストアに登録されている必要があります。詳細については、「[Apache Ranger と Amazon EMR の統合のための TLS 証明書](emr-ranger-admin-tls.md)」を参照してください。

サービスが作成されると、次の図に示すように、サービスマネージャーに「AMAZON-EMR-EMRFS」が表示されます。

![\[新しい EMRFS S3 サービスを示す Ranger 管理。\]](http://docs.aws.amazon.com/ja_jp/emr/latest/ManagementGuide/images/ranger-new-service-EMRFS.png)


## EMRFS S3 ポリシーの作成
<a name="emr-ranger-emrfs-create-policies"></a>

新しいポリシーを作成するには、Service Manager の **[ポリシーの作成]** ページで、次のフィールドに入力します。

**[Policy Name]** (ポリシー名): このポリシーの名前。

**[Policy Label]** (ポリシーラベル): このポリシーにつけることができるラベル。

**[S3 Resource]** (S3 リソース): バケットとオプションのプレフィックスで始まるリソース。ベストプラクティスについては、「[EMRFS S3 ポリシーの使用に関する注意事項](#emr-ranger-emrfs-considerations)」を参照してください。Ranger 管理サーバーのリソースには、**s3://**、**s3a://**、**s3n://** が含まれていてはいけません。

![\[EMRFS S3 サービスのポリシーの作成を示している Ranger 管理。\]](http://docs.aws.amazon.com/ja_jp/emr/latest/ManagementGuide/images/ranger-create-policy-EMRFS.png)


アクセス許可を付与するユーザーおよびグループを指定できます。**[許可]** 条件および **[拒否]** 条件の除外を指定することもできます。

![\[EMRFS S3 ポリシーのユーザー/グループのアクセス許可を表示する Ranger 管理。\]](http://docs.aws.amazon.com/ja_jp/emr/latest/ManagementGuide/images/ranger-permissions-EMRFS.png)


**注記**  
各ポリシーには最大 3 つのリソースを使用できます。3 つを超えるリソースを追加した場合、このポリシーを EMR クラスターで使用すると、エラーが発生することがあります。3 つを超えるポリシーを追加すると、ポリシーの制限に関するリマインダーが表示されます。

## EMRFS S3 ポリシーの使用に関する注意事項
<a name="emr-ranger-emrfs-considerations"></a>

Apache Ranger で S3 ポリシーを作成する際には、いくつかの使用上の考慮事項があります。

### 複数の S3 オブジェクトへのアクセス許可
<a name="emr-ranger-emrfs-considerations-s3objects"></a>

再帰ポリシーとワイルドカード式を使用して、共通のプレフィックスを持つ複数の S3 オブジェクトに対するアクセス許可を付与できます。再帰ポリシーは、共通のプレフィックスを持つすべてのオブジェクトに対するアクセス許可を付与します。ワイルドカード式では、複数のプレフィクスが選択されます。これらを組み合わせて、次の例に示されているように、複数の共通のプレフィックスを持つすべてのオブジェクトに対するアクセス許可を付与します。

**Example 再帰ポリシーを使用する**  
以下のように整理された S3 バケット内のすべての parquet ファイルをリストするためのアクセス許可が必要であるものとします。  

```
s3://sales-reports/americas/
    +- year=2000
    |      +- data-q1.parquet
    |      +- data-q2.parquet
    +- year=2019
    |      +- data-q1.json
    |      +- data-q2.json
    |      +- data-q3.json
    |      +- data-q4.json
    |
    +- year=2020
    |      +- data-q1.parquet
    |      +- data-q2.parquet
    |      +- data-q3.parquet
    |      +- data-q4.parquet
    |      +- annual-summary.parquet    
    +- year=2021
```
まず、プレフィックス `s3://sales-reports/americas/year=2000` の付いた parquet ファイルについて考えます。次の 2 つの方法で、それらのすべてに対する GetObject アクセス許可を付与できます。  
**非再帰ポリシーを使用する**: 1 つのオプションとして、2 つの別々の非再帰ポリシー (1 つはディレクトリ用、もう 1 つはファイル用) を使用できます。  
最初のポリシーでは、プレフィックス `s3://sales-reports/americas/year=2020` (末尾に `/` はありません) に対するアクセス許可を付与します。  

```
- S3 resource = "sales-reports/americas/year=2000"
- permission = "GetObject"
- user = "analyst"
```
2 番目のポリシーでは、ワイルドカード式を使用して、プレフィックス `sales-reports/americas/year=2020/` (末尾の `/` に注意) を持つすべてのファイルに対するアクセス許可を付与します。  

```
- S3 resource = "sales-reports/americas/year=2020/*"
- permission = "GetObject"
- user = "analyst"
```
**再帰ポリシーを使用する**: より便利な代替方法として、単一の再帰ポリシーを使用し、プレフィックスに再帰的なアクセス許可を付与できます。  

```
 - S3 resource = "sales-reports/americas/year=2020"
 - permission = "GetObject"
 - user = "analyst"
 - is recursive = "True"
```
これまでのところ、プレフィックス `s3://sales-reports/americas/year=2000` の付いた parquet ファイルのみが含まれています。ここで、次のようにワイルドカード式を導入することで、別のプレフィックス `s3://sales-reports/americas/year=2020` が付いた parquet ファイルも同じ再帰ポリシーに含めることができます。  

```
 - S3 resource = "sales-reports/americas/year=20?0"
 - permission = "GetObject"
 - user = "analyst"
 - is recursive = "True"
```

### PutObject および DeleteObject アクセス許可のポリシー
<a name="emr-ranger-emrfs-considerations-putobject"></a>

EMRFS 上のファイルへの `PutObject` および `DeleteObject` アクセス許可のポリシーを作成する際には、特別な注意が必要です。GetObject アクセス許可とは異なり、プレフィックスに追加の再帰的なアクセス許可を付与する必要があるからです。

**Example PutObject および DeleteObject アクセス許可のポリシー**  
例えば、ファイル `annual-summary.parquet` を削除するために必要となるのは、実際のファイルに対する DeleteObject アクセス許可だけではありません。  

```
- S3 resource = "sales-reports/americas/year=2020/annual-summary.parquet"
- permission = "DeleteObject"
- user = "analyst"
```
プレフィックスに対する再帰的な `GetObject` および `PutObject` アクセス許可を付与するポリシーも必要になります。  
同様に、ファイル `annual-summary.parquet` を修正するために必要となるのも、実際のファイルに対する `PutObject` アクセス許可だけではありません。  

```
- S3 resource = "sales-reports/americas/year=2020/annual-summary.parquet"
- permission = "PutObject"
- user = "analyst"
```
プレフィックスに対する再帰的な `GetObject` アクセス許可を付与するポリシーも必要になります。  

```
- S3 resource = "sales-reports/americas/year=2020"
- permission = "GetObject"
- user = "analyst"
- is recursive = "True"
```

### ポリシー内のワイルドカード
<a name="emr-ranger-emrfs-considerations-wildcards"></a>

ワイルドカードを指定できる領域は 2 つあります。S3 リソースを指定するときには、「\$1」と「?」を使用できます。「\$1」は S3 パスに対するマッチングを提供し、プレフィクスの後のすべてのものに一致します。ポリシーの例を次に示します。

```
S3 resource = "sales-reports/americas/*"
```

これは次の S3 パスと一致します。

```
sales-reports/americas/year=2020/
sales-reports/americas/year=2019/
sales-reports/americas/year=2019/month=12/day=1/afile.parquet 
sales-reports/americas/year=2018/month=6/day=1/afile.parquet 
sales-reports/americas/year=2017/afile.parquet
```

ワイルドカード「?」は、1 文字にのみ一致します。ポリシーの例を次に示します。

```
S3 resource = "sales-reports/americas/year=201?/"
```

これは次の S3 パスと一致します。

```
sales-reports/americas/year=2019/
sales-reports/americas/year=2018/
sales-reports/americas/year=2017/
```

### ユーザー内のワイルドカード
<a name="emr-ranger-emrfs-considerations-wildcards-in-users"></a>

ユーザーにアクセス権を提供するためにユーザーを割り当てるときには、2 つの組み込みのワイルドカードを使用できます。1 つ目は、すべてのユーザーにアクセス権を提供する「\$1USER\$1」ワイルドカードです。2 番目のワイルドカードは「\$1OWNER\$1」です。これは、特定のオブジェクトまたはディレクトリの所有者にアクセス権を提供します。ただし、「\$1USER\$1」ワイルドカードは現在サポートされていません。

## 制限事項
<a name="emr-ranger-emrfs-limitations"></a>

EMRFS S3 プラグインの現在の制限事項は次のとおりです。
+ Apache Ranger ポリシーには、最大 3 つのポリシーを設定できます。
+ S3 へのアクセスは EMRFS 経由で行う必要があり、Hadoop 関連のアプリケーションで使用できます。以下はサポートされていません。

  - Boto3 ライブラリ

  - AWS SDK および AWK CLI

  - S3A オープンソースコネクタ
+ Apache Ranger 拒否ポリシーはサポートされていません。
+ CSE-KMS 暗号化を持つキーを使用した S3 でのオペレーションは、現在サポートされていません。
+ クロスリージョンサポートはサポートされていません。
+ Apache Ranger のセキュリティゾーン機能はサポートされていません。セキュリティゾーン機能を使用して定義されたアクセスコントロールの制限は、Amazon EMR クラスターには適用されません。
+ Hadoop は常に EC2 インスタンスプロファイルにアクセスするため、Hadoop ユーザーは監査イベントを生成しません。
+ Amazon EMR 整合性ビューを無効にすることをお勧めします。S3 は強固な整合性を備えているため、これは不要です。詳細については、「[Amazon S3 strong consistency](https://aws.amazon.com/s3/consistency/)」を参照してください。
+ EMRFS S3 プラグインは多数の STS 呼び出しを行います。開発アカウントで負荷テストを行い、STS 呼び出しボリュームをモニタリングすることをお勧めします。また、AssumeRole サービスの制限を引き上げる STS リクエストを行うことをお勧めします。
+ Ranger 管理サーバーはオートコンプリートをサポートしていません。

# Ranger と Amazon EMR の統合用の Trino プラグイン
<a name="emr-ranger-trino"></a>

Trino (旧称 PrestoSQL) は、HDFS、オブジェクトストレージ、リレーショナルデータベース、NoSQL データベースなどのデータソースでクエリを実行するために使用できる SQL クエリエンジンです。これにより、データを一元的な場所に移行する必要がなくなり、データがどこに置かれていてもクエリすることができます。Amazon EMR には、Trino のきめ細かなアクセスコントロールを提供できる Apache Ranger プラグインが備わっています。このプラグインはオープンソースの Apache Ranger 管理サーバーバージョン 2.0 以降と互換性があります。

**Topics**
+ [サポートされている機能](#emr-ranger-trino-features)
+ [サービス設定のインストール](#emr-ranger-trino-service-config)
+ [Trino ポリシーの作成](#emr-ranger-trino-create-policies)
+ [考慮事項](#emr-ranger-trino-considerations)
+ [制限事項](#emr-ranger-trino-limitations)

## サポートされている機能
<a name="emr-ranger-trino-features"></a>

Amazon EMR 上の Trino 用の Apache Ranger プラグインは、きめ細かいアクセスコントロールによって保護されている Trino クエリエンジンのすべての機能をサポートしています。これには、データベース、テーブル、列レベルのアクセスコントロール、行フィルタリング、データマスキングが含まれます。Apache Ranger ポリシーには、ユーザーおよびグループへの付与ポリシーと拒否ポリシーを含めることができます。監査イベントも CloudWatch Logs に送信されます。

## サービス設定のインストール
<a name="emr-ranger-trino-service-config"></a>

Trino サービス定義をインストールするには、Ranger 管理サーバーを設定する必要があります。Ranger 管理サーバーを設定するには、「[Amazon EMR と統合するように Ranger 管理サーバーを設定する](emr-ranger-admin.md)」を参照してください。

Trino サービス定義をインストールするには、次のステップを実行します。

1. Apache Ranger 管理サーバーに SSH 接続します。

   ```
   ssh ec2-user@ip-xxx-xxx-xxx-xxx.ec2.internal
   ```

   

1. Presto サーバープラグインをアンインストールします (存在する場合)。以下のコマンドを実行してください。[サービスが見つかりません] エラーが表示される場合は、Presto サーバープラグインがサーバーにインストールされていないことを意味します。次のステップに進みます。

   ```
   curl -f -u *<admin users login>*:*_<_**_password_ **_for_** _ranger admin user_**_>_* -X DELETE -k 'https://*<RANGER SERVER ADDRESS>*:6182/service/public/v2/api/servicedef/name/presto'
   ```

1. サービス定義および Apache Ranger 管理サーバープラグインをダウンロードします。一時ディレクトリに、サービス定義をダウンロードします。このサービス定義は Ranger 2.x バージョンでサポートされています。

   ```
   wget https://s3.amazonaws.com/elasticmapreduce/ranger/service-definitions/version-2.0/ranger-servicedef-amazon-emr-trino.json
   ```

1. Amazon EMR の Apache Trino サービス定義を登録します。

   ```
   curl -u *<admin users login>*:*_<_**_password_ **_for_** _ranger admin user_**_>_* -X POST -d @ranger-servicedef-amazon-emr-trino.json \
   -H "Accept: application/json" \
   -H "Content-Type: application/json" \
   -k 'https://*<RANGER SERVER ADDRESS>*:6182/service/public/v2/api/servicedef'
   ```

   このコマンドが正常に実行されると、次の図に示すように、Ranger 管理 UI に `TRINO` という新しいサービスが表示されます。  
![\[Ranger 管理のサービス作成。\]](http://docs.aws.amazon.com/ja_jp/emr/latest/ManagementGuide/images/ranger-create-service-trino.png)

1. 次の情報を入力して、`TRINO` アプリケーションのインスタンスを作成します。

   **サービス名**: 使用するサービス名。推奨値は `amazonemrtrino` です。このサービス名をメモしておいてください。Amazon EMR セキュリティ設定を作成するときに必要になります。

   **[Display Name]** (表示名): このインスタンスに表示される名前。推奨値は `amazonemrtrino` です。  
![\[Ranger 管理の表示名。\]](http://docs.aws.amazon.com/ja_jp/emr/latest/ManagementGuide/images/ranger-display-name-trino.png)

   **jdbc.driver.ClassName**: Trino 接続用の JDBC クラスのクラス名。デフォルト値を使用できます。

   **jdbc.url**: Trino コーディネーターへの接続時に使用する JDBC 接続文字列。

   **[Common Name For Certificate]** (証明書の共通名): クライアントプラグインから管理サーバーに接続するために使用する証明書内の CN フィールド。この値は、プラグイン用に作成された TLS 証明書の CN フィールドと一致する必要があります。  
![\[Ranger 管理の共通名。\]](http://docs.aws.amazon.com/ja_jp/emr/latest/ManagementGuide/images/ranger-common-name-trino.png)

   このプラグインの TLS 証明書は、Ranger 管理サーバーのトラストストアに登録されている必要があるので注意してください。詳細については、「[TLS 証明書](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-ranger-admin-tls.html)」を参照してください。

## Trino ポリシーの作成
<a name="emr-ranger-trino-create-policies"></a>

新しいポリシーを作成する際は、次のフィールドに入力します。

**[Policy Name]** (ポリシー名): このポリシーの名前。

**[Policy Label]** (ポリシーラベル): このポリシーにつけることができるラベル。

**カタログ**: このポリシーが適用されるカタログ。ワイルドカード「\$1」はすべてのカタログを表します。

**スキーマ**: このポリシーが適用されるスキーマ。ワイルドカード「\$1」はすべてのスキーマを表します。

**[Table]** (テーブル): このポリシーが適用されるテーブル。ワイルドカード「\$1」はすべてのテーブルを表します。

**列**: このポリシーが適用される列。ワイルドカード「\$1」はすべての列を表します。

**[Description]** (説明): このポリシーの説明。

**Trino ユーザー** (ユーザー偽装アクセス用)、**Trino システム/セッションプロパティ** (エンジンシステムまたはセッションプロパティの変更用)、**関数/プロシージャ** (関数またはプロシージャの呼び出しの許可用)、**URL** (データロケーション上のエンジンへの読み取り/書き込みアクセスの許可用) には、他のタイプのポリシーが存在します。

![\[Ranger 管理のポリシーの作成の詳細。\]](http://docs.aws.amazon.com/ja_jp/emr/latest/ManagementGuide/images/ranger-create-policy-details-trino.png)


特定のユーザーとグループにアクセス許可を付与するには、ユーザーおよびグループを入力します。**[許可]** 条件および **[拒否]** 条件の除外を指定することもできます。

![\[Ranger 管理のポリシーの詳細の許可/拒否条件。\]](http://docs.aws.amazon.com/ja_jp/emr/latest/ManagementGuide/images/ranger-create-policy-allow-conditions-trino.png)


許可条件と拒否条件を指定したら、**[保存]** を選択します。

## 考慮事項
<a name="emr-ranger-trino-considerations"></a>

Apache Ranger で Trino ポリシーを作成する際には、注意すべきいくつかの使用上の考慮事項があります。

**Hive メタデータサーバー**

Hive メタデータサーバーには、不正アクセスから保護するために、信頼されたエンジン (具体的には Trino エンジン) からしかアクセスできません。また、Hive メタデータサーバーには、クラスター上のすべてのノードからもアクセスできます。ポート 9083 は必須で、メインノードへのすべてのノードアクセスを提供します。

**認証**

デフォルトでは、Trino は Amazon EMR セキュリティ設定で設定された Kerberos を使用して認証するように設定されています。

**転送時の暗号化が必要**

Trino プラグインを使用するには、Amazon EMR セキュリティ設定で転送時の暗号化が有効になっている必要があります。暗号化を有効にするには、「[転送中の暗号化](emr-data-encryption-options.md#emr-encryption-intransit)」を参照してください。

## 制限事項
<a name="emr-ranger-trino-limitations"></a>

現在、Trino プラグインには以下の制限事項があります。
+ Ranger 管理サーバーはオートコンプリートをサポートしていません。