本番環境やらかし Advent Calendar 2022
2022年 12月 13日 火曜日
本番環境やらかし
クリスマス前なので 本番環境やらかしAdvent Calendar
前提
- Cloud Formation でAWSの構成管理をやっている
- RDS を使っています
- rain を使っています(Terraformじゃないです)
やろうとしたこと
- RDS のネットワーク VPC のネットワークを Private Subnet から Public Subnet に変更しようとした
元のファイル
RDSSubnetGroup:
Type: "AWS::RDS::DBSubnetGroup"
Properties:
DBSubnetGroupDescription: "description"
SubnetIds:
- !Ref Subnet1
- !Ref Subnet2
- !Ref Subnet3
DBInstance:
Type: AWS::RDS::DBInstance
Properties:
Engine: postgres
...
DBSubnetGroupName: !Ref RDSSubnetGroup
実際の記述
本来書き換えるべき設定
RDSSubnetGroup:
Type: "AWS::RDS::DBSubnetGroup"
Properties:
DBSubnetGroupDescription: "description"
SubnetIds:
- !Ref Subnet1
- !Ref Subnet2
- !Ref Subnet3
RDSPublicSubnetGroup: # 既存の構成を残したままこの様に設定を増やさないとといけなかった
Type: "AWS::RDS::DBSubnetGroup"
Properties:
DBSubnetGroupName: !Sub "${EnvironmentName}-rds-public"
DBSubnetGroupDescription: "description"
SubnetIds:
- !Ref PublicSubnet1
- !Ref PublicSubnet2
- !Ref PublicSubnet3
DBInstance:
Type: AWS::RDS::DBInstance
Properties:
Engine: postgres
...
DBSubnetGroupName: !Ref RDSPublicSubnetGroup
ですが、間違えてこう書き換えてしまいました。
RDSSubnetGroup:
Type: "AWS::RDS::DBSubnetGroup"
Properties:
DBSubnetGroupDescription: "description"
SubnetIds:
- !Ref Subnet1
- !Ref Subnet2
- !Ref Subnet3
RDSSubnetGroup: # <= この行で名前を変更しなかったため上のRDSSubnetGroupが yaml の文法によって意図せず上書きされてしまい、DBが再作成されてしまった
Type: "AWS::RDS::DBSubnetGroup"
Properties:
DBSubnetGroupName: !Sub "${EnvironmentName}-rds-public"
DBSubnetGroupDescription: "description"
SubnetIds:
- !Ref PublicSubnet1
- !Ref PublicSubnet2
- !Ref PublicSubnet3
DBInstance:
Type: AWS::RDS::DBInstance
Properties:
Engine: postgres
...
DBSubnetGroupName: !Ref RDSSubnetGroup
結果
本番DBが削除されてしまいました。 泣きながらバックアップとアクセスログからデータを復旧しました。
対策
- 作業前には手動でバックアップを取りましょう
- 日時のバックアップも取りましょう
- 削除保護機能を有効化しておきましょう
DBInstance:
Type: AWS::RDS::DBInstance
Properties:
DBInstanceIdentifier: !Sub '${EnvironmentName}'
Engine: postgres
...
DeletionProtection: true # これを追加しましょう
- データを保存するもの(RDS/S3) にCloudFormation等の構成管理ツールを使わない
- YAMLのLinter を入れる
- CloudFormatinを使わない Terraform を使う
- HCL ならキーが重複したらエラーになる気がする・・・
この記事をシェア