Criando uma imagem customizada Docker Java 8/Maven 3.6 e armazenando no AWS ECR para usar com AWS CodeBuild

Rodolfo Costa
5 min readSep 22, 2021

Dependendo das ferramentas utilizadas em um pipeline automatizado de CI/CD podemos, as vezes, cair em problemas por estar usando as ferramentas padrão fornecidas pelos serviços que operamos. Isso, infelizmente, ocorreu em nossa equipe.

Nós utilizamos o AWS CodeBuild para construir e implantar aplicações em diferentes linguagens. Para isso, precisamos especificar a versão do runtime na qual executaremos nosso pipeline. AWS tem uma lista de versões disponíveis para múltiplas linguagens e escolhemos uma das compatíveis com Java.

Fizemos um uso contínuo desse runtime até um dia em que não conseguimos de jeito nenhum executar o pipeline. O problema: o runtime vem, por padrão, com uma versão de Maven incompatível com as nossas aplicações por ser mais antiga que Maven 3.6. Então, era necessário atualizar os pacotes Linux para que pudéssemos atualizar a versão do Maven para aque precisávamos antes de executar os comandos de construção, mas, por algum motivo desconhecido, a nossa conta AWS não conseguia se conectar a esses repositórios.

Para contornarmos esse problema, uma solução foi criar uma imagem Docker customizada que contivesse todos os recursos necessários em suas respectivas versões. Foi nesse contexto que a imagem customizada Docker com Java 8 e Maven 3.6.3 surgiu.

A imagem

Assim, nossa imagem customizada é criada a partir desse simples arquivo Dockerfile:

Usamos a imagem base “maven:3.6.3-openjdk-8” fornecida pelo próprio Maven na sua página no Docker Hub (https://hub.docker.com/_/maven), que vem com o OpenJDK 8 e o Maven 3.6.3 já instalados. Com isso, nós instalamos zip, unzip, curl e o awscli para que possamos trabalhar com os serviços AWS que utilizamos para implantar nossas aplicações.

Depois de construída, essa imagem conterá as seguintes tecnologias:

  • Java 8 (com OpenJDK 8)
  • Apache Maven 3.6.3
  • AWS Command Line Interface (CLI) versão 2

Legal! Agora como que armazenaremos na AWS ECR?

Antes de construir e publicar essa imagem Docker customizada, devemos primeiro criar um repositório na AWS ECR como demonstrado abaixo:

Definindo o nome do repositório
Habilitando “escanear ao publicar” (por questões de segurança)

Por questões de segurança, criamos um repositório privado com o nome “codebuild/custom-maven-3–6–3-openjdk-8” dado que queremos que apenas o AWS CodeBuild tenha acesso a essa imagem. Para habilitar esse acesso, precisamos adicionar a seguinte permissão nas permissões do repositório:

{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "CodeBuildAccess",
"Effect": "Allow",
"Principal": {
"Service": "codebuild.amazonaws.com"
},
"Action": [
"ecr:BatchGetImage",
"ecr:GetDownloadUrlForLayer"
]
}
]
}

Para adicionar essa permissão, devemos selecionar nosso repositório clicando em seu nome e, em seguida, acessar o menu “Permissões” dentro de “Repositórios”.

Menu Permissões

Após adicionar a política JSON, as permissões estarão assim:

Política definida

Quero publicar!

Com o Docker instalado em sua máquina, depois de criar o repositório, AWS fornece os comandos necessários para que possamos publicar uma imagem no repositório clicando no botão “Ver comandos para publicar”. Supondo que a conta AWS tenha os dados

  • Id da conta AWS: 123456
  • Região do repositório AWS ECR: us-east-1
  • Nome do repositório AWS ECR: codebuild/custom-maven-3–6–3-openjdk-8
  • Tag da imagem: 1.0

e o seu usuário padrão configurado dentro do arquivo “~/.aws/credentials”, que o awscli utiliza, possua a política “AmazonEC2ContainerRegistryFullAccess”, os comandos serão:

  1. Autenticar seu cliente Docker com o registry
aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin 123456.dkr.ecr.us-east-1.amazonaws.com

2. Construir nossa imagem Docker customizada

docker build -t my-custom-image:maven-3-6-3-openjdk-8 .

3. Taggear nossa imagem

docker tag my-custom-image:maven-3-6-3-openjdk-8 123456.dkr.ecr.us-east-1.amazonaws.com/codebuild/custom-maven-3-6-3-openjdk-8:1.0

4. Publicar no repositório

docker push 123456.dkr.ecr.us-east-1.amazonaws.com/codebuild/custom-maven-3-6-3-openjdk-8:1.0

Após executá-los, a imagem deve estar em nosso repositório.

Imagem armazenada

Com essa configuração, podemos finalmente atualizar o ambiente do nosso projeto CodeBuild para utilizar essa imagem customizada por meio do menu “Editar” > “Ambiente”.

Configurações da imagem do ambiente CodeBuild

Agora sim!! Porém, antes de executar sua próxima construção (build), é necessário atualizar seu arquivo buildspec e remover o trecho de código referente ao uso do antigo runtime e pronto! Agora você tem um projeto CodeBuild usando uma imagem runtime customizada.

Conclusão

Mesmo sabendo que é sempre mais fácil usar ferramentas padrão fornecidas pelos serviços que utilizamos, as vezes podemos precisar de soluções personalizadas para aumentar a confiabilidade e estabilidade de nossos processos.

O caso demonstrado aqui pode ser aplicado em qualquer projeto com qualquer linguagem, bastando apenas modificar a imagem base a ser utilizada, o que, indiretamente, ajuda na padronização do processo de CI/CD dentro dos projetos da equipe.

Referências

--

--

Rodolfo Costa
Rodolfo Costa

Written by Rodolfo Costa

Software Engineer and Tech lover

No responses yet