使用服务账户的 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 命令的示例。您可以按地区 AWS 区域 从 Amazon ECR 注册账户中找到相应的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 角色创建信任策略文件。下面的示例允许命名空间内的所有服务账户使用该角色。为此,请将 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