AWS Builder Center: Learn, Build and Connect with builders in the AWS community
AWS Builder Center is the official home for builders on AWS. Share and read what others are working on, follow people who inspire you, explore training and workshops, and find tools to support what you're building.
¿Cómo puedo utilizar Step Functions para detener una instancia de Amazon RDS por más de 7 días?
Quiero utilizar AWS Step Functions para detener Amazon Relational Database Service (Amazon RDS) durante más de 7 días.
Descripción corta
De forma predeterminada, se puede detener una instancia de la base de datos de Amazon RDS durante un máximo de 7 días por vez. Transcurridos los 7 días, la instancia se reiniciará para que no se pierda ninguna actualización de mantenimiento.
Para detener la instancia durante más de 7 días, se puede utilizar Step Functions para automatizar el flujo de trabajo para que no pierdas los periodos de mantenimiento.
Nota: Para una solución alternativa, consulta ¿Cómo puedo utilizar una función de AWS Lambda para detener una instancia de Amazon RDS durante más de siete días?
Solución
Configuración de los permisos de IAM
Para crear una política de AWS Identity and Access Management (IAM) que permita a Step Functions iniciar y detener una instancia de RDS, sigue estos pasos:
-
Abre la consola de IAM.
-
En el panel de navegación, elige Políticas y, a continuación, elige Crear política.
-
Selecciona la pestaña JSON y, a continuación, introduce la siguiente instrucción:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": [ "rds:DescribeDBInstances", "rds:StopDBInstance", "rds:StartDBInstance" ], "Resource": "*" } ] } -
Selecciona Siguiente.
-
En Nombre de la política, introduce un nombre para tu política. Por ejemplo, escribe step-functions-start-stop-rds-policy.
-
(Opcional) Para agregar una etiqueta, selecciona Agregar nueva etiqueta y, a continuación, introduce los valores en los campos Clave y Valor.
-
Selecciona Crear política.
Para obtener más información, consulta Creación de políticas mediante el editor JSON.
Crear un rol de IAM y adjuntar las políticas necesarias
Sigue estos pasos:
- Abre la consola de IAM.
- En el panel de navegación, elige Roles y, a continuación, Crear rol.
- En Seleccionar entidad de confianza, elige Servicio de AWS.
- En la lista desplegable Casos de uso de otros servicios de AWS, selecciona Step Functions.
- Selecciona Siguiente.
Nota: No realices ninguna acción en la página Agregar permisos. Primero crea el rol y, a continuación, edita los permisos predeterminados. - Selecciona Siguiente.
- En Nombre del rol, introduce el nombre del rol. Por ejemplo, escribe step-functions-start-stop-rds-role.
(Opcional) Introduce la descripción del rol.
(Opcional) Para agregar una etiqueta, elige Agregar nueva etiqueta e introduce los valores de los campos Clave y Valor. - Selecciona Crear rol. Esto te devolverá a la página Roles.
- En el cuadro de búsqueda, introduce el nombre del rol que creaste y, a continuación, selecciona ese rol para ver los detalles.
- En la pestaña Permisos, selecciona la lista desplegable Agregar permisos y, a continuación, elige Adjuntar políticas.
- En el cuadro de búsqueda, introduce el nombre de la política que creaste en la sección Configurar permisos de IAM. Por ejemplo, escribe step-functions-start-stop-rds-policy y, a continuación, selecciona la política.
- En la pestaña Permisos, selecciona la política administrada de AWS AWSLambdaRole y, a continuación, selecciona Eliminar.
Para obtener más información, consulta Crear el rol de un servicio de AWS (consola).
Agregar etiquetas para instancias de bases de datos
Sigue estos pasos:
- Abre la consola de Amazon Aurora y RDS.
- En el panel de navegación, selecciona Bases de datos.
- Selecciona la instancia de la base de datos que desees iniciar y detener automáticamente.
- Selecciona la pestaña Etiquetas.
- Elige Agregar. En Clave de etiqueta escribe autostart. En Valor introduce Sí.
- Selecciona Agregar otra etiqueta. En Clave de etiqueta escribe autostop. En Valor, introduce Sí.
- Elige Agregar.
Para obtener más información, consulta Agregar y eliminar etiquetas en Amazon RDS.
Creación de una máquina de estado para iniciar y detener las instancias etiquetadas de la base de datos
Sigue estos pasos:
-
Abre la consola de Step Functions y, a continuación, selecciona Comenzar.
-
En Crea tu máquina de estados, selecciona Crea la tuya propia.
-
Introduce el nombre de la máquina de estado. Por ejemplo, escribe step-functions-start-stop-rds-state-machine.
-
En Tipo de máquina de estado, elige Estándar y, a continuación, elige Continuar.
-
Selecciona la pestaña Código y, a continuación, introduce la siguiente definición de máquina de estado:
{ "Comment": "State Machine Definition to start and stop RDS DB instances", "StartAt": "Describe DBInstances to Start", "States": { "Describe DBInstances to Start": { "Type": "Task", "Parameters": {}, "Resource": "arn:aws:states:::aws-sdk:rds:describeDBInstances", "Next": "Iterate on Instances to Start", "Retry": [ { "ErrorEquals": [ "Rds.InternalFailure", "Rds.ServiceUnavailable", "Rds.ThrottlingException", "Rds.SdkClientException" ], "BackoffRate": 2, "IntervalSeconds": 1, "MaxAttempts": 2 } ] }, "Iterate on Instances to Start": { "Type": "Map", "ItemProcessor": { "ProcessorConfig": { "Mode": "INLINE" }, "StartAt": "Format Array before Start", "States": { "Format Array before Start": { "Type": "Pass", "Next": "Check If Instance stopped, if no Tags or if Tags contains 'autostart=yes'", "Parameters": { "DbInstanceStatus.$": "$.DBInstance.DbInstanceStatus", "DbInstanceIdentifier.$": "$.DBInstance.DbInstanceIdentifier", "TagList.$": "$.DBInstance.TagList", "TagsArrayLength.$": "States.ArrayLength($.DBInstance.TagList)", "TagContainsKey.$": "States.ArrayContains($.DBInstance.TagList,$.LookingFor)" } }, "Check If Instance stopped, if no Tags or if Tags contains 'autostart=yes'": { "Type": "Choice", "Choices": [ { "Not": { "Variable": "$.DbInstanceStatus", "StringEquals": "stopped" }, "Next": "Instance is not in 'stopped' status" }, { "Variable": "$.TagsArrayLength", "NumericEquals": 0, "Next": "No Tags found to Start" }, { "Variable": "$.TagContainsKey", "BooleanEquals": true, "Next": "Tags found Start DBInstance" } ], "Default": "No Tags found to Start" }, "Tags found Start DBInstance": { "Type": "Task", "Parameters": { "DbInstanceIdentifier.$": "$.DbInstanceIdentifier" }, "Resource": "arn:aws:states:::aws-sdk:rds:startDBInstance", "Retry": [ { "ErrorEquals": [ "Rds.InternalFailure", "Rds.ServiceUnavailable", "Rds.ThrottlingException", "Rds.SdkClientException" ], "BackoffRate": 2, "IntervalSeconds": 1, "MaxAttempts": 2 } ], "Catch": [ { "ErrorEquals": [ "States.ALL" ], "Next": "Failed to Start DBInstance" } ], "ResultSelector": { "message": "Instance Started", "DbInstanceIdentifier.$": "$.DbInstance.DbInstanceIdentifier" }, "End": true }, "Failed to Start DBInstance": { "Type": "Pass", "Parameters": { "message": "Failed to start instance", "DbInstanceIdentifier.$": "$.DbInstanceIdentifier" }, "End": true }, "No Tags found to Start": { "Type": "Pass", "End": true, "Parameters": { "message": "No Tags found to Start", "DbInstanceIdentifier.$": "$.DbInstanceIdentifier" } }, "Instance is not in 'stopped' status": { "Type": "Pass", "End": true, "Parameters": { "message": "Instance is not in 'stopped' status", "DbInstanceIdentifier.$": "$.DbInstanceIdentifier" } } } }, "InputPath": "$.DbInstances", "Next": "Wait for 1 hour and 30 minutes", "ItemSelector": { "LookingFor": { "Key": "autostart", "Value": "yes" }, "DBInstance.$": "$$.Map.Item.Value" } }, "Wait for 1 hour and 30 minutes": { "Type": "Wait", "Seconds": 5400, "Next": "Describe DBInstances to Stop" }, "Describe DBInstances to Stop": { "Type": "Task", "Parameters": {}, "Resource": "arn:aws:states:::aws-sdk:rds:describeDBInstances", "Retry": [ { "ErrorEquals": [ "Rds.InternalFailure", "Rds.ServiceUnavailable", "Rds.ThrottlingException", "Rds.SdkClientException" ], "BackoffRate": 2, "IntervalSeconds": 1, "MaxAttempts": 2 } ], "Next": "Iterate on Instances to Stop" }, "Iterate on Instances to Stop": { "Type": "Map", "ItemProcessor": { "ProcessorConfig": { "Mode": "INLINE" }, "StartAt": "Format Array before Stop", "States": { "Format Array before Stop": { "Type": "Pass", "Next": "Check If Instance available, if no Tags or if Tags contains 'autostop=yes'", "Parameters": { "DbInstanceStatus.$": "$.DBInstance.DbInstanceStatus", "DbInstanceIdentifier.$": "$.DBInstance.DbInstanceIdentifier", "TagList.$": "$.DBInstance.TagList", "TagsArrayLength.$": "States.ArrayLength($.DBInstance.TagList)", "TagContainsKey.$": "States.ArrayContains($.DBInstance.TagList,$.LookingFor)" } }, "Check If Instance available, if no Tags or if Tags contains 'autostop=yes'": { "Type": "Choice", "Choices": [ { "Not": { "Variable": "$.DbInstanceStatus", "StringEquals": "available" }, "Next": "Instance is not in 'available' status" }, { "Variable": "$.TagsArrayLength", "NumericEquals": 0, "Next": "No Tags found to Stop" }, { "Variable": "$.TagContainsKey", "BooleanEquals": true, "Next": "Tags found Stop DBInstance" } ], "Default": "No Tags found to Stop" }, "Tags found Stop DBInstance": { "Type": "Task", "Parameters": { "DbInstanceIdentifier.$": "$.DbInstanceIdentifier" }, "Resource": "arn:aws:states:::aws-sdk:rds:stopDBInstance", "Retry": [ { "ErrorEquals": [ "Rds.InternalFailure", "Rds.ServiceUnavailable", "Rds.ThrottlingException", "Rds.SdkClientException" ], "BackoffRate": 2, "IntervalSeconds": 1, "MaxAttempts": 2 } ], "Catch": [ { "ErrorEquals": [ "States.ALL" ], "Next": "Failed to Stop DBInstance" } ], "ResultSelector": { "message": "Instance Stopped", "DbInstanceIdentifier.$": "$.DbInstance.DbInstanceIdentifier" }, "End": true }, "Failed to Stop DBInstance": { "Type": "Pass", "Parameters": { "message": "Failed to stop instance", "DbInstanceIdentifier.$": "$.DbInstanceIdentifier" }, "End": true }, "No Tags found to Stop": { "Type": "Pass", "End": true, "Parameters": { "message": "No Tags found to Stop", "DbInstanceIdentifier.$": "$.DbInstanceIdentifier" } }, "Instance is not in 'available' status": { "Type": "Pass", "End": true, "Parameters": { "message": "Instance is not in 'available' status", "DbInstanceIdentifier.$": "$.DbInstanceIdentifier" } } } }, "InputPath": "$.DbInstances", "Next": "Workflow Finished", "ItemSelector": { "LookingFor": { "Key": "autostop", "Value": "yes" }, "DBInstance.$": "$$.Map.Item.Value" } }, "Workflow Finished": { "Type": "Succeed" } } }Nota: En el parámetro Esperar 1 hora y 30 minutos, puedes cambiar el valor del campo Segundos con fines de prueba. Por ejemplo, puedes cambiar el valor del campo Segundos a un periodo de mantenimiento más largo o más corto.
-
Elige Configuración y, a continuación, elige Crear.
-
En Confirmar la creación del rol, selecciona Confirmar.
-
Selecciona Iniciar ejecución.
Ejecución de una prueba de función para las instancias etiquetadas de la base de datos en estado Detenido
Sigue estos pasos:
- Abre la consola de Step Functions.
- En el panel de navegación de la izquierda selecciona Máquinas de estado.
- Selecciona la máquina de estado que creaste para iniciar las instancias de la base de datos. Por ejemplo, step-functions-start-stop-rds-state-machine.
- Selecciona Iniciar ejecución.
Nota: Esta solución no requiere ninguna carga útil de eventos. En el cuadro de diálogo Iniciar ejecución se puede eliminar la carga útil del evento o dejar el evento predeterminado. - Selecciona Iniciar ejecución.
Creación de la programación
Para programar un periodo de mantenimiento semanal de las instancias etiquetadas de la base de datos, crea una regla de Amazon EventBridge. Esta regla iniciará automáticamente la instancia de la base de datos 30 minutos antes del periodo de mantenimiento.
En el siguiente ejemplo, el periodo de mantenimiento se produce entre las 22:00 y las 22:30 del domingo. La regla de ejemplo inicia la instancia de la base de datos todos los domingos a las 21:30.
Para crear una programación, sigue estos pasos:
- Abre la consola de EventBridge.
- Selecciona Programación de EventBridge y, a continuación, elige Crear programación.
- Introduce un nombre para la programación. Por ejemplo, step-function-start-stop-schedule. Deja el grupo Programar como predeterminado.
- En Patrón de programación, elige Programación recurrente.
- A continuación, en Tipo de programación selecciona Programación basada en cron.
- Agrega una expresión cron a la programación automatizada. Por ejemplo, introduce cron(30 21 ? * SUN *).
- En Periodo de tiempo flexible selecciona Desactivado.
- Selecciona Siguiente.
- En Detalles del objetivo, elige Objetivos con plantilla y, a continuación, elige StartExecution.
- En StartExecution, selecciona la máquina de estado que creaste en la sección Creación de una máquina de estado para iniciar y detener las instancias etiquetadas de la base de datos. Por ejemplo, selecciona step-functions-start-stop-rds-state-machine. Mantén el valor predeterminado de la entrada de {}.
- Selecciona Siguiente.
- En Política de reintentos y cola de mensajes fallidos (DLQ), desactiva la política de reintentos.
- En Cola de mensajes fallidos (DLQ), selecciona Ninguna.
- En Permisos, elige: Crea un nuevo rol para esta programación y, a continuación, elige Siguiente.
Nota: EventBridge crea un nuevo rol que asume e inicia la API StartExecution para el flujo de trabajo. - En Detalles de la programación comprueba que las siguientes 10 fechas de invocación coincidan con la programación prevista y, a continuación, elige Crear programación.
El flujo de trabajo de Step Function inicia cuando EventBridge invoca la regla. Esto inicia las instancias de la base de datos 30 minutos antes del periodo de mantenimiento. A continuación, el flujo de trabajo detiene la instancia de la base de datos 30 minutos después de que finalice el periodo de mantenimiento. Por ejemplo, el flujo de trabajo inicia la instancia de la base de datos a las 21:30. El periodo de mantenimiento tiene lugar entre las 22:00 y las 22:30. A continuación, el flujo de trabajo detiene la instancia a las 23:00.
- Idioma
- Español

Contenido relevante
preguntada hace un año
preguntada hace 2 años
preguntada hace un año
preguntada hace un año
preguntada hace un año
OFICIAL DE AWSActualizada hace un año