서비스 계정에 대한 IAM 역할(IRSA)을 사용하여 액세스 권한 설정
기본적으로 Livy 서버와 Spark 애플리케이션의 드라이버 및 실행기는 AWS 리소스에 액세스할 수 없습니다. 서버 서비스 계정 및 Spark 서비스 계정은 Livy 서버 및 Spark 애플리케이션 포드의 AWS 리소스에 대한 액세스를 제어합니다. 액세스 권한을 부여하려면 서비스 계정을 필요한 AWS 권한이 있는 IAM 역할로 매핑해야 합니다.
Apache Livy를 설치하기 전, 설치 중 또는 설치를 완료한 후 IRSA 매핑을 설정할 수 있습니다.
Apache Livy 설치 중 IRSA 설정(서버 서비스 계정용)
참고
이 매핑은 서버 서비스 계정에서만 지원됩니다.
-
Amazon EMR on EKS에 대한 Apache Livy 설정을 완료하고 Amazon EMR on EKS에서 Apache Livy 설치를 수행하는 중인지 확인합니다.
-
Livy 서버에 대한 Kubernetes 네임스페이스를 생성합니다. 이 예제에서 네임스페이스의 이름은
livy-ns
입니다. -
포드에서 액세스하려는 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-namemy-policy
--policy-document file://my-policy.json
-
다음 명령을 사용하여 AWS 계정 ID를 변수로 설정합니다.
account_id=$(aws sts get-caller-identity --query "Account" --output text)
-
클러스터의 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:\/\///") -
서비스 계정의 네임스페이스 및 이름에 대한 변수를 설정합니다. 자체 값을 사용해야 합니다.
export namespace=default export service_account=my-service-account
-
다음 명령으로 신뢰 정책 파일을 생성합니다. 네임스페이스 내 모든 서비스 계정에 역할의 액세스 권한을 부여하려면 다음 명령을 복사하고
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
-
역할을 생성합니다.
aws iam create-role --role-name
my-role
--assume-role-policy-document file://trust-relationship.json --description "my-role-description
" -
다음 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 서비스 계정에 매핑하기 전에 다음 항목을 완료했는지 확인합니다.
-
Amazon EMR on EKS에 대한 Apache Livy 설정을 완료하고 Amazon EMR on EKS에서 Apache Livy 설치를 수행하는 중인지 확인합니다.
-
클러스터에 대한 기존 IAM OpenID Connect(OIDC) 제공업체가 있어야 합니다. 이미 있는지 확인하거나 새로 생성하는 방법을 알아보려면 Create an IAM OIDC provider for your cluster를 참조하세요.
-
eksctl
CLI의 버전 0.171.0 이상 또는 AWS CloudShell을 설치했는지 확인합니다.eksctl
을 설치 또는 업그레이드하려면eksctl
설명서의 Installation을 참조하세요.
다음 단계를 수행하여 IRSA를 Spark 서비스 계정에 매핑합니다.
-
다음 명령을 사용하여 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}' -
서비스 계정의 네임스페이스 및 이름에 대한 변수를 설정합니다.
export namespace=
default
export service_account=my-service-account
-
다음 명령을 사용하여 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
-
역할을 생성합니다.
aws iam create-role --role-name
my-role
--assume-role-policy-document file://trust-relationship.json
--description "my-role-description" -
다음
eksctl
명령을 사용하여 서버 또는 Spark 서비스 계정을 매핑합니다. 자체 값을 사용해야 합니다.eksctl create iamserviceaccount --name
spark-sa
\ --namespace spark-namespace --clusterlivy-eks-cluster
\ --attach-role-arn arn:aws:iam::0123456789012
:role/my-role
\ --approve --override-existing-serviceaccounts