¿Cómo eliminar imágenes antiguas y sin etiquetar de AWS ECR?

Amazon ECR está integrado con Amazon Elastic Kubernetes Service (Amazon EKS), Amazon Elastic Container Service (Amazon ECS) y AWS Lambda, lo que simplifica su flujo de trabajo desde el desarrollo hasta la producción.

Amazon ECR aloja las imágenes en una arquitectura altamente escalable y disponible, lo que le permite implementar contenedores de manera confiable para sus aplicaciones. Es importante eliminar las imágenes antiguas y sin etiquetar para mantener la higiene.

Hoy en día, las aplicaciones se ejecutan como microservicios. El término microservicio no es más que un contenedor que empaqueta todo el código y sus dependencias para que la aplicación pueda ejecutarse de manera rápida y confiable en cualquier entorno informático. Debido a su portabilidad, tamaño pequeño y comodidad, los contenedores se están convirtiendo en un método de elección para las aplicaciones modernas de envío.

Los contenedores están diseñados a partir de una plantilla de solo lectura llamada imagen. Estas imágenes deben almacenarse en algún lugar para que puedan ser recuperadas por cualquier máquina autorizada para usarlas.

Ahí es donde entra en juego un registro de contenedores. No hace mucho tiempo, la gente usaba DockerHub para almacenar estas imágenes y artefactos. Pero, si está utilizando los servicios en la nube de AWS, estoy seguro de que ya está utilizando AWS ECR, que es una alternativa a DockerHub.

AWS ECR es un registro de contenedores totalmente administrado que proporciona alojamiento de alto rendimiento, lo que le permite implementar artefactos e imágenes de aplicaciones en forma de repositorios públicos y privados.

Todos los días, múltiples aplicaciones alojadas en AWS envían y extraen millones de imágenes/artefactos de aplicaciones dentro y fuera de repositorios de ECR específicos.

En este artículo, analizaremos cómo borrar AWS ECR antiguo y obsoleto y mantener limpios los repositorios de ECR.

La necesidad: ¡Elimine imágenes antiguas y sin etiquetar ahora!

La razón principal para limpiar los depósitos de ECR es la higiene del desarrollo. En ningún momento, nadie querría mantener imágenes de más de diez implementaciones en sus ECR. También se debe a que las reversiones ocurren con frecuencia en la industria, pero una reversión que revierte el cambio de 5 artefactos anteriores es poco frecuente.

En términos más simples, cualquier imagen/artefacto que tenga más de cinco implementaciones es inútil. Está sujeto a cambios en el informe de estrategia de su organización, pero no lo recomendaríamos como práctica recomendada.

En toda la industria, el etiquetado se utiliza para especificar las imágenes más recientes o las últimas cinco imágenes más estables. Como parte del ciclo de vida del desarrollo de software, las imágenes se generan rápidamente y estas etiquetas se reemplazan con imágenes nuevas, dejando las imágenes más antiguas sin etiquetar e inútiles.

En situaciones como esta, donde las imágenes/artefactos son grandes, también agregará cargos de almacenamiento en ECR. El precio de AWS ECR es “$0.10 por GB/mes para datos almacenados en repositorios privados o públicos”.

Este precio puede parecerte pequeño, pero como dicen, las gotas forman el océano. Todas estas imágenes, si se almacenan durante un período más largo, agregarán facturas más altas a sus facturas de AWS.

¡La sugerencia es eliminar estas imágenes antiguas y sin etiquetar de sus repositorios de ECR porque no las necesita! ¡Simple! ¿Por qué conservarlo y pagarlo?

Eliminación manual de imágenes de AWS ECR

Método 1: ¡La manera GUI!

Paso 1: inicie sesión en la cuenta de Amazon Web Services y diríjase al repositorio que desea borrar.

Paso 2: aquí puede ver que el repositorio tiene la etiqueta más reciente para especificar la versión más estable. Las otras etiquetas que ve se pueden llamar sin etiquetar. Para eliminar, solo necesitamos seleccionar la imagen y hacer clic en eliminar.

Paso 3: Confirmar para eliminar

Método 2: ¡El estilo CLI!

Para eliminar una imagen mediante la CLI, necesitará todas las claves de acceso de AWS IAM configuradas en su máquina y el permiso de IAM requerido para darle acceso a los repositorios.

En este caso, ya lo hemos configurado. Puede hacerlo desde la guía de conceptos básicos de configuración de AWS si aún no lo ha hecho.

Si no está seguro de haber configurado AWS CLI en su máquina, use el siguiente comando para verificar.

aws sts get-caller-identity

Ahora que hemos confirmado que podemos usar la CLI de AWS, puede usar el siguiente comando para eliminar una imagen de ECR sin etiquetar.

aws ecr batch-delete-image --repository-name test-ecr-policy --image-ids imageTag=custom-image-6

Aquí estamos haciendo algo similar a lo que hicimos en la GUI. Eliminaremos la imagen etiquetada como custom-image-6 que reside en el repositorio test-ecr-policy.

Método 3: ¡La forma de secuencias de comandos!

El requisito previo para este método es tener una clave de acceso de AWS configurada en la máquina en la que se está ejecutando.

Script para eliminar imágenes sin etiquetar.

import boto3

client = boto3.client('ecr')

response = client.list_images(repositoryName="test-ecr-policy")

untaggedImageList = [image for image in response['imageIds'] if image['imageTag'] == 'custom-build-4']

response2 = client.batch_delete_image(repositoryName="aws-test-ecrpolicy", imageIds=untaggedImageList)

print(response2)

La respuesta le daría la lista de ID de imágenes eliminadas, junto con una falla si hubiera alguna.

Método de programación para eliminar imágenes ECR

Si es un ingeniero de DevOps o administra AWS ECR con regularidad, ya conocerá las molestias de eliminar estas imágenes manualmente.

Ejecutar el script/comando facilita las cosas, pero estamos seguros de que hubieras deseado algo que eliminara automáticamente estas imágenes sin que tengas que preocuparte por ellas.

Buenas noticias, AWS ECR ofrece una política de ciclo de vida para sus imágenes, que puede configurar para eliminar estas imágenes de manera oportuna o programada. Veamos cómo hacerlo.

Método 1: ¡La manera GUI!

Paso 1: diríjase al repositorio donde desea establecer la política de ciclo de vida. En el panel izquierdo, puede ver la Política de ciclo de vida. Puede hacer clic en él para comenzar.

Paso 2: puede hacer clic en él y crear su primera regla.

Paso 3: ECR le permite eliminar imágenes en dos condiciones, una es si sus imágenes tienen días específicos de antigüedad o si están etiquetadas/sin etiquetar, y desea conservarlas solo durante, digamos, X días.

Veamos cómo se hace. Ahora puede establecer si desea eliminar las imágenes sin etiquetar si tienen un día o más o si el recuento de imágenes sin etiquetar supera una.

Elija según su caso de uso. no lo olvides; puede aumentar estos números al número de su elección. Guarde para activar la regla del ciclo de vida.

Método 2: ¡El estilo CLI!

El comando de la CLI de AWS ECR para establecer la política del ciclo de vida es put-lifecycle-policy.

Veamos cómo hacerlo. Para esto, debe crear un archivo JSON que enumere las condiciones de la política. Puede nombrarlo policy.json o cualquier nombre que elija.

Pero antes de eso, veamos los elementos de la política de ciclo de vida.

rulePriority (Type: integer, Required: yes):

Orden de reglas de menor a mayor. Las reglas de política de ciclo de vida con prioridad uno se aplican primero, luego 2, etc. Cada una de las reglas de política de ciclo de vida debe tener un valor de regla único.

Las reglas de política no necesitan valores consecutivos. Cualquier regla etiquetada debe tener la rulePriority más alta y revisarse en último lugar.

description (Type: string, Required: no):

Explica para qué sirve una regla en una política de ciclo de vida.

tagStatus (Type: string, Required: yes):

Comprueba si la regla de política de ciclo de vida agregada especifica una etiqueta de imagen. Etiquetado, sin etiquetar o cualquiera está bien. Si no se especifica ninguno, se evalúan todas las imágenes. Tagged requiere un valor de tagPrefixList. Untagged requiere omitir tagPrefixList.

tagPrefixList (Type: list[string], Required: yes, only if tagStatus is set to tagged):

Si «tagStatus» es «etiquetado», su política de ciclo de vida requiere una lista de prefijos de etiquetas de imagen separados por comas.

Usando el prefijo de etiqueta prod, puede especificar todas las imágenes marcadas prod, prod1, prod2, etc. Múltiples etiquetas seleccionan solo imágenes con todas las etiquetas.

countType (Type: string, Required: yes):

Especifique countNumber si countType es imageCountMoreThan para limitar la cantidad de imágenes en su repositorio.

Especifique countUnit y countNumber si countType es sinceImagePushed para limitar las imágenes del repositorio.

countUnit (Type: string, Required: yes, only if countType is set to sinceImagePushed):

Solo especifique una unidad de conteo cuando countType sea sinceImagePushed; de lo contrario, se produce un error.

countNumber (Type: integer, Required: yes):

Solo números enteros positivos (0 no es un valor aceptado). Si countType es imageCountMoreThan, el valor es el número máximo de fotografías que se pueden conservar. El uso de sinceImagePushed como countType determina la antigüedad máxima de la imagen.

 type (Type: string, Required: yes):

Elige un tipo de acción. El valor que se puede utilizar es «expire».

Aquí está mi «policy.json».

{

"rules": [

{

"rulePriority": 1,

"description": "Expire images older than 10 days",

"selection": {

"tagStatus": "untagged",

"countType": "sinceImagePushed",

"countUnit": "days",

"countNumber": 14

},

"action": {

"type": "expire"

}

}

]

}

De acuerdo a los requerimientos de su organización. «sinceImagePushed» se puede reemplazar con «imageCountMoreThan».

El comando CLI para establecer esta política sería:

aws ecr put-lifecycle-policy --repository-name "test-ecr-polict" --lifecycle-policy-text "file://policy.json"

Método 3: ¡La forma de secuencias de comandos!

Usaremos el comando boto3 para lograr esto. Podemos usar el mismo «policy.json» para configurar esto. A continuación se muestra el fragmento de código utilizado.

import boto3

client = boto3.client('ecr')

response = client.put_lifecycle_policy(
registryId='PODES12342',
repositoryName="test-ecr-policy",
lifecyclePolicyText="plicy.json"
)

print(response)

¿Cómo aplicar una política única en varios repositorios de ECR?

A menudo, hay preguntas sobre cómo aplicar la misma política en varios repositorios.

Es una tarea repetitiva y aburrida establecer políticas manualmente.

Aquí hay un fragmento de código que se puede usar en el sistema de producción para aplicar una política en más de 100 repositorios.

from boto3 import Session,client

from os import getenv
AWS_ACCESS_KEY_ID = getenv("ACCESSKEY")


AWS_SECRET_ACCESS_KEY = getenv("SECRETKEY")
session = Session(
aws_access_key_id=AWS_ACCESS_KEY_ID,
aws_secret_access_key=AWS_SECRET_ACCESS_KEY
)

client = client('ecr')

response = client.describe_repositories()

repositories = response['repositories']

globalLifecyclePolicy = 'put your policy here’’

for repo in repositories:

repoName = repo['repositoryName']

client.put_lifecycle_policy( repositoryName = repoName,lifecyclePolicyText = globalLifecyclePolicy)

Conclusión

Podemos construir fácilmente una política de ciclo de vida de ECR y destruir imágenes más antiguas de acuerdo con los parámetros especificados. AWS proporciona una amplia documentación, así como ejemplos de políticas de ciclo de vida.

También puede experimentar con políticas alternativas para imágenes etiquetadas, como la coincidencia de criterios con la fecha en que se cargó la imagen.

También puede explorar algunas terminologías clave de AWS que mejoran su aprendizaje de AWS.