es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Despliegue de imagen Docker de Azure DevOps en instancia EC2.

Espero que alguien pueda dirigirme hacia el mejor enfoque para resolver este problema.

Tengo una cuenta de Azure en la que tengo un registro de contenedores de Azure que contiene mis imágenes de Docker. Solo con fines educativos personales, quiero intentar implementar una de las imágenes de Docker de Azure en una instancia AWS EC2.

Leyendo alguna documentación de AWS, entiendo que necesito crear un contenedor ecr y con Azure DevOps, utilizando la conexión de servicio para construir e implementar las imágenes de Docker en ecr, esto parece ser bastante sencillo. Pero después de este paso, es pura oscuridad ya que no puedo encontrar el mejor enfoque sobre cómo implementar una entrega continua cada vez que hay una nueva imagen de Docker en mi ecr.

Una de las soluciones que pensé y encontré, es instalar un agente de Azure DevOps en el EC2 para ejecutar un docker pull pero no estoy 100% seguro de si este es el mejor enfoque.

Así que les pido a ustedes expertos que me iluminen sobre esto y les pido disculpas por la pregunta básica.

Muchas gracias de antemano por cualquier ayuda que puedan proporcionar, y por favor, si mi pregunta no está 100% clara, no dude en pedir más información.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Solución para entrega continua de imágenes Docker desde Azure Container Registry a AWS EC2

    Para implementar la entrega continua de imágenes Docker desde Azure Container Registry (ACR) a AWS EC2, puede seguir estos pasos:

    1. Cree un repositorio ECR en su cuenta de AWS para almacenar las imágenes Docker que desea implementar en EC2.
    2. Configure una conexión de servicio en Azure DevOps para habilitar la integración entre ACR y DevOps.
    3. Cree un pipeline en Azure DevOps para construir y enviar imágenes Docker a ACR.
    4. Cree una función Lambda en AWS para escuchar la creación de nuevas imágenes Docker en el repositorio ECR.
    5. Configure la función Lambda para lanzar una nueva instancia EC2, descargar la última imagen Docker del repositorio ECR y ejecutarla.

    Paso 1: Cree un repositorio ECR

    1. Inicie sesión en su cuenta de AWS y vaya al servicio ECR.
    2. Haga clic en el botón “Crear repositorio” para crear un nuevo repositorio.
    3. Ingrese un nombre para su repositorio y haga clic en el botón “Crear repositorio”.

    Paso 2: Configure una conexión de servicio en Azure DevOps

    1. Inicie sesión en Azure DevOps y vaya a Configuración del proyecto.
    2. Haga clic en la pestaña “Conexiones de servicio” y haga clic en el botón “Nueva conexión de servicio”.
    3. Seleccione “Amazon Web Services” como tipo de servicio y haga clic en el botón “Siguiente”.
    4. Ingrese sus credenciales de acceso de AWS y región y haga clic en el botón “Verificar”.
    5. Una vez que la verificación sea exitosa, ingrese un nombre para la conexión de servicio y haga clic en el botón “Guardar”.

    Paso 3: Cree un pipeline en Azure DevOps

    1. Vaya a Pipelines, haga clic en el botón “Nuevo pipeline” y seleccione “Azure Repos Git” como fuente.
    2. Seleccione el repositorio que contiene el Dockerfile y haga clic en “Continuar”.
    3. Seleccione “Docker” como la plantilla y haga clic en “Aplicar”.
    4. Configure el pipeline con la siguiente configuración:
      • Elija su grupo de agentes.
      • Configure el registro de contenedores en su ACR.
      • Configure el comando para construir, etiquetar y enviar la imagen Docker.
      • Defina variables para la ruta del archivo Dockerfile, la etiqueta de la imagen y la conexión de servicio.
    5. Guarde y ejecute el pipeline para construir y enviar la imagen Docker a ACR.

    Paso 4: Cree una función Lambda en AWS

    1. Inicie sesión en su cuenta de AWS y vaya al servicio Lambda.
    2. Haga clic en el botón “Crear función” y elija la opción “Crear desde cero”.
    3. Ingrese un nombre para su función, seleccione Python como tiempo de ejecución y elija un rol IAM existente o cree uno nuevo con los permisos necesarios.
    4. Haga clic en el botón “Crear función” para crear su nueva función Lambda.
    5. Desplácese hacia abajo hasta la sección “Código de función” y pegue el siguiente código de Python:
    import boto3
    import os
    import subprocess
    
    def lambda_handler(event, context):
        client = boto3.client('ec2')
    
        response = client.describe_instances(Filters=[{'Name': 'tag:Name', 'Values': ['MyInstance']}])
        if len(response['Reservations']) > 0:
            instance_id = response['Reservations'][0]['Instances'][0]['InstanceId']
            print(instance_id)
            subprocess.run(['ssh', '-i', '/path/to/keyfile.pem', 'user@hostname', f'/home/user/pulllatestdocker.sh {event['detail']['image-tags'][0]} {event['detail']['repository-name']} {event['account']} {event['region']}'], check=True)
        else:
            print('No instance found.')
    
    1. Reemplace el valor de la etiqueta MyInstance con el nombre de su instancia EC2.
    2. Modifique la ruta hacia su archivo de clave y el nombre de host SSH en el comando subprocess.run según sea necesario.
    3. Guarde y pruebe la función Lambda para asegurarse de que funcione.

    Paso 5: Configure la función Lambda para lanzar una nueva instancia EC2, descargar la última imagen Docker y ejecutarlo

    1. Modifique el comando subprocess.run en el código de Lambda para lanzar una nueva instancia EC2 si no se encuentra ninguna instancia.
    2. Cree un archivo de script shell en su instancia EC2 con el siguiente contenido:
    #!/bin/sh
    image_tag=$1
    repository_name=$2
    account=$3
    region=$4
    
    aws ecr get-login-password --region $region | docker login --username AWS --password-stdin $account.dkr.ecr.$region.amazonaws.com
    docker pull $account.dkr.ecr.$region.amazonaws.com/$repository_name:$image_tag
    docker run -d $account.dkr.ecr.$region.amazonaws.com/$repository_name:$image_tag
    
    1. Asegúrese de que el script shell sea ejecutable (chmod +x <nombre_archivo>).
    2. Instale AWS CLI y Docker en su instancia EC2.
    3. Configure su instancia EC2 para permitir tráfico SSH entrante en el puerto 22.
    4. Agregue una etiqueta a su instancia EC2 con la clave “Nombre” y un valor “MyInstance”.
    5. Modifique los permisos del rol IAM para la función Lambda para permitir la creación de instancias EC2 y llamadas de descripción.

    Ahora, cada vez que se envíe una nueva imagen Docker a ACR, la función Lambda lanzará una instancia EC2, descargará la última imagen Docker y la iniciará automáticamente.

Comments are closed.