

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

# EMR Serverless 이미지 사용자 지정
<a name="application-custom-image"></a>

Amazon EMR 6.9.0부터 사용자 지정 이미지를 사용하여 Amazon EMR Serverless를 사용하여 애플리케이션 종속 항목과 런타임 환경을 단일 컨테이너로 패키징할 수 있습니다. 이 경우 워크로드 종속 항목을 관리하는 방법이 간소화되고 패키지 이식성이 개선됩니다. EMR Serverless 이미지를 사용자 지정하면 다음과 같은 이점이 있습니다.
+ 워크로드에 최적화된 패키지를 설치하고 구성합니다. 이 패키지는 Amazon EMR 런타임 환경의 퍼블릭 배포에 널리 사용되지 않습니다.
+ 로컬 개발 및 테스트를 포함하여 조직 내 현재 설정된 빌드, 테스트 및 배포 프로세스와 EMR Serverless를 통합합니다.
+ 조직 내 규정 준수 및 거버넌스 요구 사항을 충족하는 확립된 보안 프로세스(예: 이미지 스캔)를 적용합니다.
+ 애플리케이션에 대해 자체 JDK 및 Python 버전을 사용할 수 있습니다.

EMR Serverless는 자체 이미지를 생성하는 경우 기본으로 사용하는 이미지를 제공합니다. 기본 이미지는 이미지가 EMR Serverless와 상호 작용하기 위한 필수 jar, 구성 및 라이브러리를 제공합니다. [Amazon ECR 퍼블릭 갤러리](https://gallery.ecr.aws/emr-serverless/)에서 기본 이미지를 찾을 수 있습니다. 애플리케이션 유형(Spark 또는 Hive) 및 릴리스 버전과 일치하는 이미지를 사용합니다. 예를 들어, Amazon EMR 릴리스 6.9.0에서 애플리케이션을 생성하는 경우 다음 이미지를 사용합니다.


| Type | 이미지 | 
| --- | --- | 
|  Spark  |  `public.ecr.aws/emr-serverless/spark/emr-6.9.0:latest`  | 
|  Hive  |  `public.ecr.aws/emr-serverless/hive/emr-6.9.0:latest`  | 

## 사전 조건
<a name="worker-configs"></a>

EMR Serverless 사용자 지정 이미지를 생성하기 전에 다음 사전 조건을 완료합니다.

1. EMR Serverless 애플리케이션을 시작하는 데 사용하는 AWS 리전 것과 동일한에서 Amazon ECR 리포지토리를 생성합니다. Amazon ECR 프라이빗 리포지토리를 생성하려면 [프라이빗 리포지토리 생성](https://docs.aws.amazon.com/AmazonECR/latest/userguide/repository-create.html)을 참조하세요.

1. 사용자에게 Amazon ECR 리포지토리에 대한 액세스 권한을 부여하려면 EMR Serverless 애플리케이션을 생성하거나 이 리포지토리의 이미지로 업데이트하는 사용자 및 역할에 다음 정책을 추가합니다.

------
#### [ JSON ]

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Sid": "ECRRepositoryListGetPolicy",
         "Effect": "Allow",
         "Action": [
           "ecr:GetDownloadUrlForLayer",
           "ecr:BatchGetImage",
           "ecr:DescribeImages"
         ],
         "Resource": [
           "arn:aws:ecr:*:123456789012:repository/my-repo"
         ]
       }
     ]
   }
   ```

------

   Amazon ECR 자격 증명 기반 정책의 추가 예제는 [Amazon Elastic Container Registry 자격 증명 기반 정책 예제](https://docs.aws.amazon.com/AmazonECR/latest/userguide/security_iam_id-based-policy-examples.html)를 참조하세요.

## 1단계: EMR Serverless 기본 이미지에서 사용자 지정 이미지 생성
<a name="create-image"></a>

먼저 기본 이미지를 사용하는 `FROM` 명령으로 시작하는 [Dockerfile](https://docs.docker.com/engine/reference/builder/)을 생성합니다. `FROM` 명령 이후에 이미지에 적용하려는 수정 사항을 포함합니다. 기본 이미지는 `USER`를 `hadoop`으로 자동 설정합니다. 이 설정에는 포함된 모든 수정 사항에 대한 권한이 없습니다. 해결 방법으로 `USER`를 `root`로 설정하고 이미지를 수정한 다음, `USER`를 `hadoop:hadoop`으로 다시 설정합니다. 일반적인 사용 사례에 대한 샘플을 참조하려면 [EMR Serverless에서 사용자 지정 이미지 사용](using-custom-images.md) 섹션을 참조하세요.

```
# Dockerfile
FROM public.ecr.aws/emr-serverless/spark/emr-6.9.0:latest

USER root
# MODIFICATIONS GO HERE

# EMRS runs the image as hadoop
USER hadoop:hadoop
```

Dockerfile을 보유한 후 다음 명령을 사용하여 이미지를 빌드합니다.

```
# build the docker image
docker build . -t aws-account-id.dkr.ecr.region.amazonaws.com/my-repository[:tag]or[@digest]
```

## 2단계: 로컬에서 이미지 검증
<a name="validate"></a>

EMR Serverless는 기본 파일, 환경 변수 및 올바른 이미지 구성을 검증하기 위해 사용자 지정 이미지를 정적으로 확인할 수 있는 오프라인 도구를 제공합니다. 도구를 설치하고 실행하는 방법에 대한 자세한 내용은 [Amazon EMR Serverless Image CLI GitHub](https://github.com/awslabs/amazon-emr-serverless-image-cli)를 참조하세요.

도구를 설치한 후 다음 명령을 실행하여 이미지를 검증합니다.

```
amazon-emr-serverless-image \
validate-image -r emr-6.9.0 -t spark \
-i aws-account-id.dkr.ecr.region.amazonaws.com/my-repository:tag/@digest
```

출력은 다음과 유사하게 나타납니다.

```
Amazon EMR Serverless - Image CLI
Version: 0.0.1
... Checking if docker cli is installed
... Checking Image Manifest
[INFO] Image ID: 9e2f4359cf5beb466a8a2ed047ab61c9d37786c555655fc122272758f761b41a
[INFO] Created On: 2022-12-02T07:46:42.586249984Z
[INFO] Default User Set to hadoop:hadoop : PASS
[INFO] Working Directory Set to  : PASS
[INFO] Entrypoint Set to /usr/bin/entrypoint.sh : PASS
[INFO] HADOOP_HOME is set with value: /usr/lib/hadoop : PASS
[INFO] HADOOP_LIBEXEC_DIR is set with value: /usr/lib/hadoop/libexec : PASS
[INFO] HADOOP_USER_HOME is set with value: /home/hadoop : PASS
[INFO] HADOOP_YARN_HOME is set with value: /usr/lib/hadoop-yarn : PASS
[INFO] HIVE_HOME is set with value: /usr/lib/hive : PASS
[INFO] JAVA_HOME is set with value: /etc/alternatives/jre : PASS
[INFO] TEZ_HOME is set with value: /usr/lib/tez : PASS
[INFO] YARN_HOME is set with value: /usr/lib/hadoop-yarn : PASS
[INFO] File Structure Test for hadoop-files in /usr/lib/hadoop: PASS
[INFO] File Structure Test for hadoop-jars in /usr/lib/hadoop/lib: PASS
[INFO] File Structure Test for hadoop-yarn-jars in /usr/lib/hadoop-yarn: PASS
[INFO] File Structure Test for hive-bin-files in /usr/bin: PASS
[INFO] File Structure Test for hive-jars in /usr/lib/hive/lib: PASS
[INFO] File Structure Test for java-bin in /etc/alternatives/jre/bin: PASS
[INFO] File Structure Test for tez-jars in /usr/lib/tez: PASS
-----------------------------------------------------------------
Overall Custom Image Validation Succeeded.
-----------------------------------------------------------------
```

## 3단계: 이미지를 Amazon ECR 리포지토리에 업로드
<a name="upload-image"></a>

다음 명령을 사용하여 Amazon ECR 리포지토리에 Amazon ECR 이미지를 푸시합니다. 이미지를 리포지토리로 푸시할 수 있는 올바른 IAM 권한이 있는지 확인합니다. 자세한 내용은 *Amazon ECR 사용 설명서*의 [이미지 푸시](https://docs.aws.amazon.com/AmazonECR/latest/userguide/image-push.html)를 참조하세요.

```
# login to ECR repo
aws ecr get-login-password --region region | docker login --username AWS --password-stdin aws-account-id.dkr.ecr.region.amazonaws.com

# push the docker image
docker push aws-account-id.dkr.ecr.region.amazonaws.com/my-repository:tag/@digest
```

## 4단계: 사용자 지정 이미지를 사용하여 애플리케이션 생성 또는 업데이트
<a name="create-app"></a>

애플리케이션을 시작하는 방법에 따라 AWS Management Console 탭 또는 AWS CLI 탭을 선택한 다음 다음 단계를 완료합니다.

------
#### [ Console ]

1. [https://console.aws.amazon.com/lambda](https://console.aws.amazon.com/emr)에서 EMR Studio 콘솔에 로그인합니다. 애플리케이션으로 이동하거나 [애플리케이션 생성](https://docs.aws.amazon.com/emr/latest/EMR-Serverless-UserGuide/studio.html#studio-create-app)의 지침을 사용하여 새 애플리케이션을 생성합니다.

1. EMR Serverless 애플리케이션을 생성하거나 업데이트할 때 사용자 지정 이미지를 지정하려면 애플리케이션 설정 옵션에서 **사용자 지정 설정**을 선택합니다.

1. **사용자 지정 이미지 설정** 섹션에서 **이 애플리케이션에서 사용자 지정 이미지 사용** 확인란을 선택합니다.

1. Amazon ECR 이미지 URI를 **이미지 URI** 필드에 붙여 넣습니다. EMR Serverless는 애플리케이션의 모든 작업자 유형에 대해 이 이미지를 사용합니다. 또는 **다른 사용자 지정 이미지**를 선택하고 각 작업자 유형에 대해 다른 Amazon ECR 이미지 URI를 붙여넣을 수 있습니다.

------
#### [ CLI ]
+ `image-configuration` 파라미터를 사용하여 애플리케이션을 생성합니다. EMR Serverless는 이 설정을 모든 작업자 유형에 적용합니다.

  ```
  aws emr-serverless create-application \
  --release-label emr-6.9.0 \
  --type SPARK \
  --image-configuration '{
      "imageUri": "aws-account-id.dkr.ecr.region.amazonaws.com/my-repository:tag/@digest"
  }'
  ```

  각 작업자 유형에 대해 서로 다른 이미지 설정을 사용하는 애플리케이션을 생성하려면 `worker-type-specifications` 파라미터를 사용합니다.

  ```
  aws emr-serverless create-application \
  --release-label emr-6.9.0 \
  --type SPARK \
  --worker-type-specifications '{
      "Driver": {
          "imageConfiguration": {
              "imageUri": "aws-account-id.dkr.ecr.region.amazonaws.com/my-repository:tag/@digest"
          }
      },
      "Executor" : {
          "imageConfiguration": {
              "imageUri": "aws-account-id.dkr.ecr.region.amazonaws.com/my-repository:tag/@digest"
          }
      }
  }'
  ```

  애플리케이션을 업데이트하려면 `image-configuration` 파라미터를 사용합니다. EMR Serverless는 이 설정을 모든 작업자 유형에 적용합니다.

  ```
  aws emr-serverless update-application \
  --application-id application-id \
  --image-configuration '{
      "imageUri": "aws-account-id.dkr.ecr.region.amazonaws.com/my-repository:tag/@digest"
  }'
  ```

------

## 5단계: EMR Serverless가 사용자 지정 이미지 리포지토리에 액세스하도록 허용
<a name="access-repo"></a>

Amazon ECR 리포지토리에 다음 리소스 정책을 추가하여 EMR Serverless 서비스 위탁자가 이 리포지토리에서 `get`, `describe` 및 `download` 요청을 사용하도록 허용합니다.

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "EmrServerlessCustomImageSupport",
      "Effect": "Allow",
      "Action": [
        "ecr:BatchGetImage",
        "ecr:DescribeImages",
        "ecr:GetDownloadUrlForLayer"
      ],
      "Resource": "arn:aws:ecr:*:123456789012:repository/my-repo",
      "Condition": {
        "ArnLike": {
          "aws:SourceArn": "arn:aws:emr-serverless:*:123456789012:/applications/*"
        }
      }
    }
  ]
}
```

------

보안 모범 사례로 `aws:SourceArn` 조건 키를 리포지토리 정책에 추가합니다. IAM 전역 조건 키 `aws:SourceArn`을 사용하면 EMR Serverless가 애플리케이션 ARN에만 리포지토리를 사용하도록 보장합니다. Amazon ECR 리포지토리 정책에 대한 자세한 내용은 [프라이빗 리포지토리 생성](https://docs.aws.amazon.com/AmazonECR/latest/userguide/repository-policies.html)을 참조하세요.

## 고려 사항 및 제한 사항
<a name="considerations"></a>

사용자 지정 이미지를 작업하는 경우 다음을 고려합니다.
+ 애플리케이션에 대한 유형(Spark 또는 Hive) 및 릴리스 레이블(예: `emr-6.9.0`)과 일치하는 올바른 기본 이미지를 사용합니다.
+ EMR Serverless는 Docker 파일의 `[CMD]` 또는 `[ENTRYPOINT]` 명령을 무시합니다. Docker 파일에서 공통 명령(예: `[COPY]`, `[RUN]`, `[WORKDIR]`)을 사용합니다.
+ 사용자 지정 이미지를 생성하는 경우 환경 변수 `JAVA_HOME`, `SPARK_HOME`, `HIVE_HOME`, `TEZ_HOME`을 수정해서는 안 됩니다.
+ 사용자 지정 이미지의 크기는 10 GB를 초과할 수 없습니다.
+ Amazon EMR 기본 이미지에서 바이너리 또는 jar을 수정하는 경우 애플리케이션 또는 작업 시작에 실패할 수 있습니다.
+ Amazon ECR 리포지토리는 EMR Serverless 애플리케이션을 시작하는 데 사용하는 AWS 리전 것과 동일한에 있어야 합니다.