Quiero conectarme a una base de datos desde una tarea de Amazon Elastic Container Service (Amazon ECS) en AWS Fargate.
Resolución
Requisitos previos:
Nota: La siguiente resolución utiliza un motor de base de datos MySQL. Para obtener más información sobre cómo conectarte a bases de datos que utilizan otros tipos de motores, consulta Introducción a Amazon RDS.
Conexión a la tarea a la base de datos
Sigue estos pasos:
-
Crea un script de Python que se conecte a tu base de datos MySQL. El script rds.py del ejemplo siguiente envía los resultados de la conexión con la base de datos a Amazon CloudWatch:
import pymysql
import os
DATABASE_ENDPOINT = os.environ['example_endpoint']
USERNAME = os.environ['example_username']
PASSWORD = os.environ['example_password']
try:
print("Connecting to " + DATABASE_ENDPOINT)
db = pymysql.connect(host=DATABASE_ENDPOINT, user=USERNAME, password=PASSWORD)
print("Connection successful to " + DATABASE_ENDPOINT)
db.close()
except Exception as e:
print("Connection unsuccessful due to " + str(e))
Nota: Sustituye example_endpoint por el punto final de la base de datos. Sustituye example_username por tu nombre de usuario. Sustituye example_password por u contraseña.
-
Para formar una imagen, cree un Dockerfile que incluya los comandos necesarios. El siguiente archivo de ejemplo incluye los comandos necesarios:
FROM python
RUN pip install pymysql cryptography
COPY rds.py /
CMD [ "python", "/rds.py" ]
-
Crea un repositorio de Amazon Elastic Container Registry (Amazon ECR) y, a continuación, envía la imagen de Docker a ese repositorio.
-
Crea una definición de tarea y, a continuación, agrega la imagen de Docker como imagen del contenedor:
{ "executionRoleArn": "arn:aws:iam::example_account_ID:role/ecsTaskExecutionRole",
"containerDefinitions": [
{
"name": "example_app",
"image": "example_repository_URL",
"essential": true
}
],
"requiresCompatibilities": [
"FARGATE"
],
"networkMode": "awsvpc",
"cpu": "256",
"memory": "512",
"family": "example_app"
}
Nota: Sustituye example_account_ID por el ID de tu cuenta de AWS. Sustituye example_app por el nombre de tu aplicación. Sustituye example_repository_URL por la URL de tu repositorio de Amazon ECR. Se recomienda establecer los valores de las variables de entorno ENDPOINT, USER y PASS en la definición de la tarea. Puedes transmitir directamente estos valores como variables de entorno o recuperar los valores de los secretos de AWS Secrets Manager. Para obtener más información, consulta ¿Cómo puedo transmitir secretos o información confidencial de forma segura a los contenedores de una tarea de Amazon ECS?
-
Abre la consola de Amazon ECS.
-
En el panel de navegación, selecciona Definiciones de tareas.
-
Selecciona la definición de la tarea, elige Acciones y, a continuación, elige Ejecutar tarea.
-
En Tipo de lanzamiento, elige FARGATE.
-
En Clúster, elige el clúster para la definición de la tarea.
-
En Cantidad de tareas, introduce el número de tareas que deseas copiar.
-
En el apartado VPC y grupos de seguridad, elige tu Amazon Virtual Private Cloud (Amazon VPC) en VPC del clúster.
-
En Subredes, elige tus subredes.
-
En Grupos de seguridad, selecciona al menos un grupo de seguridad.
-
Elige Ejecutar tarea.
Cuando la tarea se conecta a la base de datos, el script rds.py detiene la tarea y muestra el siguiente mensaje:
"Essential container in task exited."
Confirmar que se ha conectado la tarea a la base de datos
Sigue estos pasos:
- Abre la consola de Amazon ECS.
- En el panel de navegación, selecciona Clústeres y, a continuación, elige tu clúster.
- Selecciona la pestaña Tareas.
- En Estado de tarea deseado, elige Detenido para ver una lista de las tareas detenidas.
- Elige la tarea detenida.
- En la pestaña Detalles de la tarea detenida, amplía la sección Contenedores.
- Elige Ver registros en CloudWatch.
Si has conectado correctamente la tarea a la base de datos, aparecerá el siguiente mensaje en la consola de CloudWatch:
"Connection successful to [tu punto de enlace]"