CloudFormation で DocumentDB を作った

CloudFormationでDocumentDBを構築するテンプレートです。コピペでご利用ください。
2021.02.26

はじめに

おはようございます、もきゅりんです。

みなさん、DocumentDB 使ってますか?

わたしは DocumentDB は弊社菊池が好きだ、ということくらいしか認知していません。

[AWS] DocumentDB 詳細解説:MongoDB との違いを理解する | DevelopersIO

ということで、CloudFormation で DocumentDB を作る機会があったので展開しておきます。

利用機会があるときにご自由にカスタマイズしてお使い下さい。

前提

  • ポート27017を許可するセキュリティグループおよびDBサブネットは事前に別のCFnで作成済みで、スタックのリソース出力を参照しています。よしなに状況に合わせて入力下さい。
  • マスタユーザー名やパスワードをパラメータ化していますので、SSMパラメータストアや Secrets manager を適宜ご利用下さい。
  • 保存データの暗号化は AWSマネージドサービスカスタマーマスターキー(CMK)を使った有効化ですので任意に変更して下さい。
  • 削除保護は無効にしています。よしなに変更して下さい。
  • Auroraなどと同様、Amazon DocumentDBでは、デフォルトのクラスターパラメーターグループに直接変更を加えることはできないため、パラメータグループを作成して適用しています。
  • パラメータグループでは、イベントの監査ログ、プロファイリングログの出力を有効としています。プロファイリングのパラメータはデフォルトです。CloudWatchLogsに対して標準料金がかかるため、必要、不要なDBパラメータは任意で変更、削除して下さい。
  • エンジンバージョンは4.0.0です。
  • 自動マイナーエンジンアップグレードは無効としています。
  • プライマリ1, レプリカ1です。

参考

上記の参考情報になります。

利用できるバージョンは事前に確認しておきましょう。

aws docdb describe-db-engine-versions \
--engine docdb

作成されるリソース

  • DBサブネットグループ
  • クラスターパラメータグループ
  • プライマリインスタンス
  • リードレプリカインスタンス
  • 監視, プロファイリングログをCloudWatchLogsに出力

テンプレート

AWSTemplateFormatVersion: '2010-09-09'
Description: DocumentDB template
# ------------------------------------------------------------#
# Parameters
# ------------------------------------------------------------#
Parameters:
  NameTagPrefix:
    Type: String
    Default: 'demo'
    Description: Prefix of Name tags.
  Env:
    Type: String
    Default: 'dev'
    Description: Prefix of Env tags.
  MasterUsername:
    NoEcho: 'true'
    Description: DB MasterUserName
    Type: 'String'
  MasterUserPassword:
    NoEcho: 'true'
    Description: DB MasterPassword
    Type: 'String'
  DocDBInstanceClass:
    Description: 'Instance class. Please refer to: https://docs.aws.amazon.com/documentdb/latest/developerguide/db-instance-classes.html#db-instance-classes-by-region'
    Type: 'String'
    Default: 'db.t3.medium'
    AllowedValues:
      - db.t3.medium
      - db.r5.large
      - db.r5.xlarge
      - db.r5.2xlarge
      - db.r5.4xlarge
      - db.r5.12xlarge
      - db.r5.24xlarge
    ConstraintDescription: 'Instance type must be of the ones supported for the region. Please refer to: https://docs.aws.amazon.com/documentdb/latest/developerguide/db-instance-classes.html#db-instance-classes-by-region'
  BackupRetentionPeriod:
    Description: BuckUp Generation(1-35)
    Type: String
    Default: '7'
  PreferredBackupWindow:
    Description: Enter BackupWindow
    Type: String
    Default: '17:00-17:30'
  PreferredMaintenanceWindow:
    Description: Enter MaintenanceWindow(UTC)
    Type: String
    Default: 'sun:17:30-sun:18:00'
# ------------------------------------------------------------#
# Resources
# ------------------------------------------------------------#
Resources:
  docDBSubnetGroup:
    Type: AWS::DocDB::DBSubnetGroup
    Properties:
      DBSubnetGroupDescription: Aurora Subnet Group
      DBSubnetGroupName: !Sub ${NameTagPrefix}-${Env}-docdb-subnetgroup
      SubnetIds:
        - Fn::ImportValue: !Sub ${NameTagPrefix}-${Env}-private-subnet-1a
        - Fn::ImportValue: !Sub ${NameTagPrefix}-${Env}-private-subnet-1c
      Tags:
        - Key: Name
          Value: !Sub ${NameTagPrefix}-${Env}-docdb-subnetgroup
  docDBClusterParameterGroup:
    Type: AWS::DocDB::DBClusterParameterGroup
    Properties:
      Description: 'docDB4.0.0ClusterParameterGroup'
      Family: docdb4.0
      Name: !Sub ${NameTagPrefix}-${Env}-docDBCluster-ParameterGroup
      Parameters:
        audit_logs: 'enabled'
        profiler: 'enabled'
        profiler_sampling_rate: 1.0
        profiler_threshold_ms: 100
      Tags:
        - Key: Name
          Value: !Sub ${NameTagPrefix}-${Env}-docDBCluster-ParameterGroup
  docDBCluster:
    Type: AWS::DocDB::DBCluster
    Properties:
      BackupRetentionPeriod: !Ref BackupRetentionPeriod
      DBClusterIdentifier: !Sub '${NameTagPrefix}-${Env}-docdb-cluster'
      DBClusterParameterGroupName: !Ref docDBClusterParameterGroup
      DBSubnetGroupName: !Ref docDBSubnetGroup
      DeletionProtection: false
      EnableCloudwatchLogsExports:
        - audit
        - profiler
      EngineVersion: 4.0.0
      MasterUsername: !Ref MasterUsername
      MasterUserPassword: !Ref MasterUserPassword
      Port: 27017
      PreferredBackupWindow: !Ref PreferredBackupWindow
      PreferredMaintenanceWindow: !Ref PreferredMaintenanceWindow
      StorageEncrypted: true
      Tags:
        - Key: Name
          Value: docDB-Cluster
      VpcSecurityGroupIds:
        - Fn::ImportValue: !Sub ${NameTagPrefix}-${Env}-docdb-sg
  docDBInstance1a:
    Type: AWS::DocDB::DBInstance
    Properties:
      AutoMinorVersionUpgrade: false
      AvailabilityZone: !Select
        - 0
        - !GetAZs
          Ref: 'AWS::Region'
      DBClusterIdentifier: !Ref docDBCluster
      DBInstanceIdentifier: !Sub '${NameTagPrefix}-${Env}-docdb1a'
      DBInstanceClass: !Ref DocDBInstanceClass
      Tags:
        - Key: Name
          Value: !Sub ${NameTagPrefix}-${Env}-docdb-instance1a
  docDBInstance1c:
    Type: AWS::DocDB::DBInstance
    Properties:
      AutoMinorVersionUpgrade: false
      AvailabilityZone: !Select
        - 1
        - !GetAZs
          Ref: 'AWS::Region'
      DBClusterIdentifier: !Ref docDBCluster
      DBInstanceIdentifier: !Sub '${NameTagPrefix}-${Env}-docdb1c'
      DBInstanceClass: !Ref DocDBInstanceClass
      Tags:
        - Key: Name
          Value: !Sub ${NameTagPrefix}-${Env}-docdb-instance1c
# ------------------------------------------------------------#
# Outputs
# ------------------------------------------------------------#
Outputs:
  ClusterId:
    Value: !Ref docDBCluster
  ClusterEndpoint:
    Value: !GetAtt docDBCluster.Endpoint
  ClusterPort:
    Value: !GetAtt docDBCluster.Port
  EngineVersion:
    Value: '4.0.0'

最後に

まぁ Aurora のテンプレートと似ているので少々の手間分くらいしかお役に立たないと思いますが、どこかのどなたかのお役に立てば幸いです。