

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

# Amazon EMR on EKS での Lake Formation の有効化
<a name="security_iam_fgac-lf-enable"></a>

Amazon EMR リリース 7.7 以降では、 AWS Lake Formation を活用して、Amazon S3 がサポートする Data Catalog テーブルにきめ細かなアクセスコントロールを適用できます。この機能を使用することにより、Amazon EMR on EKS Spark ジョブ内の読み取りクエリのテーブル、行、列、セルレベルのアクセスコントロールを設定できます。

このセクションでは、セキュリティ設定を作成し、Amazon EMR と連携するように Lake Formation を設定する方法について説明します。Lake Formation 用に作成したセキュリティ設定を使用してクラスターを作成する方法についても説明します。これらのセクションは順番に完了することを目的としています。

## ステップ 1: Lake Formation ベースの列、行、セルレベルのアクセス許可を設定する
<a name="security_iam_fgac-lf-enable-permissions"></a>

まず、Lake Formation で行レベルおよび列レベルのアクセス許可を適用するには、データレイク管理者が **LakeFormationAuthorizedCaller** セッションタグを設定します。Lake Formation は、このセッションタグを使用して発信者を承認し、データレイクへのアクセス権限を付与します。

 AWS Lake Formation コンソールに移動し、サイドバー**の管理**セクションから**アプリケーション統合設定**オプションを選択します。その後、**[外部エンジンが、Lake Formation に登録された Amazon S3 ロケーション内のデータをフィルタリングすることを許可する]** チェックボックスをオンにします。Spark ジョブが実行されているであろう **AWS アカウント ID** と**セッションタグの値**を追加します。

![\[アプリケーション統合設定\]](http://docs.aws.amazon.com/ja_jp/emr/latest/EMR-on-EKS-DevelopmentGuide/images/application_integration_settings_fgac.png)


ここで渡された **LakeFormationAuthorizedCalle** セッションタグは、後ほどセクション 3 で IAM ロールを設定するときに **SecurityConfiguration** に渡されることに注意してください。

## ステップ 2: EKS RBAC アクセス許可を設定する
<a name="security_iam_fgac-lf-enable-rbac"></a>

次に、ロールベースのアクセスコントロールのアクセス許可を設定します。

### Amazon EMR on EKS サービスに EKS クラスターのアクセス許可を付与する
<a name="security_iam_fgac-lf-enable-rbac-cluster"></a>

Amazon EMR on EKS Service には EKS クラスターロールのアクセス許可が必要です。これにより、システムドライバーがユーザー名前空間のユーザーエグゼキュターをスピンオフするためのクロス名前空間アクセス許可を作成できます。

**クラスターのロールの作成**

このサンプルでは、リソースのコレクションに対するアクセス許可を定義します。

```
vim emr-containers-cluster-role.yaml
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: emr-containers
rules:
  - apiGroups: [""]
    resources: ["namespaces"]
    verbs: ["get"]
  - apiGroups: [""]
    resources: ["serviceaccounts", "services", "configmaps", "events", "pods", "pods/log"]
    verbs: ["get", "list", "watch", "describe", "create", "edit", "delete", "deletecollection", "annotate", "patch", "label"]
  - apiGroups: [""]
    resources: ["secrets"]
    verbs: ["create", "patch", "delete", "watch"]
  - apiGroups: ["apps"]
    resources: ["statefulsets", "deployments"]
    verbs: ["get", "list", "watch", "describe", "create", "edit", "delete", "annotate", "patch", "label"]
  - apiGroups: ["batch"]
    resources: ["jobs"]
    verbs: ["get", "list", "watch", "describe", "create", "edit", "delete", "annotate", "patch", "label"]
  - apiGroups: ["extensions", "networking.k8s.io"]
    resources: ["ingresses"]
    verbs: ["get", "list", "watch", "describe", "create", "edit", "delete", "annotate", "patch", "label"]
  - apiGroups: ["rbac.authorization.k8s.io"]
    resources: ["clusterroles","clusterrolebindings","roles", "rolebindings"]
    verbs: ["get", "list", "watch", "describe", "create", "edit", "delete", "deletecollection", "annotate", "patch", "label"]
  - apiGroups: [""]
    resources: ["persistentvolumeclaims"]
    verbs: ["get", "list", "watch", "describe", "create", "edit", "delete",  "deletecollection", "annotate", "patch", "label"]
  - apiGroups: ["kyverno.io"]
    resources: ["clusterpolicies"]
    verbs: ["create", "delete"]
---
```

```
kubectl apply -f emr-containers-cluster-role.yaml
```

**クラスターロールバインディングの作成**

```
vim emr-containers-cluster-role-binding.yaml
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: emr-containers
subjects:
- kind: User
  name: emr-containers
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: ClusterRole
  name: emr-containers
  apiGroup: rbac.authorization.k8s.io
---
```

```
kubectl apply -f emr-containers-cluster-role-binding.yaml
```

### Amazon EMR on EKS サービスへの名前空間アクセスを提供する
<a name="security_iam_fgac-lf-enable-rbac-cluster"></a>

2 つの Kubernetes 名前空間を作成します。1 つは User ドライバーとエグゼキュター用、もう 1 つは System ドライバーとエグゼキュター用で、Amazon EMR on EKS サービスアクセスを有効にして User と System の名前空間の両方でジョブを送信します。既存のガイドに従って、 「[`aws-auth` を使用してクラスターアクセスを有効にする](https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/setting-up-cluster-access.html#setting-up-cluster-access-aws-auth)」で利用可能な各名前空間へのアクセスを提供します。

## ステップ 3: ユーザーおよびシステムプロファイルコンポーネントの IAM ロールを設定する
<a name="security_iam_fgac-lf-system-profile-configure"></a>

3 つ目は、特定のコンポーネントのロールを設定することです。Lake Formation 対応の Spark ジョブには、ユーザーとシステムの 2 つのコンポーネントがあります。ユーザードライバーとエグゼキュターは User 名前空間で実行され、StartJobRun API で渡される JobExecutionRole に関連付けられます。システムドライバーとエグゼキュターはシステム名前空間で実行され、**QueryEngine** ロールに関連付けられます。

### クエリエンジンロールを設定する
<a name="security_iam_fgac-lf-system-profile-configure-query"></a>

QueryEngine ロールはシステムスペースコンポーネントに関連付けられており、**LakeFormationAuthorizedCaller** セッションタグを持つ **JobExecutionRole** を引き受けるアクセス許可を持ちます。クエリエンジンロールの IAM アクセス許可ポリシーは以下のとおりです:

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "AssumeJobRoleWithSessionTagAccessForSystemDriver",
      "Effect": "Allow",
      "Action": [
        "sts:AssumeRole",
        "sts:TagSession"
      ],
      "Resource": [
        "arn:aws:iam::*:role/JobExecutionRole"
      ],
      "Condition": {
        "StringLike": {
          "aws:RequestTag/LakeFormationAuthorizedCaller": "EMR on EKS Engine"
        }
      }
    },
    {
      "Sid": "AssumeJobRoleWithSessionTagAccessForSystemExecutor",
      "Effect": "Allow",
      "Action": [
        "sts:AssumeRole"
      ],
      "Resource": [
        "arn:aws:iam::*:role/JobExecutionRole"
      ]
    },
    {
      "Sid": "CreateCertificateAccessForTLS",
      "Effect": "Allow",
      "Action": [
        "emr-containers:CreateCertificate"
      ],
      "Resource": [
        "*"
      ]
    }
  ]
}
```

------

クエリエンジンロールの信頼ポリシーを設定して、Kubernetes System 名前空間を信頼します。

```
aws emr-containers update-role-trust-policy \ 
    --cluster-name eks cluster \ 
    --namespace eks system namespace \ 
    --role-name query_engine_iam_role_name
```

詳細については、「[ロール信頼ポリシーの更新](https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/setting-up-trust-policy.html)」を参照してください。

### ジョブ実行ロールを設定する
<a name="security_iam_fgac-lf-system-profile-job"></a>

Lake Formation のアクセス許可は、Glue Data Catalog AWS リソース、Amazon S3 ロケーション、およびそれらのロケーションの基盤となるデータへのアクセスを制御します。IAM アクセス許可は、Lake Formation および AWS Glue APIs とリソースへのアクセスを制御します。データカタログ内のテーブルにアクセスするための Lake Formation アクセス許可 (SELECT) を持っていても、`glue:Get*` API オペレーションに対する IAM アクセス許可がない場合、操作は失敗します。

**JobExecutionRole** の IAM アクセス許可ポリシー: **JobExecution** ロールには、アクセス許可ポリシーにポリシーステートメントが必要です。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "GlueCatalogAccess",
      "Effect": "Allow",
      "Action": [
        "glue:Get*",
        "glue:Create*",
        "glue:Update*"
      ],
      "Resource": [
        "*"
      ]
    },
    {
      "Sid": "LakeFormationAccess",
      "Effect": "Allow",
      "Action": [
        "lakeformation:GetDataAccess"
      ],
      "Resource": [
        "*"
      ]
    },
    {
      "Sid": "CreateCertificateAccessForTLS",
      "Effect": "Allow",
      "Action": [
        "emr-containers:CreateCertificate"
      ],
      "Resource": [
        "*"
      ]
    }
  ]
}
```

------

**JobExecutionRole** の IAM 信頼ポリシー:

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "TrustQueryEngineRoleForSystemDriver",
      "Effect": "Allow",
      "Action": [
        "sts:AssumeRole",
        "sts:TagSession"
      ],
      "Resource": [
        "arn:aws:iam::*:role/QueryExecutionRole"
      ],
      "Condition": {
        "StringLike": {
          "aws:RequestTag/LakeFormationAuthorizedCaller": "EMR on EKS Engine"
        }
      }
    },
    {
      "Sid": "TrustQueryEngineRoleForSystemExecutor",
      "Effect": "Allow",
      "Action": [
        "sts:AssumeRole"
      ],
      "Resource": [
        "arn:aws:iam::*:role/QueryEngineRole"
      ]
    }
  ]
}
```

------

Kubernetes ユーザー名前空間を信頼するようにジョブ実行ロールの信頼ポリシーを設定します:

```
aws emr-containers update-role-trust-policy \ 
    --cluster-name eks cluster \ 
    --namespace eks User namespace \ 
    --role-name job_execution_role_name
```

詳細については、「[Update the trust policy of the job execution role](https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/setting-up-trust-policy.html)」を参照してください。

## ステップ 4: セキュリティ設定をセットアップする
<a name="security_iam_fgac-lf-security-config"></a>

Lake Formation 対応ジョブを実行するには、セキュリティ設定を作成しなければなりません。

```
aws emr-containers create-security-configuration \
    --name 'security-configuration-name' \
    --security-configuration '{
        "authorizationConfiguration": {
            "lakeFormationConfiguration": {
                "authorizedSessionTagValue": "SessionTag configured in LakeFormation",
                "secureNamespaceInfo": {
                    "clusterId": "eks-cluster-name",
                    "namespace": "system-namespace-name"
                },
                "queryEngineRoleArn": "query-engine-IAM-role-ARN"
            }
        }
    }'
```

**authorizedSessionTagValue** フィールドに渡されたセッションタグが Lake Formation を認可できることを確認します。[ステップ 1: Lake Formation ベースの列、行、セルレベルのアクセス許可を設定する](#security_iam_fgac-lf-enable-permissions) の値を Lake Formation で設定された値に設定します。

## ステップ 5: 仮想クラスターを作成する
<a name="security_iam_fgac-lf-virtual-cluster"></a>

セキュリティ設定を使用して Amazon EMR on EKS 仮想クラスターを作成します。

```
aws emr-containers create-virtual-cluster \
--name my-lf-enabled-vc \
--container-provider '{
    "id": "eks-cluster",
    "type": "EKS",
    "info": {
        "eksInfo": {
            "namespace": "user-namespace"
        }
    }
}' \
--security-configuration-id SecurityConfiguraionId
```

Lake Formation 認可設定が仮想クラスターで実行されているすべてのジョブに適用されるように、前のステップの **SecurityConfiguration** ID が渡されていることを確認します。詳細については、「[Register the Amazon EKS cluster with Amazon EMR]()」を参照してください。

## ステップ 6: FGAC 対応 VirtualCluster でジョブを送信する
<a name="security_iam_fgac-enabled-cluster"></a>

ジョブ送信プロセスは、Lake Formation 以外のジョブでも Lake Formation ジョブでも同じです。詳細については、「[Submit a job run `StartJobRun`](https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/emr-eks-jobs-submit.html)」を参照してください。

システムドライバーの Spark ドライバー、エグゼキュター、イベントログは、デバッグのために AWS サービスアカウントの S3 バケットに保存されます。ジョブ実行でカスタマー管理の KMS キーを設定して、 AWS サービスバケットに保存されているすべてのログを暗号化することをお勧めします。ログ暗号化の有効化の詳細については、[「Encrypting Amazon EMR on EKS logs](https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/security_iam_fgac-logging-kms.html)」を参照してください。