¿Cómo puedo detener una instancia de Amazon RDS durante más de siete días?
Última actualización: 26-01-2023
Quiero detener una instancia de Amazon Relational Database Service (Amazon RDS) durante más de siete días.
Descripción breve
Puede comenzar y detener sus instancias de Amazon RDS en minutos. Esta característica permite ahorrar costes para las bases de datos que no tienen que estar ejecutándose todo el tiempo. Puede detener una instancia de base de datos durante un máximo de siete días. Si no comienza manualmente la instancia de base de datos transcurridos siete días, la instancia comienza automáticamente. Esto sucede para que la instancia no se pierda las actualizaciones de mantenimiento necesarias para el equipo, el sistema operativo subyacente o la versión del motor de base de datos.
Para detener su instancia de RDS durante más de siete días sin perder las actualizaciones de mantenimiento requeridas, siga estos pasos:
1. Configure los permisos de AWS Identity Access Management (IAM) para permitir que AWS Lambda haga lo siguiente: Iniciar la instancia. Detener la instancia. Recuperar información de la instancia.
2. Agregar etiquetas para las instancias de RDS que quiera comenzar y detener automáticamente.
3. Crear una función de Lambda para comenzar la instancia de base de datos.
4. Crear una función de Lambda para detener la instancia de base de datos.
5. Crear una programación para hacer lo siguiente: comenzar una instancia de base de datos al principio del periodo de mantenimiento semanal. Detener una instancia de base de datos al final del periodo de mantenimiento.
Resolución
Configurar permisos de IAM
Cree una política de IAM para permitir que Lambda comience y detenga la instancia y recupere información de la instancia.
1. Abra la consola de IAM.
2. En el panel de navegación, elija Políticas.
3. Elija Create policy (Crear política).
4. Elija la pestaña JSON.
5. Copie la siguiente política y péguela en la pestaña JSON para conceder los permisos de IAM necesarios:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"rds:StartDBCluster",
"rds:StopDBCluster",
"rds:ListTagsForResource",
"rds:DescribeDBInstances",
"rds:StopDBInstance",
"rds:DescribeDBClusters",
"rds:StartDBInstance"
],
"Resource": "*"
}
]
}
6. Elija Next: Tags (Siguiente: etiquetas).
7. (Opcional) Para agregar una etiqueta, elija Add tag (Agregar etiqueta) y, a continuación, ingrese los valores adecuados en los campos Key (Clave) y Value - optional (Valor: opcional).
8. Elija Next: Review (Siguiente: revisión).
9. En la página Review policy (Revisar política), en Name (Nombre), ingrese el nombre de su política. Revise la sección Summary (Resumen) para ver los permisos que concede su política.
10. Elija Create policy (Crear política).
Para obtener más información, consulte Creación de políticas en la pestaña JSON.
Cree un rol de IAM y, a continuación, adjunte las políticas necesarias
1. Abra la consola de IAM.
2. En el panel de navegación, elija Roles (Roles).
3. Elija Create role (Crear rol).
4. En Select type of trusted entity (Seleccionar el tipo de entidad de confianza), elija AWS service (Servicio de AWS).
5. En Or select a service to view its use cases (O seleccione un servicio para ver sus casos de uso), elija Lambda.
6. Elija Next: Permissions (Siguiente: permisos).
7. En Filter-policies (Políticas de filtro), ingrese el nombre de la política que creó en la sección anterior. Cuando aparezca, seleccione la política. En Filter-policies (Políticas de filtro), ingrese AWSLambdaBasicExecutionRole. Cuando aparezca, seleccione la política gestionada AWSLambdaBasicExecutionRole.
8. Elija Next: Tags (Siguiente: etiquetas).
9. (Opcional) Para agregar una etiqueta, ingrese los valores adecuados en los campos Key (Clave) y Value (optional) (Valor [opcional]).
10. Elija Next: Review (Siguiente: revisión).
11. En la página Create role (Crear rol), en Role name (Nombre del rol), ingrese el nombre del rol que va a crear.
12. Elija Create role (Crear rol).
Para obtener más información, consulte Creación de un rol para un servicio de AWS (consola).
Agregar etiquetas para instancias de base de datos.
1. Abra la consola de Amazon RDS.
2. En el panel de navegación, elija Databases (Bases de datos).
3. Elegir la instancia de base de datos que desee comenzar y detener automáticamente.
4. En la sección de detalles, desplácese hacia abajo hasta la sección Tags (Etiquetas).
5. En la pestaña Tags (Etiquetas), elija Add (Agregar). En Tag key (Clave de etiqueta), ingrese autostart. En Value (Valor), ingrese yes. Elija Add (Agregar) para guardar los cambios.
6. Vuelva a elegir Add (Agregar). En Tag key (Clave de etiqueta), ingrese autostop. En Value (Valor), ingrese yes. Elija Add (Agregar) para guardar los cambios.
Para obtener más información, consulta Agregar, publicar y quitar etiquetas.
Crear una función Lambda para comenzar las instancias de base de datos etiquetadas
1. Abra la consola de Lambda.
2. En el panel de navegación, elija Functions (Funciones).
3. Elija Create function (Crear función).
4. Elija Author from scratch (Crear desde cero).
5. En Function name (Nombre de la función), ingrese el nombre de la función.
6. En Runtime (Tiempo de ejecución), seleccione Python 3.7.
7. En Architecture (Arquitectura), mantenga la selección predeterminada de x86_64.
7. Amplíe Change default execution role (Cambiar rol de ejecución predeterminado).
8. En Execution role (Rol de ejecución), elija Use an existing role (Usar un rol existente).
9. En Existing role (Rol existente), seleccione el rol de IAM que creó anteriormente.
10. Elija Create function (Crear función).
11. Elija la pestaña Code (Código).
12. En el editor Code source (Código fuente), elimine el código de muestra y pegue el siguiente código:
import boto3
rds = boto3.client('rds')
def lambda_handler(event, context):
#Start DB Instances
dbs = rds.describe_db_instances()
for db in dbs['DBInstances']:
#Check if DB instance stopped. Start it if eligible.
if (db['DBInstanceStatus'] == 'stopped'):
try:
GetTags=rds.list_tags_for_resource(ResourceName=db['DBInstanceArn'])['TagList']
for tags in GetTags:
#if tag "autostart=yes" is set for instance, start it
if(tags['Key'] == 'autostart' and tags['Value'] == 'yes'):
result = rds.start_db_instance(DBInstanceIdentifier=db['DBInstanceIdentifier'])
print ("Starting instance: {0}.".format(db['DBInstanceIdentifier']))
except Exception as e:
print ("Cannot start instance {0}.".format(db['DBInstanceIdentifier']))
print(e)
if __name__ == "__main__":
lambda_handler(None, None)
13. Elija File (Archivo), Save (Guardar) y, a continuación, elija Deploy (Implementar).
15. Elija la pestaña Configuration (Configuración), General configuration (Configuración general) y, a continuación, elija Edit (Editar).
16. En Timeout (Tiempo de espera), haga lo siguiente: En min, seleccione 0. En sec, seleccione 10.
17. Elegir Save (Guardar).
Crear una función de Lambda para detener las instancias de base de datos etiquetadas.
Para crear una función de Lambda para detener las instancias de base de datos etiquetadas, consulte la sección anterior Create a Lambda function to start the tagged DB instances (Crear una función de Lambda para iniciar las instancias de base de datos etiquetadas). Siga los mismos pasos, pero utilice un código diferente para el paso 12.
En el editor Code source (Código fuente), elimine el código de muestra y pegue el siguiente código:
import boto3
rds = boto3.client('rds')
def lambda_handler(event, context):
#Stop DB instances
dbs = rds.describe_db_instances()
for db in dbs['DBInstances']:
#Check if DB instance is not already stopped
if (db['DBInstanceStatus'] == 'available'):
try:
GetTags=rds.list_tags_for_resource(ResourceName=db['DBInstanceArn'])['TagList']
for tags in GetTags:
#if tag "autostop=yes" is set for instance, stop it
if(tags['Key'] == 'autostop' and tags['Value'] == 'yes'):
result = rds.stop_db_instance(DBInstanceIdentifier=db['DBInstanceIdentifier'])
print ("Stopping instance: {0}.".format(db['DBInstanceIdentifier']))
except Exception as e:
print ("Cannot stop instance {0}.".format(db['DBInstanceIdentifier']))
print(e)
if __name__ == "__main__":
lambda_handler(None, None)
Llevar a cabo pruebas de función
Para las instancias de base de datos etiquetadas que están en estado Stopped (Detenido), complete los siguientes pasos para realizar pruebas de función:
1. Abrir la lista Lambda Functions (funciones de Lambda) .
2. Elegir la función que ha creado para comenzar las instancias de base de datos.
3. Elija Actions (Acciones) y, a continuación, elija Test (Prueba).
4. En la pestaña Test (Prueba), en Name (Nombre), ingrese el nombre de su evento.
5. Elija Save changes (Guardar cambios) y, a continuación, elija Test (Prueba).
Crear la programación.
Puede crear reglas para configurar la programación. Por ejemplo, si el periodo de mantenimiento semanal para las instancias de base de datos etiquetadas es el domingo de 22:00 h a 22:30 h, puede crear las siguientes reglas:
- Comenzar automáticamente la instancia de base de datos 30 minutos antes de que comience el periodo de mantenimiento
- Detener automáticamente la instancia de base de datos 30 minutos después de que finalice el periodo de mantenimiento
Para crear la regla para iniciar automáticamente la instancia de base de datos 30 minutos antes del periodo de mantenimiento, siga estos pasos:
1. Abrir la lista Lambda Functions (funciones de Lambda) .
2. Elija la función que ha creado para iniciar las instancias de base de datos.
3. En Function overview (Información general de la función), elija Add trigger (Agregar desencadenador).
4. Seleccione EventBridge (CloudWatch Events) y, a continuación, seleccione Create a new rule (Crear una nueva regla).
5. En Rule name (Nombre de la regla), ingrese el nombre de la regla que quiere crear.
6. En Schedule Expression (Expresión de programación), agregue una expresión cron para la programación automatizada (ejemplo: cron(30 21 ? * SUN *)).
7. Elegir Add (Agregar).
Siga las mismas instrucciones para crear otra regla que detenga automáticamente la instancia de base de datos 30 minutos después del periodo de mantenimiento. Asegúrese de cambiar el nombre de la regla y la expresión cron de la programación automatizada según corresponda (ejemplo: cron(00 23 ? * SUN *)).
Información relacionada
¿Le resultó útil este artículo?
¿Necesita asistencia técnica o con la facturación?