web-dev-qa-db-ja.com

CloudFormationを使用してRDSデータベースインスタンスを作成するときに初期SQLを実行する方法はありますか?

私はこれを使用してCloudFormationを使用してRDSインスタンスを作成しています:

 "リソース":{
 "myDB":{
 "タイプ": "AWS :: RDS :: DBInstance"、
 "プロパティ":{
 "AllocatedStorage": "5"、
 "DBInstanceClass": "db.m1.small"、
 "Engine": "MySQL"、
 "EngineVersion" : "5.5"、
 "DBName": "mydb"、
 "MasterUsername":{
 "Ref": "DBUser" 
}、
 "MasterUserPassword":{
 "Ref": "DBPassword" 
}、
 "DBParameterGroupName":{
 "Ref": "myRDSParamGroup" 
} 
} 
} 

そしてそれはすべて動作します。しかし、アプリスキーマをセットアップするには、作成時にDBで初期SQLを実行する必要があります。私の現在のアプローチは、アプリを自己移行させることですが、CloudFormation定義でそれを実行したいと思います。これは可能ですか?

45
Mike Hogan

いいえ、それは不可能です。ただし、EC2インスタンスをRDSインスタンスに接続して実行することができます。おそらく.sqlファイルをS3に保存し、EC2インスタンスでcloud-initスクリプトを使用してファイルをダウンロードして実行します。

11
jamieb

CloudFormationカスタムリソースを作成することもできます。 SNSを使用して構築する方法については、よい議論があります here ; Lambdaを使用してビルドすることもできます。カスタムリソースは本質的に単なるRPCであるため、たとえば、スキーマを使用してデータベースを初期化するためのリソースを作成することは難しくありません。

6
sigpwned

CloudFormationにはまだ解決策がありませんが、うまくいけば Database Migration Service のサポートがすぐに追加されます。

それまでの間、CodePipelineを使用している場合は、Lambda関数を呼び出して移行を実行する移行ステージを作成する優れたソリューションがあります。私は、なじみのない人に役立つかもしれないCodePipelineからLambdaを呼び出して このガイド を見つけました。

3
cazzer

別のオプションは、AWS :: RDS :: DBInstanceリソースのDBSnapshotIdentifierプロパティを使用することです。唯一の問題は、最初にスナップショットを作成するためにAWSにDBをロードする必要があることです。それ以降は、cloudformationスタックを自動化して使用できます。

DBSnapshotIdentifier:DBインスタンスの復元に使用されるDBスナップショットの名前(ARN)。

プロパティに値(空の文字列以外)が含まれている場合、AWS CloudFormationは指定されたスナップショットからデータベースを作成します。

DBSnapshotIdentifierプロパティを使用してDBインスタンスを復元した後、DBインスタンスへの将来の更新のために同じDBSnapshotIdentifierプロパティを指定する必要があります。更新にこのプロパティを指定すると、DBインスタンスはDBスナップショットから再度復元されず、データベース内のデータは変更されません。ただし、DBSnapshotIdentifierプロパティを指定しない場合、空のDBインスタンスが作成され、元のDBインスタンスが削除されます。

詳細については、ドキュメントをご覧ください。 https://docs.aws.Amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rds-database-instance.html#cfn-rds-dbinstance-dbsnapshotidentifier

0
mwdev