Global outage event
If you're experiencing issues with your AWS services, then please refer to the AWS Health Dashboard. You can find the overall status of ongoing outages, the health of AWS services, and the latest updates from AWS engineers.
Come posso utilizzare Step Functions per arrestare un'istanza Amazon RDS per più di 7 giorni?
Desidero utilizzare AWS Step Functions per arrestare Amazon Relational Database Service (Amazon RDS) per più di 7 giorni.
Breve descrizione
Per impostazione predefinita, puoi arrestare un'istanza database Amazon RDS per non più di 7 giorni alla volta. Dopo 7 giorni, l'istanza si riavvia in modo da non perdere alcun aggiornamento di manutenzione.
Per arrestare l'istanza per più di 7 giorni, puoi utilizzare Step Functions in modo da automatizzare il flusso di lavoro e non perdere alcuna finestra di manutenzione.
Nota: per una risoluzione alternativa, consulta Come posso utilizzare Step Functions per interrompere un'istanza Amazon RDS per più di 7 giorni?
Risoluzione
Configura le autorizzazioni IAM
Per creare una policy AWS Identity and Access Management (AWS IAM) che consenta a Step Functions di avviare e arrestare un'istanza RDS, completa i seguenti passaggi:
-
Apri la console IAM.
-
Nel pannello di navigazione, scegli Policy, quindi seleziona Crea policy.
-
Scegli la scheda JSON, quindi aggiungi la seguente istruzione:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": [ "rds:DescribeDBInstances", "rds:StopDBInstance", "rds:StartDBInstance" ], "Resource": "*" } ] } -
Scegli Avanti.
-
In Nome policy, inserisci il nome della policy. Inserisci ad esempio step-functions-start-stop-rds-policy.
-
(Facoltativo) Per aggiungere un tag, scegli Aggiungi nuovo tag, quindi inserisci i valori appropriati nei campi Chiave e Valore.
-
Scegli Crea policy.
Per ulteriori informazioni, consulta Creazione di policy utilizzando l'editor JSON.
Crea un ruolo IAM e collega le policy necessarie
Completa i seguenti passaggi:
- Apri la console IAM.
- Nel pannello di navigazione, scegli Ruoli, quindi seleziona Crea ruolo.
- In Seleziona un’entità attendibile, scegli Servizio AWS.
- Nell'elenco a discesa Use cases for other AWS service (Casi d'uso per altri servizi AWS), scegli Step Functions.
- Scegli Avanti.
Nota: non fare nulla nella pagina Aggiungi autorizzazioni. Crea prima il ruolo, quindi modifica le autorizzazioni predefinite. - Scegli Avanti.
- In Nome ruolo, inserisci il nome del ruolo. Ad esempio, inserisci step-functions-start-stop-rds-role.
(Facoltativo) Inserisci la descrizione del ruolo.
(Facoltativo) Per aggiungere un tag, scegli Aggiungi nuovo tag, quindi inserisci i valori appropriati nei campi Chiave e Valore. - Scegli Crea ruolo. Questa scelta ti riporta alla pagina Ruoli.
- Nella casella di ricerca, inserisci il nome del ruolo che hai creato, quindi selezionalo per visualizzarne i dettagli.
- Nella scheda Autorizzazioni, scegli l'elenco a discesa Aggiungi autorizzazioni, quindi scegli Collega policy.
- Nella casella di ricerca, inserisci il nome della policy che hai creato nella sezione Configura le autorizzazioni IAM. Ad esempio, inserisci step-functions-start-stop-rds-policy, quindi seleziona la policy.
- Nella scheda Autorizzazioni, seleziona la policy gestita da AWS AWSLambdaRole, quindi scegli Rimuovi.
Per ulteriori informazioni, consulta Creazione di un ruolo per un AWS servizio (console).
Aggiungi tag per le istanze del database
Completa i seguenti passaggi:
- Apri la console Amazon RDS.
- Nel pannello di navigazione, scegli Database.
- Seleziona l'istanza database che desideri avviare e arrestare automaticamente.
- Scegli la scheda Tag .
- Scegli Aggiungi. In Chiave di tag, inserisci autostart. In Valore, inserisci yes.
- Scegli Aggiungi un altro tag. In Chiave di tag, inserisci autostop. In Valore, inserisci yes.
- Scegli Aggiungi.
Per ulteriori informazioni, consulta Aggiunta ed eliminazione di tag in Amazon RDS.
Crea una macchina a stati per avviare e arrestare le istanze database con tag
Completa i seguenti passaggi:
-
Apri la console Step Functions, quindi scegli Inizia.
-
Per Crea la tua macchina a stati, scegli Crea personalizzato.
-
Inserisci il nome della macchina a stati. Ad esempio, inserisci step-functions-start-stop-rds-state-machine.
-
Per Tipo di macchina a stati, scegli Standard, quindi seleziona Continua.
-
Scegli la scheda Codice, quindi inserisci la seguente definizione di macchina a stati:
{ "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: per il parametro Wait for 1 hour and 30 minutes (Attendi 1 ora e 30 minuti), a scopo di test puoi modificare il valore del campo Secondi. Ad esempio, puoi modificare il valore del campo Secondi impostando una finestra di manutenzione più o meno lunga.
-
Scegli Config, quindi scegli Crea.
-
Per Conferma la creazione del ruolo, scegli Conferma.
-
Scegli Avvia esecuzione.
Esegui un test di funzione per le istanze di database con tag nello stato Arrestata
Completa i seguenti passaggi:
- Apri la console Step Functions.
- Nel pannello di navigazione, scegli Macchina a stati.
- Seleziona la macchina a stati che hai creato per avviare le istanze database. Ad esempio, step-functions-start-stop-rds-state-machine.
- Scegli Avvia esecuzione.
Nota: questa risoluzione non richiede un payload dell’evento. Nella finestra di dialogo Avvia esecuzione puoi rimuovere il payload dell'evento o lasciare l'evento predefinito. - Scegli Avvia esecuzione.
Crea la pianificazione
Per programmare una finestra di manutenzione settimanale per le istanze database con tag, crea una regola in Amazon EventBridge. La regola avvia automaticamente l'istanza database 30 minuti prima della finestra di manutenzione.
Nel seguente caso d’uso, la finestra di manutenzione è fissata tra le 22:00 e le 22:30 di domenica. L'esempio di regola avvia l'istanza database ogni domenica alle 21:30.
Per creare la pianificazione, completa i seguenti passaggi:
- Apri la console EventBridge.
- Scegli Pianificazione EventBridge, quindi seleziona Crea pianificazione.
- Inserisci un nome per la pianificazione. Ad esempio, step-function-start-stop-schedule. Lascia predefinito per Gruppo di pianificazione.
- Per Modello di pianificazione,scegli Pianificazione ricorrente.
- Quindi, per Tipo di pianificazione, scegli Pianificazione basata su Cron.
- Aggiungi un'espressione Cron per la pianificazione automatica. Ad esempio, inserisci cron(30 21 ? * SUN *).
- Per Finestra temporale flessibile, scegli Off.
- Scegli Avanti.
- Per Dettagli della destinazione, scegli Destinazioni basate su modelli, quindi seleziona StartExecution.
- Per StartExecution, seleziona la macchina a stati che hai creato nella sezione Crea una macchina a stati per avviare e arrestare le istanze database con tag. Ad esempio, seleziona step-functions-start-stop-rds-state-machine. Mantieni il valore dell'input predefinito di {}.
- Scegli Avanti.
- In Policy di ripetizione e coda DLQ (Dead-Letter Queue), disattiva Policy di ripetizione.
- Per Coda DLQ, scegli Nessuna.
- Per Autorizzazioni, scegli Crea un nuovo ruolo per questa pianificazione, quindi seleziona Avanti.
Nota: EventBridge crea un nuovo ruolo da assumere e avvia l'API StartExecution per il flusso di lavoro. - In Dettagli della pianificazione, verifica che le successive 10 date di invocazione corrispondano alle date della pianificazione prevista, quindi scegli Crea pianificazione.
Il flusso di lavoro Step Function inizia quando EventBridge invoca la regola. Le istanze database vengono avviate 30 minuti prima della finestra di manutenzione. Il flusso di lavoro arresta quindi l'istanza database 30 minuti dopo la fine della finestra di manutenzione. Ad esempio, il flusso di lavoro avvia l'istanza database alle 21:30. La finestra di manutenzione va dalle 22:00 alle 22:30. Dopodiché il flusso di lavoro arresta l'istanza alle 23:00.
- Lingua
- Italiano
