

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# 서비스 계정에 대한 IAM 역할(IRSA)을 사용하여 액세스 권한 설정
<a name="job-runs-apache-livy-irsa"></a>

기본적으로 Livy 서버와 Spark 애플리케이션의 드라이버 및 실행기는 AWS 리소스에 액세스할 수 없습니다. 서버 서비스 계정 및 Spark 서비스 계정은 Livy 서버의 AWS 리소스 및 Spark 애플리케이션의 포드에 대한 액세스를 제어합니다. 액세스 권한을 부여하려면 서비스 계정을 필요한 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. 포드가 액세스할에 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
   ```

1. 다음 명령을 사용하여 AWS 계정 ID를 변수로 설정합니다.

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

1. 클러스터의 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:\/\///")
   ```

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 설치 명령을 사용하여 IRSA를 매핑하도록 `serviceAccount.executionRoleArn`을 설정합니다. 다음은 Helm 설치 명령의 예제입니다. [리전별로 Amazon ECR 레지스트리 계정](https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/docker-custom-images-tag.html#docker-custom-images-ECR) AWS 리전 에서에 해당하는 `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
   ```

## Spark 서비스 계정에 IRSA 매핑
<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) 제공업체가 있어야 합니다. 이미 있는지 확인하거나 새로 생성하는 방법을 알아보려면 [Create an IAM OIDC provider for your cluster](https://docs.aws.amazon.com/eks/latest/userguide/enable-iam-roles-for-service-accounts.html)를 참조하세요.
+ `eksctl` CLI의 버전 0.171.0 이상 또는 AWS CloudShell을 설치했는지 확인합니다. `eksctl`을 설치 또는 업그레이드하려면 `eksctl` 설명서의 [Installation](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
   ```