EMR Serverless 이미지 사용자 지정 - Amazon EMR

EMR Serverless 이미지 사용자 지정

Amazon EMR 6.9.0부터 사용자 지정 이미지를 사용하여 Amazon EMR Serverless를 사용하여 애플리케이션 종속 항목과 런타임 환경을 단일 컨테이너로 패키징할 수 있습니다. 이 경우 워크로드 종속 항목을 관리하는 방법이 간소화되고 패키지 이식성이 개선됩니다. EMR Serverless 이미지를 사용자 지정하면 다음과 같은 이점이 있습니다.

  • 워크로드에 최적화된 패키지를 설치하고 구성합니다. 이 패키지는 Amazon EMR 런타임 환경의 퍼블릭 배포에 널리 사용되지 않을 수 있습니다.

  • 로컬 개발 및 테스트를 포함하여 조직 내 현재 설정된 빌드, 테스트 및 배포 프로세스와 EMR Serverless를 통합합니다.

  • 조직 내 규정 준수 및 거버넌스 요구 사항을 충족하는 확립된 보안 프로세스(예: 이미지 스캔)를 적용합니다.

  • 애플리케이션에 대해 자체 JDK 및 Python 버전을 사용할 수 있습니다.

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

유형 이미지

Spark

public.ecr.aws/emr-serverless/spark/emr-6.9.0:latest

Hive

public.ecr.aws/emr-serverless/hive/emr-6.9.0:latest

사전 조건

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

  1. EMR Serverless 애플리케이션을 시작하는 데 사용하는 동일한 AWS 리전에서 Amazon ECR 리포지토리를 생성합니다. Amazon ECR 프라이빗 리포지토리를 생성하려면 프라이빗 리포지토리 생성을 참조하세요.

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

    { "Version": "2012-10-17", "Statement": [ { "Sid": "ECRRepositoryListGetPolicy", "Effect": "Allow", "Action": [ "ecr:GetDownloadUrlForLayer", "ecr:BatchGetImage", "ecr:DescribeImages" ], "Resource": "ecr-repository-arn" } ] }

    Amazon ECR 자격 증명 기반 정책의 추가 예제는 Amazon Elastic Container Registry 자격 증명 기반 정책 예제를 참조하세요.

1단계: EMR Serverless 기본 이미지에서 사용자 지정 이미지 생성

먼저 기본 이미지를 사용하는 FROM 명령으로 시작하는 Dockerfile을 생성합니다. FROM 명령 이후에 이미지에 적용하려는 수정 사항을 포함할 수 있습니다. 기본 이미지는 USERhadoop으로 자동 설정합니다. 이 설정에 포함된 모든 수정 사항에 대한 권한이 없을 수 있습니다. 해결 방법으로 USERroot로 설정하고 이미지를 수정한 다음, USERhadoop:hadoop으로 다시 설정합니다. 일반적인 사용 사례에 대한 샘플을 보려면 EMR Serverless에서 사용자 지정 이미지 사용 섹션을 참조하세요.

# Dockerfile FROM public.ecr.aws/emr-serverless/spark/emr-6.9.0:latest USER root # MODIFICATIONS GO HERE # EMRS will run 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단계: 로컬에서 이미지 검증

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

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

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 리포지토리에 업로드

다음 명령을 사용하여 Amazon ECR 리포지토리에 Amazon ECR 이미지를 푸시합니다. 이미지를 리포지토리로 푸시할 수 있는 올바른 IAM 권한이 있는지 확인합니다. 자세한 내용은 Amazon ECR 사용 설명서의 이미지 푸시를 참조하세요.

# 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단계: 사용자 지정 이미지를 사용하여 애플리케이션 생성 또는 업데이트

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

Console
  1. https://console.aws.amazon.com/lambda에서 EMR Studio 콘솔에 로그인합니다. 애플리케이션으로 이동하거나 애플리케이션 생성의 지침을 사용하여 새 애플리케이션을 생성합니다.

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

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

  4. 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가 사용자 지정 이미지 리포지토리에 액세스하도록 허용

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

{ "Version": "2012-10-17", "Statement": [ { "Sid": "Emr Serverless Custom Image Support", "Effect": "Allow", "Principal": { "Service": "emr-serverless.amazonaws.com" }, "Action": [ "ecr:BatchGetImage", "ecr:DescribeImages", "ecr:GetDownloadUrlForLayer" ], "Condition":{ "StringEquals":{ "aws:SourceArn": "arn:aws:emr-serverless:region:aws-account-id:/applications/application-id" } } } ] }

보안 모범 사례로 aws:SourceArn 조건 키를 리포지토리 정책에 추가합니다. IAM 전역 조건 키 aws:SourceArn을 사용하면 EMR Serverless가 애플리케이션 ARN에만 리포지토리를 사용하도록 보장합니다. Amazon ECR 리포지토리 정책에 대한 자세한 내용은 프라이빗 리포지토리 생성을 참조하세요.

고려 사항 및 제한

사용자 지정 이미지를 작업하는 경우 다음을 고려합니다.

  • 애플리케이션에 대한 유형(Spark 또는 Hive) 및 릴리스 레이블(예: emr-6.9.0)과 일치하는 올바른 기본 이미지를 사용합니다.

  • EMR Serverless는 Docker 파일의 [CMD] 또는 [ENTRYPOINT] 명령을 무시합니다. Docker 파일에서 공통 명령(예: [COPY], [RUN], [WORKDIR])을 사용합니다.

  • 사용자 지정 이미지를 생성하는 경우 환경 변수 JAVA_HOME, SPARK_HOME, HIVE_HOME, TEZ_HOME을 수정해서는 안 됩니다.

  • 사용자 지정 이미지의 크기는 5GB를 초과할 수 없습니다.

  • Amazon EMR 기본 이미지에서 바이너리 또는 jar을 수정하는 경우 애플리케이션 또는 작업 시작에 실패할 수 있습니다.

  • Amazon ECR 리포지토리는 EMR Serverless 애플리케이션을 시작하는 데 사용하는 동일한 AWS 리전에 있어야 합니다.