Estoy usando boto3 en un pequeño script para cambiar las credenciales maestras de un clúster RDS.
El problema es que el estado del clúster RDS de describe_db_clusters no está actualizado de manera confiable. Después de emitir un modificar_db_cluster (específicamente, estoy actualizando la contraseña maestra), existe una alta probabilidad de que describe_db_clusters muestre que el clúster todavía está "disponible", antes de ingresar a la ventana de "modificación". estado.
La secuencia de eventos:
el clúster está disponible
modificar la contraseña del clúster
El clúster todavía está disponible.
el cluster se esta modificando
El clúster está disponible (operación completa).
El problema es que no puedo distinguir de manera confiable entre los estados 3 y 5.
Notas:
Estoy usando ApplyImmediately=True para la actualización de la contraseña maestra
Veo el mismo comportamiento problemático.nuestro, ya sea que inspeccione el estado del clúster o los PendingModifiedValues del clúster
Los documentos mencionan esto para describe_db_instances:
Contraseña de usuario maestro (cadena) --
La nueva contraseña para el usuario maestro. La contraseña puede incluir cualquier carácter ASCII imprimible excepto "/", """ o "@".
Cambiar este parámetro no genera una interrupción y el cambio se aplica de forma asincrónica lo antes posible. Entre el momento de la solicitud y su finalización, el elemento MasterUserPassword existe en el elemento PendingModifiedValues de la respuesta de la operación.
Sin embargo, esa nota al pie no existe para describe_db_clusters.
¿Cómo puedo saber de manera confiable cuándo se completó mi operación de modificación?
------------------------------------
Aparentemente, solo si hay un cambio pendiente, PendingModifiedValues estará presente en la respuesta describe_db_clusters:
#!/usr/bin/python3
import boto3
import time
import datetime
client = boto3.client('rds',region_name='ap-southeast-2')
while True:
response = client.describe_db_clusters(
Filters=[
{
'Name': 'db-cluster-id',
'Values': [
'database-1',
]
}
]
)
for cluster in response['DBClusters']:
print(cluster['DBClusterIdentifier'],cluster['Status'])
if "PendingModifiedValues" in cluster:
print(cluster['PendingModifiedValues'])
else:
print('No PendingModifiedValues in response')
now = datetime.datetime.now()
print(now.strftime("%Y-%m-%d %H:%M:%S"))
time.sleep(1)
Salida:
$ ./check_rds_cluster.py
database-1 available
No PendingModifiedValues in response
2021-03-28 13:19:45
database-1 available
No PendingModifiedValues in response
2021-03-28 13:19:46
database-1 available
No PendingModifiedValues in response
2021-03-28 13:19:48
database-1 available
{'MasterUserPassword': '****'}
2021-03-28 13:19:49
...
database-1 available
{'MasterUserPassword': '****'}
2021-03-28 13:19:53
database-1 available
{'MasterUserPassword': '****'}
2021-03-28 13:19:55
database-1 resetting-master-credentials
{'MasterUserPassword': '****'}
2021-03-28 13:19:56
database-1 resetting-master-credentials
{'MasterUserPassword': '****'}
...
2021-03-28 13:21:17
database-1 available
No PendingModifiedValues in response
2021-03-28 13:21:18
database-1 available
No PendingModifiedValues in response
2021-03-28 13:21:19
Está documentado en https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_DBCluster.html:
ValoresModificados Pendientes
Un valor que especifica que los cambios en la base de datos
El grupo está pendiente. Este elemento sólo se incluye cuando se realizan cambios.
pendiente. Los cambios específicos se identifican mediante subelementos.
1
Desafortunadamente, esto no responde a mi pregunta. El problema que estoy observando es que PendingModifiedValues no aparece inmediatamente después de solicitar que se cambie la contraseña.
Más alegre
15 de abril de 2021 a las 6:46
------------------------------------
En tales casos, puede crear una función de camarero en su código. El boto3 RDS ya proporciona un par de camareros, pero ninguno se aplica a un grupo. El más cercano es DBInstanceAvailable.
Básicamente, un camarero es una función que extrae la API de AWS de forma iterativa con retrasos de 15 segundos para comprobar si una determinadaEl recurso está en el estado deseado, p.e. La instancia de RDS se ha creado y está disponible para su uso.
Así que podrías crear tu propio camarero que extraería describe_db_clusters cada 10 o 15 segundos hasta que PendingModifiedValues desaparezca de la respuesta o tenga algún otro estado de interés. Quizás comprobar el estado de DBClusters sea suficiente.
1
Desafortunadamente, esto no responde a mi pregunta. Un camarero estaría sujeto al mismo problema de que los PendingModifiedValues no aparecieran hasta después de un retraso.
Más alegre
15 de abril de 2021 a las 6:44