私はこれを使用して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定義でそれを実行したいと思います。これは可能ですか?
いいえ、それは不可能です。ただし、EC2インスタンスをRDSインスタンスに接続して実行することができます。おそらく.sqlファイルをS3に保存し、EC2インスタンスでcloud-initスクリプトを使用してファイルをダウンロードして実行します。
CloudFormationカスタムリソースを作成することもできます。 SNSを使用して構築する方法については、よい議論があります here ; Lambdaを使用してビルドすることもできます。カスタムリソースは本質的に単なるRPCであるため、たとえば、スキーマを使用してデータベースを初期化するためのリソースを作成することは難しくありません。
CloudFormationにはまだ解決策がありませんが、うまくいけば Database Migration Service のサポートがすぐに追加されます。
それまでの間、CodePipelineを使用している場合は、Lambda関数を呼び出して移行を実行する移行ステージを作成する優れたソリューションがあります。私は、なじみのない人に役立つかもしれないCodePipelineからLambdaを呼び出して このガイド を見つけました。
別のオプションは、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