web-dev-qa-db-fra.com

Existe-t-il un moyen d'exécuter le SQL initial lors de la création d'une instance de base de données RDS à l'aide de CloudFormation?

Je crée une instance RDS à l'aide de CloudFormation en utilisant ceci:

 "Ressources": {
 "MyDB": {
 "Type": "AWS :: RDS :: DBInstance", 
 "Propriétés": {
 "AllocatedStorage": "5", 
 "DBInstanceClass": "db.m1.small", 
 "Engine": "MySQL", 
 "EngineVersion" : "5.5", 
 "DBName": "mydb", 
 "MasterUsername": {
 "Ref": "DBUser" 
}, 
 "MasterUserPassword": {
 "Ref": "DBPassword" 
}, 
 "DBParameterGroupName": {
 "Ref": "myRDSParamGroup" 
} 
} 
} 

et tout fonctionne. Mais je dois exécuter le SQL initial sur la base de données lors de sa création, pour configurer mon schéma d'applications. Mon approche actuelle consiste à faire migrer automatiquement l'application, mais j'aimerais le faire dans la définition CloudFormation. Est-ce possible?

45
Mike Hogan

Non, ce n'est pas possible. Cependant, vous pouvez avoir une instance EC2 connectée à votre instance RDS pour le faire. Je voudrais probablement stocker un fichier .sql dans S3 et utiliser un script cloud-init sur l'instance EC2 pour télécharger le fichier et l'exécuter.

11
jamieb

Il serait également possible de créer une ressource personnalisée CloudFormation. Il y a une bonne discussion sur la façon d'en construire un en utilisant SNS ici ; il est également possible d'en créer un à l'aide de Lambda. Les ressources personnalisées ne sont essentiellement que des RPC, il ne serait donc pas difficile d'en créer une pour initialiser une base de données avec un schéma, par exemple.

6
sigpwned

CloudFormation ne propose toujours aucune solution pour nous, mais nous espérons qu'ils ajouteront bientôt Database Migration Service support.

En attendant, il existe une excellente solution si vous utilisez CodePipeline: créez une étape de migration qui appelle une fonction Lambda pour exécuter votre migration. Je suis tombé sur ce guide pour avoir invoqué Lambda à partir de CodePipeline qui peut être utile pour ceux qui ne sont pas familiers.

3
cazzer

Une autre option consiste à utiliser la propriété DBSnapshotIdentifier pour la ressource AWS :: RDS :: DBInstance. Le seul inconvénient est que vous devez d'abord charger une base de données dans AWS pour créer l'instantané. À partir de là, vous pouvez cependant automatiser votre pile de cloudformation pour l'utiliser.

DBSnapshotIdentifier: nom (ARN) de l'instantané de base de données utilisé pour restaurer l'instance de base de données.

Si la propriété contient une valeur (autre qu'une chaîne vide), AWS CloudFormation crée une base de données à partir de l'instantané spécifié.

Après avoir restauré une instance de base de données avec une propriété DBSnapshotIdentifier, vous devez spécifier la même propriété DBSnapshotIdentifier pour toute mise à jour future de l'instance de base de données. Lorsque vous spécifiez cette propriété pour une mise à jour, l'instance de base de données n'est pas restaurée à partir de l'instantané de base de données et les données de la base de données ne sont pas modifiées. Toutefois, si vous ne spécifiez pas la propriété DBSnapshotIdentifier, une instance de base de données vide est créée et l'instance de base de données d'origine est supprimée.

Regardez dans le doc à partir de plus d'infos: https://docs.aws.Amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rds-database-instance.html#cfn-rds-dbinstance-dbsnapshotidentifierifier

0
mwdev