使用服务账户的 IAM 角色(IRSA)设置访问权限 - Amazon EMR

使用服务账户的 IAM 角色(IRSA)设置访问权限

默认情况下,Livy 服务器和 Spark 应用程序的驱动程序和执行程序无权访问 AWS 资源。服务器服务账户和 Spark 服务账户控制对 Livy 服务器和 Spark 应用程序容器组(pod)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. 创建一个 IAM 策略,其中包含您希望容器组(pod)访问的 AWS 服务 权限。以下示例创建了一个 IAM 策略,用于获取 Spark 入口点的 Amazon S3 资源。

    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)身份提供程序设置为环境变量。

    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. 使用以下命令创建信任策略文件。如果要向命名空间内的所有服务账户授予角色访问权限,请复制以下命令,将 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
  8. 创建角色。

    aws iam create-role --role-name my-role --assume-role-policy-document file://trust-relationship.json --description "my-role-description"
  9. 使用以下 Helm install 命令设置 serviceAccount.executionRoleArn 以映射 IRSA。以下是 Helm install 命令的示例。您可以从按区域划分的 Amazon ECR 注册表账户中找到 AWS 区域 的相应 ECR-registry-account 值。

    helm install livy-demo \ oci://895885662937.dkr.ecr.us-west-2.amazonaws.com/livy \ --version 7.3.0 \ --namespace livy-ns \ --set image=ECR-registry-account.dkr.ecr.region-id.amazonaws.com/livy/emr-7.3.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 角色创建信任策略文件。下面的示例允许命名空间内的所有服务账户使用该角色。为此,请将 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
  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