

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

# 使用服务账户的 IAM 角色（IRSA）设置访问权限
<a name="job-runs-apache-livy-irsa"></a>

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

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

## 在安装 Apache Livy 过程中设置 IRSA（适用于服务器服务账户）
<a name="job-runs-apache-livy-irsa"></a>

**注意**  
只有服务器服务账户支持此映射。

1. 确保已完成[设置适用于 Amazon EMR on EKS 的 Apache Livy](https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/job-runs-apache-livy-setup.html)，并正在[使用 Amazon EMR on EKS 安装 Apache Livy](https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/job-runs-apache-livy-install.html)。

1. 为 Livy 服务器创建 Kubernetes 命名空间。在此示例中，应用程序名称为 `livy-ns`。

1. 创建一个 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
   ```

1. 使用以下命令将您的 AWS 账户 ID 设置为变量。

   ```
   account_id=$(aws sts get-caller-identity --query "Account" --output text)
   ```

1. 将集群的 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:\/\///")
   ```

1. 为服务账户的命名空间和名称设置变量。务必使用您自己的值。

   ```
   export namespace=default
   export service_account=my-service-account
   ```

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

1. 创建角色。

   ```
   aws iam create-role --role-name my-role --assume-role-policy-document file://trust-relationship.json --description "my-role-description"
   ```

1. 使用以下 Helm install 命令设置 `serviceAccount.executionRoleArn` 以映射 IRSA。以下是 Helm install 命令的示例。您可以[按地区 AWS 区域 从 Amazon ECR 注册账户](https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/docker-custom-images-tag.html#docker-custom-images-ECR)中找到相应的`ECR-registry-account`值。

   ```
   helm install livy-demo \
     oci://895885662937.dkr.ecr.us-west-2.amazonaws.com/livy \
     --version 7.12.0 \
     --namespace livy-ns \
     --set image=ECR-registry-account.dkr.ecr.region-id.amazonaws.com/livy/emr-7.12.0:latest \
     --set sparkNamespace=spark-ns \
     --set serviceAccount.executionRoleArn=arn:aws:iam::123456789012:role/my-role
   ```

## 将 IRSA 映射到 Spark 服务账户
<a name="job-runs-apache-livy-irsa-spark"></a>

将 IRSA 映射到 Spark 服务账户之前，请确保已完成以下项目：
+ 确保已完成[设置适用于 Amazon EMR on EKS 的 Apache Livy](https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/job-runs-apache-livy-setup.html)，并正在[使用 Amazon EMR on EKS 安装 Apache Livy](https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/job-runs-apache-livy-install.html)。
+ 您的集群必须具有现有的 IAM OpenID Connect（OIDC）提供程序。要查看您是否拥有提供程序或如何创建，请参阅[为集群创建 IAM OIDC 提供程序](https://docs.aws.amazon.com/eks/latest/userguide/enable-iam-roles-for-service-accounts.html)。
+ 确保您已安装 0.171.0 或更高版本的 `eksctl` CLI 或 AWS CloudShell。要安装或更新 `eksctl`，请参阅 `eksctl` 文档中的[安装](https://eksctl.io/installation/)。

按照以下步骤将 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}'
   ```

1. 为服务账户的命名空间和名称设置变量。

   ```
   export namespace=default
   export service_account=my-service-account
   ```

1. 使用以下命令为 IAM 角色创建信任策略文件。下面的示例允许命名空间内的所有服务账户使用该角色。为此，请将 `StringEquals` 替换为 `StringLike`，将 `$service_account` 替换为 \$1。

   ```
   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
   ```

1. 创建角色。

   ```
   aws iam create-role --role-name my-role --assume-role-policy-document file://trust-relationship.json --description "my-role-description"
   ```

1. 使用以下 `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
   ```