使用 IAM 角色为服务账户设置访问权限 (IRSA) - Amazon EMR
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

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

默认情况下,Livy 服务器和 Spark 应用程序的驱动程序和执行器无权访问 Amazon 资源。服务器服务帐户和 spark 服务帐户控制 Livy 服务器和 Spark 应用程序的 pod 对 Amazon 资源的访问权限。要授予访问权限,您需要将服务账户映射到具有必要 Amazon 权限的 IAM 角色。

您可以在安装 Apache Livy 之前、安装期间或完成安装之后设置 IRSA 映射。

在安装 Apache Livy 时设置 IRSA(适用于服务器服务帐户)

注意

只有服务器服务帐户支持此映射。

  1. 确保你已经完成了在 EKS 上为亚马逊 EMR 设置 Apache Livy,并且正在在 EKS 上安装带有亚马逊 EMR 的 Apache Livy

  2. 为 Livy 服务器创建一个 Kubernetes 命名空间。在此示例中,命名空间的名称为livy-ns

  3. 创建一个 IAM 策略,其中包含您希望 Pod 访问的权限。 Amazon Web Services 以下示例创建了一个 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. 使用以下命令将您的 Amazon Web Services 账户 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. 使用以下命令创建信任策略文件。如果要向命名空间中的所有服务帐号授予该角色的访问权限,请复制以下命令,然后替换为StringLikeStringEquals$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 Web Services 区域 从 Amazon ECR 注册账户中找到相应的ECR-registry-account值。

    helm install livy-demo \ oci://895885662937.dkr.ecr.us-west-2.amazonaws.com/livy \ --version 7.1.0 \ --namespace livy-ns \ --set image=ECR-registry-account.dkr.ecr.region-id.amazonaws.com/livy/emr-7.1.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