

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

# Lake Formation でのデータフィルタリングとセルレベルのセキュリティ
<a name="data-filtering"></a>

Data Catalog テーブルに対する Lake Formation 許可を付与するときは、クエリ結果、および Lake Formation と統合されたエンジン内の特定のデータへのアクセスを制限するためのデータフィルタリング仕様を含めることができます。Lake Formation は、列レベルのセキュリティ、行レベルのセキュリティ、およびセルレベルのセキュリティを実現するために、データフィルタリングを使用します。ソースデータにネストされた構造が含まれている場合は、ネストされた列にデータフィルターを定義して適用できます。

Lake Formation のデータフィルタリング機能により、以下のレベルのデータセキュリティを実装することができます。

**列レベルのセキュリティ**  
列レベルのセキュリティ (列フィルタリング) を使用して Data Catalog テーブルに対するアクセス許可を付与すると、ユーザーはそのテーブル内でアクセスが許可されている特定の列とネストされた列のみを表示できます。大規模な多地域通信会社向けの複数のアプリケーションで使用される `persons` テーブルについて考えてみましょう。Data Catalog テーブルに対する列フィルタリングを伴う許可の付与は、人事部門に属さないユーザーによる社会保障番号や生年月日などの個人を特定できる情報 (PII) の表示を制限することができます。セキュリティポリシーを定義して、ネストされた列の一部のサブ構造のみへのアクセスを許可することもできます。

**行レベルのセキュリティ**  
Data Catalog テーブルに対する行レベルのセキュリティ (行フィルタリング) を伴う許可の付与は、ユーザーがそのテーブル内でアクセス権を持っている特定のデータの行のみを表示できるようにします。フィルタリングは、1 つ、または複数の列の値に基づいて行われます。行フィルター式を定義するときに、ネストされた列構造を含めることができます。例えば、この通信会社の異なる地域支社にそれぞれ独自の人事部門がある場合、人事部門の従業員が表示できる個人情報記録を、その地域の従業員の記録のみに制限することができます。

**セルレベルのセキュリティ**  
セルレベルのセキュリティは、柔軟性に優れた許可モデルのために、行フィルタリングと列フィルタリングを組み合わせます。テーブルの行と列をグリッドとして考えると、セルレベルのセキュリティを使用することによって、行と列の二次元上にあれば、どこでもグリッドの個々の要素 (セル) へのアクセスを制限することができます。つまり、行に応じて異なる列へのアクセスを制限することができます。これは、制限された列に色が付けられた以下の図に表されています。

![5つの 行と 6 つの列で構成されたグリッドが表示されています。行と列には、Col1、Col2、Row1、Row2 などのヘッダーがあります。R3 と C1、R3 と C2、R3 と C3、R5 と C1、R5 と C2、R5 と C5、R5 と C6 の座標のグリッドセルに色が付けられています。](http://docs.aws.amazon.com/ja_jp/lake-formation/latest/dg/images/cells-diagram.png)


個人情報テーブルの例を引き続き使用すると、国の列が「英国」に設定されている行の住所列へのアクセスを制限するが、国の列が「米国」に設定されている行の住所列へのアクセスは許可するという*データフィルター*をセルレベルで作成することができます。

フィルターは読み取り操作のみに適用されます。このため、付与できるのはフィルターを伴う `SELECT` Lake Formation 許可のみになります。

**ネストされた列のセルレベルのセキュリティ**  
Lake Formationでは、ネストされた列のセルレベルのセキュリティを使用してデータフィルターを定義して適用できます。ただし、Amazon Athena、Amazon EMR、Amazon Redshift Spectrum などの統合分析エンジンは、行レベルと列レベルのセキュリティを使用した Lake Formation マネージドのネストされたテーブルに対するクエリ実行をサポートしています。

制限事項については、「[データフィルタリングの制限事項](data-filtering-notes.md)」を参照してください。

**Topics**
+ [Lake Formation でのデータフィルター](#data-filters-about)
+ [行フィルター式での PartiQL のサポート](partiql-support.md)
+ [セルレベルのフィルタリングを使用したテーブルのクエリに必要な許可](row-filtering-prereqs.md)
+ [データフィルターの管理](managing-filters.md)

## Lake Formation でのデータフィルター
<a name="data-filters-about"></a>

*データフィルター*を作成することで、列レベル、行レベル、およびセルレベルのセキュリティを実装することができます。データフィルターは、テーブルに対する `SELECT` Lake Formation 許可を付与する時に選択します。テーブルにネストされた列構造が含まれている場合は、子列を含めるか除外するかしてデータフィルターを定義できます。また、ネストされた属性に対して行レベルのフィルター式を定義できます。



各データフィルターは、Data Catalog 内の特定のテーブルに属します。データフィルターには、以下の情報が含まれています。
+ フィルター名
+ フィルターが関連付けられたテーブルのカタログ ID
+ テーブル名
+ テーブルが含まれるデータベースの名前
+ 列の指定 – クエリ結果に含めたり、クエリ結果から除外したりする列およびネストされた列 (`struct` データ型) のリスト。
+ 行フィルター式 – クエリ結果に含める行を指定する式。制限はいくつかありますが、この式には PartiQL 言語の `WHERE` 句の構文があります。すべての行を指定するには、コンソールの **[行レベルのアクセス]** で **[すべての行へのアクセス]** を選択するか、API コールで `AllRowsWildcard` を使用します。

  行フィルター式で何がサポートされるかに関する詳細については、「[行フィルター式での PartiQL のサポート](partiql-support.md)」を参照してください。

得られるフィルターのレベルは、データフィルターの設定方法に応じて異なります。
+ 「全列」ワイルドカードを指定して、行フィルター式を提供する場合は、行レベルのセキュリティ (行フィルタリング) のみを確立することになります。
+ 特定の列およびネストされた列を含めるか除外し、全行ワイルドカードを使用して「すべての行」を指定すると、列レベルのセキュリティ (列フィルタリング) のみを設定することになります。
+ 特定の列を包含または除外するとともに、行フィルタリング式も指定するという場合は、セルレベルのセキュリティ (セルフィルタリング) を確立することになります。

Lake Formation コンソールからの以下のスクリーンショットは、セルレベルのフィルタリングを実行するデータフィルターを示しています。これは、`orders` テーブルに対するクエリについて、`customer_name` 列へのアクセスを制限し、クエリ結果は `product_type` 列に 'pharma' が含まれる行のみを返します。

![データフィルターウィンドウには、縦向きに配置された [Data filter name] (データフィルター名)、[Target database] (ターゲットデータベース)、[Target table] (ターゲットテーブル)、[Access to all columns] (すべての列にアクセス) と [Include columns] (列を含める) と [Exclude columns] (列を除外する) のオプションがあるオプションボタンのグループ、[Select columns] (列の選択) (ドロップダウンリスト)、および [Row filter expression] (行フィルター式) (複数行のテキストボックス) のフィールドが含まれています。[Exclude columns] (列を除外する) オプションが選択され、customer_name 列が除外対象として選択されて、[Row filter expression] (行フィルター式) フィールドには 'product_type='pharma' が表示されています。](http://docs.aws.amazon.com/ja_jp/lake-formation/latest/dg/images/data-filter-sample-pharma.png)


文字列リテラルを囲むための一重引用符の使用 (`'pharma'`) に注意してください。

このデータフィルターを作成するには、Lake Formation コンソールを使用するか、`CreateDataCellsFilter` API 操作に以下のリクエストオブジェクトを提供することができます。

```
{
     "Name": "restrict-pharma",
     "DatabaseName": "sales",
     "TableName": "orders",
     "TableCatalogId": "111122223333",      
     "RowFilter": {"FilterExpression": "product_type='pharma'"},
     "ColumnWildcard": {
         "ExcludedColumnNames": ["customer_name"]
     }
}
```

テーブルには、必要な数だけデータフィルターを作成できます。これには、テーブルに対する grant オプション付きの `SELECT` 許可が必要です。データレイク管理者にはデフォルトで、そのアカウント内のすべてのテーブルに対して*データフィルター*を作成するアクセス許可があります。通常、テーブルに対する許可をプリンシパルに付与するときは、使用可能なデータフィルターのサブセットのみを使用します。例えば、`orders` テーブルのために、行セキュリティのみのデータフィルターである 2 番目のデータフィルターを作成することができます。上記のスクリーンショットを参考にすると、**[Access to all columns]** (すべての列にアクセス) オプションを選択して、`product_type<>pharma` という行フィルター式を含めることができます。このデータフィルターの名前は `no-pharma` にすることができます。これは、`product_type` 列が 'pharma' に設定されているすべての行に対するアクセスを制限します。

以下は、このデータフィルターの `CreateDataCellsFilter` API 操作のリクエストオブジェクトです。

```
{
     "Name": "no-pharma",
     "DatabaseName": "sales",
     "TableName": "orders",
     "TableCatalogId": "111122223333",      
     "RowFilter": {"FilterExpression": "product_type<>'pharma'"},
     "ColumnNames": ["customer_id", "customer_name", "order_num"
          "product_id", "purchase_date", "product_type", 
          "product_manufacturer", "quantity", "price"]
}
```

その後、`orders` テーブルに対する `restrict-pharma` データフィルターを伴う `SELECT` を管理者ユーザーに、`orders` テーブルに対する `no-pharma` データフィルターを伴う `SELECT` を非管理者ユーザーに付与することができます。ヘルスケア部門のユーザーの場合は、`orders` テーブルに対するすべての行と列への完全なアクセス権を伴う (データフィルターなし) `SELECT` を付与するか、料金設定情報へのアクセスを制限する別のデータフィルターを使用するものを付与こともできます。

 データフィルター内に列レベルと行レベルのセキュリティを指定する際に、ネストされた列を含めるか除外することができます。次の例では、修飾列名 (二重引用符で囲まれた列名) を使用して `product.offer` フィールドへのアクセスを指定しています。これは、ネストされたフィールドにとって、列名に特殊文字が含まれている場合にエラーが発生するのを防ぎ、最上位の列レベルのセキュリティ定義との下位互換性を維持するために重要です。

```
{
     "Name": "example_dcf",
     "DatabaseName": "example_db",
     "TableName": "example_table",
     "TableCatalogId": "111122223333",      
     "RowFilter": { "FilterExpression": "customer.customerName <> 'John'" },
     "ColumnNames": ["customer", "\"product\".\"offer\""]
}
```

**以下も参照してください。**  
[データフィルターの管理](managing-filters.md)