mcpField
A
aws-cloudformation-rds

aws-cloudformation-rds

github.com/giuseppe-trisciuoglioクラウド・DevOps36565 回インストール7 週間前に更新
リポジトリ

aws-cloudformation-rds について

AWS CloudFormation で Amazon RDS を管理する開発者や運用担当者向けのスキルです。DB インスタンスや Aurora クラスターに加え、高可用性、ネットワーク、セキュリティ、認証情報管理の構成を扱います。

主な機能

  1. 01RDS インスタンスと Aurora クラスター
  2. 02マルチ AZ とリードレプリカ
  3. 03サブネットグループとパラメーターグループ
  4. 04Secrets Manager による認証情報連携
  5. 05クロススタック参照と変更セット

活用シーン

  1. 01CloudFormation で RDS データベースを作成
  2. 02本番データベースにマルチ AZ を設定
  3. 03データベース認証情報とネットワークアクセスを管理
  4. 04データベース接続情報をアプリケーションスタックに出力

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/giuseppe-trisciuoglio/developer-kit --skill aws-cloudformation-rds

インストール後、Claude Code で/aws-cloudformation-rdsを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

references/
constraints.md
database-components.md
examples.md
high-availability.md
operational-practices.md
reference.md
security-secrets.md
template-structure.md

詳細

AWS CloudFormation RDS データベース

概要

AWS CloudFormation テンプレートを使用して、本番環境に対応した Amazon RDS インフラストラクチャを作成します。RDS インスタンス(MySQL、PostgreSQL、Aurora)、DB クラスター、マルチ AZ デプロイ、パラメータグループ、サブネットグループ、セキュリティグループ、スタック間参照を扱います。

使用する場面

  • RDS インスタンス(MySQL、PostgreSQL、Aurora)や、リードレプリカを含む DB クラスターを作成する場合
  • マルチ AZ デプロイを設定したり、パラメータグループやサブネットグループを構成したりする場合
  • Secrets Manager と統合したり、スタック間参照を実装したりする場合

クイックリファレンス

コンポーネントCloudFormation の型用途
DB インスタンスAWS::RDS::DBInstance単一のデータベースインスタンス
DB クラスターAWS::RDS::DBClusterAurora クラスター
DB サブネットグループAWS::RDS::DBSubnetGroupVPC へのデプロイ
パラメータグループAWS::RDS::DBParameterGroupデータベースの設定
セキュリティグループAWS::EC2::SecurityGroupネットワークアクセス制御
Secrets ManagerAWS::SecretsManager::Secret認証情報の保存

手順

ステップ 1 — データベースのパラメータを定義する

検証には AWS 固有のパラメータ型を使用します。

Parameters:
  DBInstanceClass:
    Type: AWS::RDS::DBInstance::InstanceType
    Default: db.t3.micro
    AllowedValues: [db.t3.micro, db.t3.small, db.t3.medium]

  Engine:
    Type: String
    Default: mysql
    AllowedValues: [mysql, postgres, aurora-mysql, aurora-postgresql]

  MasterUsername:
    Type: String
    Default: admin
    AllowedPattern: "^[a-zA-Z][a-zA-Z0-9]*$"
    MinLength: 1
    MaxLength: 16

  MasterUserPassword:
    Type: String
    NoEcho: true
    MinLength: 8
    MaxLength: 41

高度なパラメータパターン、マッピング、条件、スタック間参照については、template-structure.md を参照してください。

ステップ 2 — DB サブネットグループを作成する

異なる AZ にサブネットを配置する VPC デプロイでは必須です。

DBSubnetGroup:
  Type: AWS::RDS::DBSubnetGroup
  Properties:
    DBSubnetGroupDescription: Subnet group for RDS
    SubnetIds:
      - !Ref PrivateSubnet1
      - !Ref PrivateSubnet2

パラメータグループ、オプショングループ、エンジン固有の設定については、database-components.md を参照してください。

ステップ 3 — セキュリティグループを設定する

アクセスをアプリケーション層のみに制限します。

DBSecurityGroup:
  Type: AWS::EC2::SecurityGroup
  Properties:
    GroupDescription: Security group for RDS
    VpcId: !Ref VpcId
    SecurityGroupIngress:
      - IpProtocol: tcp
        FromPort: 3306
        ToPort: 3306
        SourceSecurityGroupId: !Ref AppSecurityGroup

VPC セキュリティグループ、暗号化、Secrets Manager との統合、IAM 認証については、security-secrets.md を参照してください。

ステップ 4 — RDS インスタンスを起動する

サブネットグループ、セキュリティグループ、各種設定を使用してインスタンスを構成します。

DBInstance:
  Type: AWS::RDS::DBInstance
  Properties:
    DBInstanceIdentifier: !Sub "${AWS::StackName}-mysql"
    DBInstanceClass: !Ref DBInstanceClass
    Engine: !Ref Engine
    MasterUsername: !Ref MasterUsername
    MasterUserPassword: !Ref MasterUserPassword
    AllocatedStorage: 20
    StorageType: gp3
    DBSubnetGroupName: !Ref DBSubnetGroup
    VPCSecurityGroups: [!Ref DBSecurityGroup]
    StorageEncrypted: true
    MultiAZ: true
    BackupRetentionPeriod: 7
    DeletionProtection: false

MySQL、PostgreSQL、Aurora クラスターの設定やパラメータグループについては、database-components.md を参照してください。

ステップ 5 — 高可用性を有効にする

本番環境向けにマルチ AZ デプロイを構成します。

Conditions:
  IsProduction: !Equals [!Ref Environment, production]

Resources:
  DBInstance:
    Type: AWS::RDS::DBInstance
    Properties:
      MultiAZ: !If [IsProduction, true, false]
      BackupRetentionPeriod: !If [IsProduction, 35, 7]
      DeletionProtection: !If [IsProduction, true, false]
      EnablePerformanceInsights: !If [IsProduction, true, false]

マルチ AZ デプロイ、リードレプリカ、Aurora の自動スケーリング、拡張モニタリング、災害復旧については、high-availability.md を参照してください。

ステップ 6 — 出力を定義する

アプリケーションスタック向けに接続情報をエクスポートします。

Outputs:
  DBInstanceEndpoint:
    Description: Database endpoint address
    Value: !GetAtt DBInstance.Endpoint.Address
    Export:
      Name: !Sub ${AWS::StackName}-DBEndpoint

  DBInstancePort:
    Description: Database port
    Value: !GetAtt DBInstance.Endpoint.Port
    Export:
      Name: !Sub ${AWS::StackName}-DBPort

  DBConnectionString:
    Description: Connection string
    Value: !Sub jdbc:mysql://${DBInstance.Endpoint.Address}:${DBInstance.Endpoint.Port}/${DBName}

スタック間参照のパターンやインポート/エクスポートの方法については、template-structure.md を参照してください。

検証手順

デプロイ前、特に本番環境へのデプロイ前には、必ず検証してください。

# Validate the template syntax
aws cloudformation validate-template --template-body file://template.yaml

# Review the change set before applying updates
aws cloudformation create-change-set \
  --stack-name my-rds-stack \
  --template-body file://template.yaml \
  --change-set-type UPDATE

aws cloudformation describe-change-set --change-set-name <arn>

# Execute the change set if the preview looks correct
aws cloudformation execute-change-set --change-set-name <arn>

ベストプラクティス

カテゴリプラクティス実装方法
セキュリティ保存時の暗号化KMS キーと StorageEncrypted: true を使用する
セキュリティ認証情報の管理Secrets Manager との統合を使用する
セキュリティネットワークの分離プライベートサブネットと制限的な SG ルールを使用する
セキュリティIAM 認証IAMDatabaseAuthentication を有効にする
HAマルチ AZ デプロイ本番環境では MultiAZ: true を設定する
HA削除保護本番環境では DeletionProtection: true を設定する
HAバックアップの保持期間本番環境では 35 日、開発環境では 7 日にする
HAリードレプリカ読み取り負荷の高いワークロードで使用する
コストストレージタイプコスト効率を高めるために gp3 を使用する
コストインスタンスのサイズワークロードに基づいて適切なサイズを選択する
コストサーバーレス負荷が変動する場合は Aurora Serverless を検討する
運用変更セット更新を適用する前に必ず確認する
運用ドリフト検出テンプレートへの準拠を確認できるよう有効にする
運用モニタリングCloudWatch アラームを設定する

スタックポリシー、終了保護、バックアップ戦略の詳細については、operational-practices.md を参照してください。

例

MultiAZ、暗号化、Secrets Manager との統合を備えた、本番環境対応の RDS インスタンスの完全な例:

AWSTemplateFormatVersion: '2010-09-09'
Description: Production RDS Instance

Parameters:
  VpcId:
    Type: AWS::EC2::VPC::Identifier
  SubnetIds:
    Type: List<AWS::EC2::Subnet::Identifier>
  AppSecurityGroupId:
    Type: AWS::EC2::SecurityGroup::Id
  Environment:
    Type: String
    AllowedValues: [dev, staging, production]
  MasterUsername:
    Type: String
    Default: dbadmin

Conditions:
  IsProduction: !Equals [!Ref Environment, production]

Resources:
  DBSubnetGroup:
    Type: AWS::RDS::DBSubnetGroup
    Properties:
      DBSubnetGroupDescription: !Sub "${AWS::StackName} subnet group"
      SubnetIds: !Ref SubnetIds

  DBSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: !Sub "${AWS::StackName} RDS security group"
      VpcId: !Ref VpcId
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 3306
          ToPort: 3306
          SourceSecurityGroupId: !Ref AppSecurityGroupId

  DBInstance:
    Type: AWS::RDS::DBInstance
    DeletionPolicy: Snapshot
    UpdateReplacePolicy: Snapshot
    Properties:
      DBInstanceIdentifier: !Sub "${AWS::StackName}-mysql"
      DBInstanceClass: db.t3.medium
      Engine: mysql
      EngineVersion: '8.0'
      MasterUsername: !Ref MasterUsername
      MasterUserPassword: !Ref MasterUserPassword
      AllocatedStorage: 50
      StorageType: gp3
      StorageEncrypted: true
      KmsKeyId: !Ref KmsKeyId
      DBSubnetGroupName: !Ref DBSubnetGroup
      VPCSecurityGroups: [!Ref DBSecurityGroup]
      MultiAZ: !If [IsProduction, true, false]
      BackupRetentionPeriod: !If [IsProduction, 35, 7]
      DeletionProtection: !If [IsProduction, true, false]
      EnablePerformanceInsights: !If [IsProduction, true, false]
      PerformanceInsightsRetentionPeriod: !If [IsProduction, 731, 7]

  KmsKeyId:
    Type: AWS::KMS::Key
    Condition: IsProduction
    Properties:
      Description: KMS key for RDS encryption
      EnableKeyRotation: true
      KeyPolicy:
        Version: '2012-10-17'
        Statement:
          - Sid: Enable IAM User Permissions
            Effect: Allow
            Principal:
              AWS: !Sub arn:aws:iam::${AWS::AccountId}:root
            Action: kms:*
            Resource: '*'

Outputs:
  DBEndpoint:
    Description: Database endpoint
    Value: !GetAtt DBInstance.Endpoint.Address
    Export:
      Name: !Sub ${AWS::StackName}-DBEndpoint
  DBPort:
    Description: Database port
    Value: !GetAtt DBInstance.Endpoint.Port
    Export:
      Name: !Sub ${AWS::StackName}-DBPort

Aurora クラスター、リードレプリカ、マルチリージョン構成などの追加例については、examples.md を参照してください。

リファレンス

コア設定
  • template-structure.md — テンプレートのセクション、パラメーター、マッピング、条件、出力、スタック間参照
  • database-components.md — DB インスタンス、クラスター、パラメーターグループ、サブネットグループ、Aurora の設定
  • security-secrets.md — セキュリティグループ、暗号化、Secrets Manager、IAM 認証
  • high-availability.md — Multi-AZ、リードレプリカ、Aurora の自動スケーリング、災害復旧
運用ガイド
  • operational-practices.md — スタックポリシー、削除保護、ドリフト検出、変更セット、モニタリング
  • constraints.md — リソース制限、運用上の制約、セキュリティ上の制約、コストに関する考慮事項
その他のリソース
  • examples.md — 本番環境対応の完全な例
  • reference.md — CloudFormation RDS リソースのリファレンス

制約と警告

リソースの制限
  • 最大ストレージサイズはエンジンによって異なります(MySQL/PostgreSQL では最大 64 TB)
  • CloudFormation スタックあたりのリソース数は最大 500 個です
  • パラメーターグループの上限はアカウント/リージョンによって異なります
コストに関する考慮事項
  • Multi-AZ デプロイのコストは、単一 AZ の場合のおよそ 2 倍です
  • プロビジョンド IOPS(io1)を使用すると、コストが大幅に増加します
  • 無料利用枠を超えるバックアップストレージには、月額料金が発生します
  • 手動スナップショットには、インスタンスの削除後もストレージ料金が発生します
セキュリティ上の制約
  • 作成後にマスターパスワードを取得することはできません
  • 有効にした後、保存時の暗号化を無効にすることはできません
  • RDS インスタンスは VPC 内に配置する必要があります(パブリックアクセスは推奨されません)
  • セキュリティグループルールでは、アプリケーション層からのアクセスに制限する必要があります
運用上の制約
  • 一部の変更(エンジンバージョン、ストレージタイプ)では、ダウンタイムを伴うインスタンスの置き換えが必要です
  • メンテナンス時間帯には、短時間のサービス中断が発生する場合があります
  • リードレプリカは、プライマリに対して数秒から数分遅れる場合があります
  • すべてのデータベースエンジンを利用できるリージョンがあるわけではありません

制約、トラブルシューティングガイド、パフォーマンスに関する考慮事項の詳細については、constraints.md を参照してください。

コメント