LoginSignup
9
8

More than 5 years have passed since last update.

CloudFormationでRDSを更新する時の注意

Last updated at Posted at 2017-12-16

背景

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

無題のプレゼンテーション (4).png

2.別の名前に変更し、CloudFormationを反映

CloudFormationファイル(json)のDBInstanceIdentifierで指定している名前を
sample-instance02などに変更し、DBSnapshotIdentifierを1で取得したスタップの名前にする。

無題のプレゼンテーション (5).png

スタックを更新すると、AWSが作成したインスタンス名のDBインスタンスができ、もともと設定していたsample-instance01のDBインスタンスが削除される。

3.元の名前に戻し、CloudFormationを反映

再度CloudFormationのjsonファイルに、DBInstanceIdentifierを追加し、名前(sample-instance01)を指定する。

無題のプレゼンテーション (7).png

名前を指定したDBインスタンスが生成され、2で作成されたDBインスタンスが削除される

というような作業になり、かなり面倒です。。。。

awsのコンソール画面からだと、パブリックアクセスの変更は特にダウンタイムもなく更新されるのに、
パブリックアクセスやオプショングループの変更など、一般的に再起動が発生しそうな変更をCloudFormationで行うと、DBインスタンスの置換が必要に大がかりな作業になります。

終わりに

こういった事情を考慮するとDBインスタンスの名前は特に設定しないで、DBインスタンスにDNSを設定して、RDSのエンドポイントが変わっても管理するのが楽そうですね。

9
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
8