本番環境やらかし Advent Calendar 2022

本番環境やらかし

クリスマス前なので 本番環境やらかしAdvent Calendar

前提

やろうとしたこと

  • 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が削除されてしまいました。 泣きながらバックアップとアクセスログからデータを復旧しました。

対策

  1. 作業前には手動でバックアップを取りましょう
  2. 日時のバックアップも取りましょう
  3. 削除保護機能を有効化しておきましょう
DBInstance:
  Type: AWS::RDS::DBInstance
  Properties:
    DBInstanceIdentifier: !Sub '${EnvironmentName}'
    Engine: postgres
    ...
    DeletionProtection: true # これを追加しましょう
  1. データを保存するもの(RDS/S3) にCloudFormation等の構成管理ツールを使わない
  2. YAMLのLinter を入れる
  3. CloudFormatinを使わない Terraform を使う
  • HCL ならキーが重複したらエラーになる気がする・・・
この記事をシェア

弊社では、一緒に会社を面白くしてくれる仲間を募集しています。
お気軽にお問い合わせください!