Amazon EMR on EKS で Lake Formation を有効にする - Amazon EMR

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

Amazon EMR on EKS で Lake Formation を有効にする

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

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

ステップ 1: Lake Formation ベースの列、行、またはセルレベルのアクセス許可を設定する

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

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

アプリケーション統合設定

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

ステップ 2: EKS RBAC アクセス許可を設定する

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

Amazon EMR on EKS サービスに EKS クラスターのアクセス許可を付与する

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"] ---
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 サービスへの名前空間アクセスを提供する

2 つの Kubernetes 名前空間を作成します。1 つはユーザードライバーとエグゼキュター用、もう 1 つはシステムドライバーとエグゼキュター用で、Amazon EMR on EKS サービスアクセスを有効にしてユーザーとシステムの名前空間の両方でジョブを送信します。既存のガイドに従って、 を使用してクラスターアクセスを有効にする aws-authで利用可能な各名前空間へのアクセスを提供します。

ステップ 3: ユーザーおよびシステムプロファイルコンポーネントの IAM ロールを設定する

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

クエリエンジンロールを設定する

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

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AssumeJobRoleWithSessionTagAccessForSystemDriver", "Effect": "Allow", "Action": [ "sts:AssumeRole", "sts:TagSession" ], "Resource": "arn:aws:iam::Account:role/JobExecutionRole", "Condition": { "StringLike": { "aws:RequestTag/LakeFormationAuthorizedCaller": "EMR on EKS Engine" } } }, { "Sid": "AssumeJobRoleWithSessionTagAccessForSystemExecutor", "Effect": "Allow", "Action": [ "sts:AssumeRole" ], "Resource": "arn:aws:iam::Account: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

詳細については、「ロールの信頼ポリシーの更新」を参照してください。

ジョブ実行ロールを設定する

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

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

{ "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 信頼ポリシー:

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

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

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

詳細については、「ジョブ実行ロールの信頼ポリシーを更新する」を参照してください。

ステップ 4: セキュリティ設定をセットアップする

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 を承認できることを確認します。の値を Lake Formation で設定された値に設定しますステップ 1: Lake Formation ベースの列、行、またはセルレベルのアクセス許可を設定する

ステップ 5: 仮想クラスターを作成する

セキュリティ設定を使用して 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 が渡されていることを確認します。詳細については、「Amazon EMR に Amazon EKS クラスターを登録する」を参照してください。

ステップ 6: FGAC 対応 VirtualCluster でジョブを送信する

ジョブ送信プロセスは、Lake Formation 以外のジョブと Lake Formation ジョブの両方で同じです。詳細については、「 でジョブ実行を送信するStartJobRun」を参照してください。

システムドライバーの Spark ドライバー、エグゼキュター、イベントログは、デバッグのために AWS サービスアカウントの S3 バケットに保存されます。ジョブ実行でカスタマー管理の KMS キーを設定して、 AWS サービスバケットに保存されているすべてのログを暗号化することをお勧めします。ログ暗号化の有効化の詳細については、「EKS ログでの Amazon EMR の暗号化」を参照してください。