Personalização de uma imagem do EMR Sem Servidor
A partir do Amazon EMR 6.9.0, é possível usar imagens personalizadas para empacotar dependências de aplicações e ambientes de runtime em um único contêiner com o Amazon EMR Sem Servidor. Isso simplifica a forma como você gerencia as dependências da workload e torna seus pacotes mais portáteis. Quando você personaliza a imagem do EMR Sem Servidor, ela oferece os seguintes benefícios:
-
Instala e configura pacotes otimizados para as workloads. Esses pacotes podem não estar amplamente disponíveis na distribuição pública dos ambientes de runtime do Amazon EMR.
-
Integra o EMR Sem Servidor aos processos atuais de criação, teste e implantação estabelecidos em sua organização, incluindo desenvolvimento e testes locais.
-
Aplica os processos de segurança estabelecidos, como a verificação de imagens, que atendem aos requisitos de conformidade e governança da sua organização.
-
Permite que você use suas próprias versões do JDK e do Python em aplicações.
O EMR Sem Servidor fornece imagens que você pode usar como base ao criar suas próprias imagens. A imagem base fornece os jars, a configuração e as bibliotecas essenciais para que a imagem interaja com o EMR Sem Servidor. É possível encontrar a imagem base na Galeria pública do Amazon ECR
Tipo | Imagem |
---|---|
Spark |
|
Hive |
|
Pré-requisitos
Antes de criar uma imagem personalizada do EMR Sem Servidor, preencha estes pré-requisitos.
-
Crie um repositório do Amazon ECR na mesma Região da AWS que você usa para iniciar aplicações do EMR Sem Servidor. Para criar um repositório privado do Amazon ECR, consulte Criar um repositório privado.
-
Para conceder aos usuários acesso ao repositório do Amazon ECR, adicione as políticas a seguir aos usuários e perfis que criam ou atualizam aplicações do EMR Sem Servidor com imagens desse repositório.
{ "Version": "2012-10-17", "Statement": [ { "Sid": "ECRRepositoryListGetPolicy", "Effect": "Allow", "Action": [ "ecr:GetDownloadUrlForLayer", "ecr:BatchGetImage", "ecr:DescribeImages" ], "Resource": "
ecr-repository-arn
" } ] }Para obter mais exemplos de políticas baseadas em identidade do Amazon ECR, consulte Amazon Elastic Container Registry identity-based policy examples.
Etapa 1: criar uma imagem personalizada usando imagens base do EMR Sem Servidor
Primeiro, crie um DockerfileFROM
que usa sua imagem base preferencial. Após a instrução FROM
, você pode incluir qualquer modificação que desejar fazer na imagem. A imagem base define automaticamente o valor de USER
para hadoop
. Essa configuração pode não ter permissões para todas as modificações que você inclui. Como solução, defina o USER
para root
, modifique sua imagem e, em seguida, defina o USER
de volta para hadoop:hadoop
. Para ver exemplos de casos de uso comuns, consulte Uso de imagens personalizadas com o EMR Sem Servidor.
# 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
Depois que você tiver o Dockerfile, compile a imagem com o comando a seguir.
# build the docker image docker build . -t
aws-account-id
.dkr.ecr.region
.amazonaws.com/my-repository
[:tag]or[@digest]
Etapa 2: validar a imagem localmente
O EMR Sem Servidor fornece uma ferramenta off-line que pode verificar estaticamente sua imagem personalizada para validar arquivos base, variáveis de ambiente e configurações corretas de imagem. Para obter informações sobre como instalar e executar a ferramenta, consulte o GitHub sobre a CLI da imagem do Amazon EMR Sem Servidor
Depois de instalar a ferramenta, execute o comando a seguir para validar uma imagem:
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
Você deve ver uma saída semelhante a mostrada a seguir.
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. -----------------------------------------------------------------
Etapa 3: upload da imagem em um repositório do Amazon ECR
Envie a imagem do Amazon ECR para o repositório do Amazon ECR com os comandos a seguir. Verifique se você tem as permissões corretas do IAM para enviar a imagem ao repositório. Para obter mais informações, consulte Pushing an image no Guia do usuário do 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 pushaws-account-id
.dkr.ecr.region
.amazonaws.com/my-repository
:tag/@digest
Etapa 4: criar ou atualizar uma aplicação com imagens personalizadas
Escolha a guia AWS Management Console ou a AWS CLI de acordo com a forma como deseja iniciar a aplicação e, em seguida, conclua as etapas a seguir.
Etapa 5: permitir que o EMR Sem Servidor acesse o repositório de imagens personalizadas
Adicione a política de recursos a seguir ao repositório do Amazon ECR para permitir que a entidade principal do serviço do EMR Sem Servidor use as solicitações get
, describe
e download
desse repositório.
{ "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
" } } } ] }
Como uma prática recomendada de segurança, adicione uma chave de condição aws:SourceArn
à política do repositório. A chave de condição global do IAM aws:SourceArn
garante que o EMR Sem Servidor use o repositório somente para o ARN de uma aplicação. Para obter mais informações sobre as políticas de repositório do Amazon ECR, consulte Creating a private repository.
Considerações e limitações
Considere o seguinte ao trabalhar com imagens personalizadas:
-
Use a imagem base correta que corresponda ao tipo (Spark ou Hive) e ao rótulo de lançamento (por exemplo,
emr-6.9.0
) da aplicação. -
O EMR Sem Servidor ignora as instruções
[CMD]
ou[ENTRYPOINT]
no arquivo Docker. Use instruções comuns no arquivo Docker, como[COPY]
,[RUN]
e[WORKDIR]
. -
Você não deve modificar as variáveis de ambiente
JAVA_HOME
,SPARK_HOME
,HIVE_HOME
eTEZ_HOME
ao criar uma imagem personalizada. -
As imagens personalizadas não devem exceder 5 GB.
-
Se você modificar binários ou jars nas imagens base do Amazon EMR, isso poderá causar falhas no lançamento de aplicações ou trabalhos.
-
O repositório do Amazon ECR deve estar na mesma Região da AWS que você usa para iniciar aplicações do EMR Sem Servidor.