サービスアカウント用 IAM ロール (IRSA、IAM roles for service accounts) でアクセス権限を設定する - Amazon EMR

サービスアカウント用 IAM ロール (IRSA、IAM roles for service accounts) でアクセス権限を設定する

デフォルトでは、Livy サーバーと Spark アプリケーションのドライバーとエグゼキュターは AWS リソースにアクセスできません。サーバーのサービスアカウントと Spark のサービスアカウントは、Livy サーバーの AWS リソースへのアクセスを制御し、アプリケーションのポッドをスパークします。アクセス権を付与するには、サービスアカウントを必要な AWS アクセス権限を持つ IAM ロールにマッピングする必要があります。

Apache Livy のインストール前、インストール中、インストール終了後のいずれにおいても IRSA マッピングを設定できます。

Apache Livy インストール中の IRSA の設定 (サーバーのサービスアカウント用)

注記

このマッピングは、サーバーのサービスアカウントでのみサポートされています。

  1. Amazon EMR on EKS の Apache Livy の設定が終了し、Amazon EMR on EKS による Apache Livy のインストールの途中であることを確認します。

  2. Livy サーバー用に、Kubernetes 名前空間を作成します。この例では、名前空間の名前は livy-ns です。

  3. ポッドにアクセスさせる 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-name my-policy --policy-document file://my-policy.json
  4. 次のコマンドを使用して、AWS アカウント ID を変数に設定します。

    account_id=$(aws sts get-caller-identity --query "Account" --output text)
  5. クラスターの OpenID Connect (OIDC) ID プロバイダーを環境変数に設定します。

    oidc_provider=$(aws eks describe-cluster --name my-cluster --region $AWS_REGION --query "cluster.identity.oidc.issuer" --output text | sed -e "s/^https:\/\///")
  6. サービスアカウントの名前空間と名前の変数を設定します。必ず独自の値を使用してください。

    export namespace=default export service_account=my-service-account
  7. 次のコマンドを使用して信頼ポリシーファイルを作成します。名前空間内のすべてのサービスアカウントにロールへのアクセス権を付与する場合は、次のコマンドをコピーして、StringEqualsStringLike に、$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
  8. ロールを作成します。

    aws iam create-role --role-name my-role --assume-role-policy-document file://trust-relationship.json --description "my-role-description"
  9. 次の 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 \ --namespace livy-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 サービスアカウントにマッピングする前に、次の項目が完了していることを確認してください。

IRSA を Spark サービスアカウントにマッピングするには、次の手順に従います。

  1. 次のコマンドを実行して 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}'
  2. サービスアカウントの名前空間と名前の変数を設定します。

    export namespace=default export service_account=my-service-account
  3. IAM ロール用の信頼ポリシーファイルを作成するには、次のコマンドを使用します。次の例では、名前空間内のすべてのサービスアカウントにロールを使用するアクセス権限を付与します。これを行うには、StringEqualsStringLike に、$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
  4. ロールを作成します。

    aws iam create-role --role-name my-role --assume-role-policy-document file://trust-relationship.json --description "my-role-description"
  5. 次の eksctl コマンドを使用して、サーバーまたは Spark のサービスアカウントをマッピングします。必ず独自の値を使用してください。

    eksctl create iamserviceaccount --name spark-sa \ --namespace spark-namespace --cluster livy-eks-cluster \ --attach-role-arn arn:aws:iam::0123456789012:role/my-role \ --approve --override-existing-serviceaccounts