サービスアカウント用 IAM ロール (IRSA、IAM roles for service accounts) でアクセス権限を設定する
デフォルトでは、Livy サーバーと Spark アプリケーションのドライバーとエグゼキュターは AWS リソースにアクセスできません。サーバーのサービスアカウントと Spark のサービスアカウントは、Livy サーバーの AWS リソースへのアクセスを制御し、アプリケーションのポッドをスパークします。アクセス権を付与するには、サービスアカウントを必要な AWS アクセス権限を持つ IAM ロールにマッピングする必要があります。
Apache Livy のインストール前、インストール中、インストール終了後のいずれにおいても IRSA マッピングを設定できます。
Apache Livy インストール中の IRSA の設定 (サーバーのサービスアカウント用)
注記
このマッピングは、サーバーのサービスアカウントでのみサポートされています。
-
Amazon EMR on EKS の Apache Livy の設定が終了し、Amazon EMR on EKS による Apache Livy のインストールの途中であることを確認します。
-
Livy サーバー用に、Kubernetes 名前空間を作成します。この例では、名前空間の名前は
livy-nsです。 -
ポッドにアクセスさせる AWS のサービスの権限を含む IAM ポリシーを作成します。次の例では、Spark エントリポイントの Amazon S3 リソースを取得する IAM ポリシーを作成します。
cat >my-policy.json<<EOF{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::my-spark-entrypoint-bucket" } ] } EOF aws iam create-policy --policy-namemy-policy--policy-document file://my-policy.json -
次のコマンドを使用して、AWS アカウント ID を変数に設定します。
account_id=$(aws sts get-caller-identity --query "Account" --output text) -
クラスターの OpenID Connect (OIDC) ID プロバイダーを環境変数に設定します。
oidc_provider=$(aws eks describe-cluster --namemy-cluster--region $AWS_REGION --query "cluster.identity.oidc.issuer" --output text | sed -e "s/^https:\/\///") -
サービスアカウントの名前空間と名前の変数を設定します。必ず独自の値を使用してください。
export namespace=default export service_account=my-service-account -
次のコマンドを使用して信頼ポリシーファイルを作成します。名前空間内のすべてのサービスアカウントにロールへのアクセス権を付与する場合は、次のコマンドをコピーして、
StringEqualsをStringLikeに、$service_accountを*に置き換えます。cat >trust-relationship.json <<EOF { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "arn:aws:iam::$account_id:oidc-provider/$oidc_provider" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "$oidc_provider:aud": "sts.amazonaws.com", "$oidc_provider:sub": "system:serviceaccount:$namespace:$service_account" } } } ] } EOF -
ロールを作成します。
aws iam create-role --role-namemy-role--assume-role-policy-document file://trust-relationship.json --description "my-role-description" -
次の Helm インストールコマンドを使用して、
serviceAccount.executionRoleArnを IRSA をマッピングするように設定します。Helm インストールコマンドの例を次に示します。リージョン別の Amazon ECR レジストリアカウントから AWS リージョンに対応するECR-registry-account値を確認できます。helm install livy-demo \ oci://895885662937.dkr.ecr.us-west-2.amazonaws.com/livy \ --version 7.10.0 \ --namespacelivy-ns\ --set image=ECR-registry-account.dkr.ecr.region-id.amazonaws.com/livy/emr-7.10.0:latest \ --set sparkNamespace=spark-ns\ --set serviceAccount.executionRoleArn=arn:aws:iam::123456789012:role/my-role
IRSA の Spark サービスアカウントへのマッピング
IRSA を Spark サービスアカウントにマッピングする前に、次の項目が完了していることを確認してください。
-
Amazon EMR on EKS の Apache Livy の設定が終了し、Amazon EMR on EKS による Apache Livy のインストールの途中であることを確認します。
-
クラスターの既存 IAM OpenID Connect (OIDC) プロバイダーが必要です。既にあるかどうか、または作成する方法を確認するには、「クラスターの IAM OIDC プロバイダーを作成する」を参照してください。
-
バージョン 0.171.0 以降の
eksctlCLI または AWS CloudShell がインストールされていることを確認します。eksctlをインストールまたはアップグレードするには、eksctlドキュメントの「インストール」を参照してください。
IRSA を Spark サービスアカウントにマッピングするには、次の手順に従います。
-
次のコマンドを実行して Spark サービスアカウントを取得します。
SPARK_NAMESPACE=<spark-ns>LIVY_APP_NAME=<livy-app-name>kubectl --namespace $SPARK_NAMESPACE describe sa -l "app.kubernetes.io/instance=$LIVY_APP_NAME" | awk '/^Name:/ {print $2}' -
サービスアカウントの名前空間と名前の変数を設定します。
export namespace=defaultexport service_account=my-service-account -
IAM ロール用の信頼ポリシーファイルを作成するには、次のコマンドを使用します。次の例では、名前空間内のすべてのサービスアカウントにロールを使用するアクセス権限を付与します。これを行うには、
StringEqualsをStringLikeに、$service_accountを * に置き換えます。cat >trust-relationship.json <<EOF { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "arn:aws:iam::$account_id:oidc-provider/$oidc_provider" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "$oidc_provider:aud": "sts.amazonaws.com", "$oidc_provider:sub": "system:serviceaccount:$namespace:$service_account" } } } ] } EOF -
ロールを作成します。
aws iam create-role --role-namemy-role--assume-role-policy-document file://trust-relationship.json--description "my-role-description" -
次の
eksctlコマンドを使用して、サーバーまたは Spark のサービスアカウントをマッピングします。必ず独自の値を使用してください。eksctl create iamserviceaccount --namespark-sa\ --namespace spark-namespace --clusterlivy-eks-cluster\ --attach-role-arn arn:aws:iam::0123456789012:role/my-role\ --approve --override-existing-serviceaccounts