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>/