서비스 계정에 대한 IAM 역할(IRSA)을 사용하여 액세스 권한 설정 - Amazon EMR

서비스 계정에 대한 IAM 역할(IRSA)을 사용하여 액세스 권한 설정

기본적으로 Livy 서버와 Spark 애플리케이션의 드라이버 및 실행기는 AWS 리소스에 액세스할 수 없습니다. 서버 서비스 계정 및 Spark 서비스 계정은 Livy 서버 및 Spark 애플리케이션 포드의 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. 포드에서 액세스하려는 AWS 서비스에 대한 권한을 포함하는 IAM 정책을 생성합니다. 다음 예제에서는 Spark 진입점에 대한 Amazon S3 리소스를 가져오는 IAM 정책을 생성합니다.

    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) ID 제공업체를 환경 변수로 설정합니다.

    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. 다음 명령으로 신뢰 정책 파일을 생성합니다. 네임스페이스 내 모든 서비스 계정에 역할의 액세스 권한을 부여하려면 다음 명령을 복사하고 StringEqualsStringLike로 바꾸고 $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 설치 명령을 사용하여 IRSA를 매핑하도록 serviceAccount.executionRoleArn을 설정합니다. 다음은 Helm 설치 명령의 예제입니다. 리전별로 Amazon ECR 레지스트리 계정에서 AWS 리전에 해당하는 ECR-registry-account 값을 찾을 수 있습니다.

    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

Spark 서비스 계정에 IRSA 매핑

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 역할에 대한 신뢰 정책 파일을 생성합니다. 다음 예제에서는 네임스페이스 내 모든 서비스 계정에 역할을 사용할 수 있는 권한을 부여합니다. 이를 수행하려면 StringEqualsStringLike로 바꾸고 $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