Configuração de permissões de acesso com perfis do IAM para contas de serviço (IRSA) - Amazon EMR

Configuração de permissões de acesso com perfis do IAM para contas de serviço (IRSA)

Por padrão, o driver e os executores do servidor Livy e da aplicação do Spark não têm acesso aos recursos da AWS. A conta de serviço do servidor e a conta de serviço do Spark controlam o acesso aos recursos da AWS para o servidor Livy e os pods da aplicação do Spark. Para conceder acesso, você precisa mapear as contas de serviço com um perfil do IAM que tenha as permissões necessárias da AWS.

Você pode configurar o mapeamento do IRSA antes de instalar o Apache Livy, durante a instalação ou depois de concluir a instalação.

Configuração do IRSA durante a instalação do Apache Livy (para conta de serviço do servidor)

nota

Esse mapeamento é compatível somente com a conta de serviço do servidor.

  1. Verifique se você concluiu a configuração do Apache Livy para Amazon EMR no EKS e está no meio da instalação do Apache Livy com o Amazon EMR no EKS.

  2. Crie um namespace do Kubernetes para o servidor do Livy. Neste exemplo, o nome do namespace é livy-ns.

  3. Crie uma política do IAM que inclua as permissões para os Serviços da AWS que você deseja que os pods acessem. O exemplo a seguir cria uma política do IAM para obter recursos do Amazon S3 para o ponto de entrada do 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 o comando a seguir para definir o ID da Conta da AWS como uma variável.

    account_id=$(aws sts get-caller-identity --query "Account" --output text)
  5. Defina o provedor de identidade OpenID Connect (OIDC) do cluster como uma variável de ambiente.

    oidc_provider=$(aws eks describe-cluster --name my-cluster --region $AWS_REGION --query "cluster.identity.oidc.issuer" --output text | sed -e "s/^https:\/\///")
  6. Defina variáveis para o namespace e o nome da conta de serviço. Use seus próprios valores.

    export namespace=default export service_account=my-service-account
  7. Crie um arquivo de política de confiança com o comando a seguir. Se quiser conceder acesso ao perfil a todas as contas de serviço em um namespace, copie o comando a seguir e substitua StringEquals por StringLike e $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. Crie a função.

    aws iam create-role --role-name my-role --assume-role-policy-document file://trust-relationship.json --description "my-role-description"
  9. Use o comando de instalação do Helm a seguir para configurar o serviceAccount.executionRoleArn para mapear o IRSA. Confira a seguir um exemplo do comando de instalação do Helm. Você pode encontrar o valor correspondente de ECR-registry-account para as Região da AWS das contas de registro do Amazon ECR por região.

    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

Mapeamento do IRSA para uma conta de serviço do Spark

Antes de mapear o IRSA para uma conta de serviço do Spark, conclua os seguintes itens:

Siga estas etapas para mapear o IRSA à conta de serviço do Spark:

  1. Use o comando a seguir para obter a conta de serviço do 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. Defina variáveis para o namespace e o nome da conta de serviço.

    export namespace=default export service_account=my-service-account
  3. Use o comando a seguir para criar um arquivo de política de confiança para o perfil do IAM. O exemplo a seguir dá permissão a todas as contas de serviço dentro do namespace para usar o perfil. Para fazer isso, substitua StringEquals por StringLike e $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. Crie a função.

    aws iam create-role --role-name my-role --assume-role-policy-document file://trust-relationship.json --description "my-role-description"
  5. Mapeie o servidor ou a conta de serviço do Spark com o comando eksctl a seguir. Use seus próprios 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