背景
CloudFormation
で管理しているMariaDB
インスタンスのパブリックアクセスを変更したかったのですが
スタックファイル(json)から更新すると以下のエラーでハマりました。
CloudFormation cannot update a stack when a custom-named resource requires replacing. Rename (DBインスタンス名) and update the stack again.
公式ドキュメントを読んで見ると
InstanceIdentifier
重要
名前を指定すると、このリソースの置換が必要な更新はできません。中断が不要であるか、一定の中断が必要な更新であれば、行うことができます。リソースを置き換える必要がある場合は、新しい名前を指定します。
CloudFormation
で、DBInstanceのInstanceIdentifier
(DBインスタンス名)を設定していると置換ができないのです。。。。
それでは逆に名前を指定しないとどうなるかと言うと
DB インスタンスの名前。名前を指定すると、AWS CloudFormation は名前を小文字に変換します。名前を指定しないと、AWS CloudFormation は一意の物理 ID を生成し、その ID を DB インスタンス名として使用します。詳細については、「Name タイプ」を参照してください。
AWSでIDを生成してくれ、それがDBインスタンス名になりますが、人間にとってわかりやすい名前を指定できないので管理はしづらくなりそうです。
名前を指定している時はどうするのか?
例えば以下のような既存のスタックファイル(json)でDBの名前を指定している場合で、その名前を再利用するためには
{
"AWSTemplateFormatVersion" : "2010-09-09",
"Description" : "rds stack",
"Resources" : {
"DevRDSDBInstance" : {
"Type" : "AWS::RDS::DBInstance",
"Properties" : {
"DBInstanceIdentifier":"sample-instance01",
"DBSubnetGroupName" : "sample-rds-subnet-group",
"AvailabilityZone" : "ap-northeast-1a",
"AllocatedStorage" : "50",
"DBInstanceClass" : "db.t2.medium",
"PubliclyAccessible": "true",
"Engine" : "MariaDB",
"DBParameterGroupName": "sample-rds-parameter-group",
"MasterUsername" : "sample-master-user",
"MasterUserPassword" : "sample-master-password",
"DBSnapshotIdentifier" :"snapshot-sample-instance01",
"Tags" : [ { "Key" : "Name", "Value" : "sample-Instance01-rds01" } ],
"VPCSecurityGroups": "sg-sample"
}
}
}
}
1.更新するDBインスタンスのスナップショットをとる
上記のスタックファイルでは例ではsnapshot-sample-instance01
2.別の名前に変更し、CloudFormationを反映
CloudFormation
ファイル(json)のDBInstanceIdentifier
で指定している名前を
sample-instance02
などに変更し、DBSnapshotIdentifier
を1で取得したスタップの名前にする。
スタックを更新すると、AWSが作成したインスタンス名のDBインスタンスができ、もともと設定していたsample-instance01
のDBインスタンスが削除される。
3.元の名前に戻し、CloudFormationを反映
再度CloudFormationのjsonファイルに、DBInstanceIdentifier
を追加し、名前(sample-instance01
)を指定する。
名前を指定したDBインスタンスが生成され、2で作成されたDBインスタンスが削除される
というような作業になり、かなり面倒です。。。。
awsのコンソール画面からだと、パブリックアクセスの変更は特にダウンタイムもなく更新されるのに、
パブリックアクセスやオプショングループの変更など、一般的に再起動が発生しそうな変更をCloudFormation
で行うと、DBインスタンスの置換が必要に大がかりな作業になります。
終わりに
こういった事情を考慮するとDBインスタンスの名前は特に設定しないで、DBインスタンスにDNSを設定して、RDSのエンドポイントが変わっても管理するのが楽そうですね。