Configuración de los permisos de acceso con roles de IAM para las cuentas de servicio (IRSA) - Amazon EMR

Configuración de los permisos de acceso con roles de IAM para las cuentas de servicio (IRSA)

De forma predeterminada, el servidor de Livy y el controlador y ejecutores de la aplicación Spark no tienen acceso a los recursos de AWS. La cuenta de servicio del servidor y la cuenta de servicio Spark controlan el acceso a los recursos de AWS de los pods del servidor de Livy y de la aplicación Spark. Para conceder el acceso, debe asignar las cuentas de servicio a un rol de IAM que tenga los permisos necesarios de AWS.

Puede configurar la asignación de IRSA antes de instalar Apache Livy, durante la instalación o después de finalizarla.

Configuración de IRSA durante la instalación de Apache Livy (para la cuenta de servicio del servidor)

nota

Esta asignación solo es compatible con la cuenta de servicio del servidor.

  1. Asegúrese de haber terminado la configuración de Apache Livy para Amazon EMR en EKS y de que está realizando la instalación de Apache Livy con Amazon EMR en EKS.

  2. Cree un espacio de nombres de Kubernetes para el servidor Livy. En este ejemplo, el nombre del espacio de nombres es livy-ns.

  3. Cree una política de IAM que incluya los permisos para los Servicios de AWS a los que quiere que accedan sus pods. El siguiente ejemplo crea una política de IAM para obtener recursos de Amazon S3 para el punto de entrada de Spark.

    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. Use el siguiente comando para establecer su ID de Cuenta de AWS en una variable.

    account_id=$(aws sts get-caller-identity --query "Account" --output text)
  5. Establezca el proveedor de identidades de OpenID Connect (OIDC) de su clúster en una variable de entorno.

    oidc_provider=$(aws eks describe-cluster --name my-cluster --region $AWS_REGION --query "cluster.identity.oidc.issuer" --output text | sed -e "s/^https:\/\///")
  6. Establezca variables para el espacio de nombres y el nombre de la cuenta de servicio. Asegúrese de utilizar sus propios valores.

    export namespace=default export service_account=my-service-account
  7. Cree un archivo de política de confianza con el comando siguiente. Si desea conceder el acceso al rol a todas las cuentas de servicio de un espacio de nombres, copie el siguiente comando y sustituya StringEquals por StringLike; sustituya, también, $service_account por *.

    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. Cree el rol.

    aws iam create-role --role-name my-role --assume-role-policy-document file://trust-relationship.json --description "my-role-description"
  9. Utilice el siguiente comando de instalación Helm para establecer el serviceAccount.executionRoleArn para asignar IRSA. A continuación, se muestra un ejemplo del comando de instalación Helm. Puede encontrar el valor ECR-registry-account correspondiente a su Región de AWS a partir de sus cuentas de registro de Amazon ECR por región.

    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

Asignación del IRSA a una cuenta de servicio de Spark

Antes de asignar el IRSA a una cuenta de servicio de Spark, asegúrese de haber realizado los siguientes pasos:

Siga estos pasos para asignar el IRSA a su cuenta de servicio de Spark:

  1. Ejecute el comando siguiente para obtener la cuenta de servicio de 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. Establezca variables para el espacio de nombres y el nombre de la cuenta de servicio.

    export namespace=default export service_account=my-service-account
  3. Use el siguiente comando para crear un archivo de política de confianza para el rol de IAM. El siguiente ejemplo da permiso a todas las cuentas de servicio dentro del espacio de nombres para utilizar el rol. Para ello, sustituya StringEquals por StringLike; sustituya, también, $service_account por *.

    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. Cree el rol.

    aws iam create-role --role-name my-role --assume-role-policy-document file://trust-relationship.json --description "my-role-description"
  5. Asigne el servidor o la cuenta de servicio de Spark con el siguiente comando eksctl. Asegúrese de utilizar sus propios valores.

    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