Skip to content

Convierte tu bucket de S3 en un Repositorio de Maven

8 noviembre 2014

apache-maven-project

 

El objetivo de este post es mostrar cómo podemos tener un repositorio Maven al estilo de Artifactory o Nexus, pero en un Bucket de S3.

Y quizás, la pregunta sea: ¿Y para qué quiero hacer eso?

Por mi parte, he encontrado varias respuestas a esa pregunta que me compensan y que me han animado a buscar esta alternativa.

  1. Me olvido de tener que mantener un servidor físico y que esté operativo el 100% del tiempo
  2. Tengo mis artefactos en alta disponibilidad y replicados en múltiples zonas de disponibilidad
  3. Utilizando CloudFront junto con S3 puedo tener una baja latencia de acceso en cualquier parte del mundo
  4. Puedo controlar la privacidad de mis artefactos de forma granular y controlar el acceso al bucket de forma muy precisa con las políticas IAM de AWS
  5. No tengo que preocuparme por la cantidad de artefactos que estemos almacenando y el tamaño que ocupen
  6. Los tiempos de lectura y escritura son difícilmente mejorables por un servidor tradicional
  7. Puedo acceder a los artefactos desde cualquier lugar
  8. Los precios de S3 son muy asequibles
  9. Puedo utilizar la consola de AWS para gestionar mis artefactos, las herramientas AWS-CLI, o los plugins para los navegadores

Vamos a ver cómo configuramos todo para tener nuestro repositorio en S3. Es terriblemente sencillo.

 1. Cuenta en AWS, Bucket en S3 y definición de Política IAM

Lo primero de todo será disponer de una cuenta en AWS y tener acceso a la Consola: http://aws.amazon.com/es/console/

Y, por supuesto, crear nuestro Bucket: http://docs.aws.amazon.com/AmazonS3/latest/gsg/CreatingABucket.html

Una vez que tengamos nuestro Bucket podemos crear un usuario IAM y darle acceso únicamente al Bucket recién creado y con permisos restringidos. De este modo, cuando generemos nuestro AccessKey y SecretKey, nos aseguraremos de que seguimos el patrón de privilegios mínimos. El AccessKey y el SecretKey son necesarios para que al hacer mvn deploy, pueda acceder a nuestro bucket y desplegar nuestros artefactos.

Os dejo aquí una copia de la política de IAM que estoy utilizando actualmente:

{
 "Statement":[
 {
    "Action": [
      "s3:ListAllMyBuckets",
      "s3:GetBucketLocation"
    ],
    "Effect": "Allow",
    "Resource": [
      "arn:aws:s3:::myBucket"
    ]
  },
{
 "Effect":"Deny",
 "Action": [
   "s3:ListBucket",
   "s3:ListBucketMultipartUploads",
   "s3:ListBucketVersions"
 ],
 "Resource":"arn:aws:s3:::myBucket",
 "Condition":{
   "StringLike":{
     "s3:prefix":"*/*"
   },
   "StringNotLike": {
     "s3:prefix": ["maven/*"]
   }
  }
 },
 {
  "Effect":"Allow",
  "Action":  [
   "s3:ListMultipartUploadParts",
   "s3:AbortMultipartUpload",
   "s3:*Acl*",
   "s3:GetObject",
   "s3:PutObject"
  ],
  "Resource":"arn:aws:s3:::myBucket/maven/*"
 }
 ]
}

NOTA: Las partes en rojo son las que hay que cambiar en función del nombre del Bucket y de la ruta de nuestro repositorio. En mi caso he creado un bucket que se llama myBucket y dentro tiene una “carpeta” que se llama maven, que es dónde estará mi repositorio de Maven.

 

2. Conector Wagon con S3

Wagon es el “protocolo” que utiliza Maven para “hablar” con sus repositorios. Por tanto necesitaremos una pieza de software que sea capaz de comunicarse con S3 mediante Wagon durante la fase de Deploy de Maven.

Lo bueno, es que no es necesario realizar ningún tipo de implementación en este punto, ya que la gente de Spring ha liberado una implementación para realizar exactamente esta tarea.

https://github.com/spring-projects/aws-maven

Por tanto, es simplemente añadir esta extensión en nuestro fichero pom.xml y estaremos listos para funcionar:

<build>
   ...
   <extensions>
        <extension>
            <groupId>org.springframework.build</groupId>
            <artifactId>aws-maven</artifactId>
            <version>5.0.0.RELEASE</version>
        </extension>
    </extensions>
   ...
</build>

Sólo nos quedan dos pasos más: Configurar nuestro settings.xml de Maven y volver a nuestro pom.xml para añadir la configuración de distributionManagement y repositories.

 

3. Configurar en conf/settings.xml de Maven los credenciales AWS

En este paso, vamos a configurar las credenciales AWS (AccessKey y SecretKey) que hemos generado anteriormente, para que Maven pueda utilizarlas al desplegar nuestros artefactos y cuando necesitemos resolver nuestras dependencias contra el Bucket de S3.

Para ello, dentro de la etiqueta <servers> de nuestro settings.xml, tendremos que añadir un par de <server>, uno para la rama release y otro para la rama snapshot (como mínimo):

<servers>
   <!-- S3 Access -->
   <server>
       <id>s3-release</id>
       <username>MyAccessKey</username>
       <password>MySecretKey</password>
   </server>
   <server>
       <id>s3-snapshot</id>
       <username>MyAccessKey</username>
       <password>MySecretKey</password>
   </server>
</servers>

El texto marcado en rojo sería el que deberemos cambiar por los datos reales obtenidos mientras creabamos al usuario IAM en el punto 1.

El texto en verde, lo necesitaremos en el siguiente paso.

4. Añadir la información de DistributionManagement y Repositories a nuestro pom.xml

Esta configuración debemos añadirla en cada pom.xml de cada proyecto en el que queramos hacer uso de S3 como repositorio de Maven durante la fase deploy.

Debemos añadir varios elementos a nuestro pom:

  1. distributionManagement: Para indicar la url de nuestros repositorios a los que se hará el deploy
  2. repositories: Para indicar la url del repositorio desde donde se resolverán las dependencias necesarias

Puede que haya proyectos en los que únicamente necesitemos resolver nuestras dependencias contra S3 y por tanto el punto 1 de distributionManagement no será necesario y al revés, puede que haya proyectos dónde únicamente necesitemos desplegar a S3 y por tanto el punto 2, no será necesario.

<!-- 1. Despliegue a S3 -->
<distributionManagement>
    <repository>
        <id>s3-release</id>
        <name>AWS S3 Release Repository</name>
        <url>s3://myBucketUrl/maven/release</url>
    </repository>
    <snapshotRepository>
        <id>s3-snapshot</id>
        <name>AWS S3 Snapshot Repository</name>
        <url>s3://myBucketUrl/maven/snapshot</url>
    </snapshotRepository>
</distributionManagement>

<repositories>
   ...
    <!-- 2. Resuelve contra S3 -->
    <repository>
        <id>s3-release</id>
        <name>AWS S3 Release Repository</name>
        <url>s3://myBucketUrl/maven/release</url>
    </repository>
   ...
</repositories>

De nuevo, el texto en rojo deberíamos reemplazarlo por los datos reales.

El texto en verde, debemos prestar atención para que coincida con el definido anteriormente en el fichero settings.xml de Maven.

 

5. Lecturas recomendadas

Y ya sabéis, cualquier consulta, duda, mejora, sugerencia, … será siempre bien recibida 😉

Anuncios
No comments yet

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: