Saltar al contenido principal

Usar AWS CodeArtifact con proyectos Java/Maven

Configurá un proyecto Java Maven para resolver dependencias desde AWS CodeArtifact — un repositorio privado de artefactos — dentro de un build Dockerizado, con ejemplos de pipelines CI/CD.

Prerrequisitos

  • Un dominio y repositorio en AWS CodeArtifact ya creados
  • Credenciales IAM con permisos codeartifact:GetAuthorizationToken y codeartifact:ReadFromRepository
  • Docker y Maven instalados

Paso 1 — Crear codeartifact_settings.xml

Este archivo configura Maven para autenticarse con CodeArtifact usando un token inyectado como variable de entorno:

<settings>
<servers>
<server>
<id>codeartifact</id>
<username>aws</username>
<password>${env.CODEARTIFACT_AUTH_TOKEN}</password>
</server>
</servers>
<mirrors>
<mirror>
<id>codeartifact</id>
<url>${env.CODEARTIFACT_REPOSITORY}</url>
<mirrorOf>*</mirrorOf>
</mirror>
</mirrors>
</settings>

Paso 2 — Dockerfile con autenticación a CodeArtifact

Usá un build multi-stage para que el token de autenticación nunca quede en la imagen final:

# Etapa de build
FROM maven:3.9-eclipse-temurin-21 AS build

# Instalar AWS CLI
RUN curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" \
&& unzip awscliv2.zip \
&& ./aws/install

# Credenciales AWS como build args (no se almacenan en la imagen final)
ARG CODEARTIFACT_ACCESS_KEY_ID
ARG CODEARTIFACT_SECRET_ACCESS_KEY
ARG CODEARTIFACT_REGION
ARG CODEARTIFACT_ACCOUNT_ID
ARG CODEARTIFACT_REPOSITORY
ARG CODEARTIFACT_DOMAIN

# Establecer directorio de trabajo y copiar código fuente
WORKDIR /app
COPY . .

# Copiar settings de Maven apuntando a CodeArtifact
COPY codeartifact_settings.xml /root/.m2/settings.xml

# Generar token y construir
RUN export AWS_ACCESS_KEY_ID=$CODEARTIFACT_ACCESS_KEY_ID \
&& export AWS_SECRET_ACCESS_KEY=$CODEARTIFACT_SECRET_ACCESS_KEY \
&& export CODEARTIFACT_AUTH_TOKEN=$(aws codeartifact get-authorization-token \
--domain $CODEARTIFACT_DOMAIN \
--domain-owner $CODEARTIFACT_ACCOUNT_ID \
--region $CODEARTIFACT_REGION \
--query authorizationToken --output text) \
&& mvn clean install -s /root/.m2/settings.xml

# Etapa de runtime — sin credenciales
FROM eclipse-temurin:21-jre
COPY --from=build /app/target/app.jar /app.jar
ENTRYPOINT ["java", "-jar", "/app.jar"]

Paso 3 — Docker Compose (build args)

build:
args:
CODEARTIFACT_ACCESS_KEY_ID: $CODEARTIFACT_ACCESS_KEY_ID
CODEARTIFACT_SECRET_ACCESS_KEY: $CODEARTIFACT_SECRET_ACCESS_KEY
CODEARTIFACT_REGION: $CODEARTIFACT_REGION
CODEARTIFACT_ACCOUNT_ID: $CODEARTIFACT_ACCOUNT_ID
CODEARTIFACT_REPOSITORY: $CODEARTIFACT_REPOSITORY
CODEARTIFACT_DOMAIN: $CODEARTIFACT_DOMAIN

Paso 4 — Configuración del Pipeline CI/CD

# .github/workflows/maven.yml
name: Build and Deploy to CodeArtifact

on:
push:
branches: [main]

jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: Configurar JDK 21
uses: actions/setup-java@v4
with:
java-version: '21'
distribution: 'temurin'

- name: Configurar credenciales AWS
uses: aws-actions/configure-aws-credentials@v4
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ${{ secrets.AWS_REGION }}

- name: Obtener token CodeArtifact
run: |
echo "CODEARTIFACT_AUTH_TOKEN=$(aws codeartifact get-authorization-token \
--domain ${{ secrets.CODEARTIFACT_DOMAIN }} \
--domain-owner ${{ secrets.CODEARTIFACT_ACCOUNT }} \
--query authorizationToken --output text)" >> $GITHUB_ENV

- name: Build y Deploy
run: mvn -s codeartifact_settings.xml clean package deploy

Buenas Prácticas

  • Evitá credenciales en imágenes finales: Usá builds multi-stage para que los tokens solo estén presentes durante la etapa de construcción.
  • Usá IAM Roles en AWS: En EC2, ECS o EKS, reemplazá las access keys con roles IAM para gestión automática de credenciales.
  • Cache local de Maven: Montá .m2 como volumen (-./.m2:/root/.m2) para acelerar builds posteriores.

Solución de Problemas

ErrorCausaSolución
Token expiradoLos tokens de CodeArtifact tienen validez de 12 horasAsegurate de que el build no supere este tiempo
Permisos insuficientesPolítica IAM incorrectaVerificar que codeartifact:GetAuthorizationToken y codeartifact:ReadFromRepository están habilitados
URL incorrectaFormato del repositorio incorrectoUsar https://<dominio>-<cuenta>.d.codeartifact.<región>.amazonaws.com/maven/<repo>/