MENU
category

[AWS]Aurora 設計、構築、運用のポイント集

AuroraをSIで扱う際に知る必要のある設計、構築、運用までの知識を体系化。
SIでAuroraを扱う際に必要な情報一式を集約。

目次

PJ 役割分担と本記事の前提

前提:複数の役割を兼任する場合もあるが、以下で人物定義する。

  • アプリケーション開発者
    AWS上で稼動するシステムのアプリケーションを開発する人を指す。ざっくりなくくりとしては、ソースコードを扱う人。
  • システムの管理者
    システムを監視、運用する人を指す。一般的には、AWSを所有する顧客自身になるケースが多い。
  • インフラ(AWSサービス)担当者
    AWSのサービスを構築し、アプリケーションが動作するための基盤(サーバやコンテナなど)を構築するする人を指す。本記事は、この担当者目線での記事となる。

以下の役割分担を想定し、本記事はインフラ担当者向けに整理している。

作業担当者
Auroraの設計(パラメータ設計)インフラ担当者(承認:システム管理者)
Auroraの構築インフラ担当者(承認:システム管理者)
Auroraを使用したアプリの構築アプリケーション開発者(承認:システム管理者)
Auroraの運用(障害時リストアなど)システム管理者

Auroraの特徴

  • Amazonが自前で開発したデータベース
  • 自動でスケールアウトし、10GBから64TBまで性能影響なくシームレスに拡張される。
  • 標準で高可用性(自動で3AZに6つのデータコピーを作成)
  • 高速なフェイルオーバが可能。

参考)Amazon Aurora MySQL

Auroraの設計

  • AWSコンソールで構築する場合は意識しないが、Cloud Formationで構築する場合は、Auroraクラスタの構築とインスタンス設定が分かれているため、Cloud Formationベースで設計を行っておく。

Aurora クラスタ設定

パラメータサンプルと、決め方について記載する。サンプルは、実際の成果物としての利用やヒアリング項目の網羅性チェックで利用することを推奨。

以降、パラメータサンプルを記載する。各パラメータの決め方は、大きく以下3通り。

  • アプリ要件:アプリケーション要件を、アプリケーション開発者にヒアリングして確定する。
  • サービスのXX要件:可用性要件や保守性要件など、サービス全体の要件から確定する部分。システム管理者にヒアリングして確定する。
  • 任意:基本的にシステム管理者が任意に決められるため、システム管理者による指定、又はインフラ担当者にて候補提示してシステム管理者に承認頂く形で確定。

クラスタ設定
[$systemname]-[$env]-aurora-cluster

項目設定例決め方備考
DBの種類Aurora MySQLアプリ要件
DBエンジンのバージョン5.7.mysql_aurora.2.07.8 アプリ要件初期構築で選択できるバージョンと、構築後にバージョンアップ可能なバージョンが異なる。
後者の方が選択可能なバージョンが多い。

そのため、初期構築で構築後に、手動バージョンアップが必要なケースがある。
DBクラスター識別子(DBClusterIdentifier)
[$systemname]-[$env]-aurora-cluster任意

マルチAZ有効サービスの可用性要件Cfnの場合、2つめのインスタンスを作成するとマルチAZ相当になる。
ライターエンドポイント[$systemname]-[$env]-aurora-cluster.cluster-xxxxx.ap-northeast-1.rds.amazonaws.com自動生成DBクラスター識別子の値に応じて自動的に採番される。
リーダーエンドポイント[$systemname]-[$env]-aurora-cluster.cluster-ro-xxxx.ap-northeast-1.rds.amazonaws.com自動生成DBクラスター識別子の値に応じて自動的に採番される。
セキュリティグループ[$systemname]-[$env]-aurora-sg
サービスの通信要件(グループ名称自体は任意)
マスターユーザー名admin(デフォルト値)任意
マスターパスワードPassword任意
AWS Secrets Manager でマスター認証情報を管理する無効サービスのセキュリティ要件。

パスワードを自動更新したい場合や、構築コードへの直書きを避けたい場合などに利用する。
DBサブネットグループ[$systemname]-[$env]-aurora-subnet-groupサービスの通信要件。

接続元に応じて、パブリックまたは、プライベートのサブネットを指定。(サブネットグループ名称自体は任意)
データベースのポート3306(デフォルト値)アプリ要件
パブリックアクセスなしサービスの通信要件で確定。

パブリックアクセス不要ならなし。
データベース名なしアプリ要件

アプリケーション開発者側で、後から作成する場合は、なし。
DBクラスターパラメータグループ[$systemname]-[$env]-stack-auroradbclusterparametergroup-xxxx
アプリ要件

クラスタ単位で、パラメータ使用するパラメータを設定する。
(パラメータグループ名称自体は任意)
バックアップ保存期間(1〜35日)(BackupRetentionPeriod)
7日間(デフォルト値)サービスの保管要件。

バックアップウィンドウ18:00-18:30
サービスの可用性要件。

一日の静止点となる時点で取得する。
日本時間 03:00-03:30 
メンテナンスウィンドウsun:19:00-sun:19:30サービスの可用性要件。

メンテナンスによって停止する可能性があるため、サービス停止可能な時間帯を指定。
日本時間 月曜日 04:00-04:30

クラスタ単位のメンテナンス(変更)が該当する。インスタンス単位のメンテナンスは、各インスタンス事に設定されたメンテナンス時間で行われる。
バックトラック無効サービスの可用性要件。

誤操作時などによる巻き戻しが必要なケースで使用する。RTO(復旧目標時間)が比較的シビアな場合にも有効。
ターゲットバックトラックウィンドウ(空白)バックトラックを使用する場合に、巻き戻しが可能な期間を指定する。
ログのエクスポート(EnableCloudwatchLogsExports)
監査ログ
エラーログ
スロークエリログ
サービスの監視、監査要件。

エラーログ、スロークエリログおよび全般ログは、主に障害調査用。

監査ログは、DBアクセスログなどの履歴を保管する場合に取得する。※1
当設定は、CloudWatchへの転送設定のみのため、ログを出力する設定として、パラメータグループ設定も必要。
暗号化有効 (aws/rds)サービスのセキュリティ要件。

削除保護有効サービスの保守性要件。

誤削除防止として、有効化するのが一般的。

※1. ログはCloud Watch Logsへ出力するが、保管用と監視用の2つの要件がある場合には、以下のようにS3を併用する構成にするとコストメリットがある。

  • Cloud Watch Logsのログには失効期間を設ける。→直近の監視用
  • Cloud Watch Logsからサブスクリプションフィルターを利用してFirehose経由でS3に転送する。→長期保管用

具体的にどのようなログが出力されるか、どのログを取得すべきかは、こちらの記事を参照。

Auroraインスタンス設定

  • 最初に作成されたインスタンスがライターインスタンスとなり、2つ目に作成されたインスタンスはリーダーインスタンスとなる。Cloud Formationで作成する際は、DependOnを使用するなどしてインスタンス作成順序を制御して、意図したインスタンスをライターにする。

インスタンス設定
[$systemname]-[$env]-instance-1a

項目設定例決め方備考
インスタンス名[$systemname]-[$env]-instance-1a任意
DBインスタンスクラスdb.r6g.xlargeサービスの性能要件。

サービス利用のピーク時でも許容可能なサイズにする。
DBパラメータグループ[$systemname]-[$env]-stack-auroradbparametergroup-xxxxアプリ要件(パラメータグループ名称自体は任意)
Performance Insights有効:7日(暗号化:aws/rds)サービスの保守性要件。

パフォーマンスに問題が発生した場合の調査用として取得するのが一般的。
パフォーマンスインサイト
拡張モニタリング有効:60秒サービスの保守性要件。

パフォーマンスに問題が発生した場合の調査用として取得するのが一般的。
拡張モニタリング
モニタリングロール[$systemname]-[$env]-aurora-role
メンテナンスウィンドウsun:19:30-sun:20:00サービスの可用性要件。インスタンスが停止しても問題ない時間帯を指定する。

クラスタのメンテナンスウィンドウおよび、他のインスタンスのメンテナンスウィンドウと時間を重ねないようにする。

AWSコンソールで設定すると、上記のように時間帯が分散するため、分散した方がコンソールと思想が同じになる。
そうすることで、少なくともインスタンス単位での、メンテナンスダウンタイムを分散してサービス全体での可用性を向上できる。

日本時間 月曜日 04:30-05:00
マイナーバージョン自動アップグレード無効サービス保守性要件。

アップデートを手動コントロールしたい場合は、無効化。
(自動アップデートはダウンタイムを伴う。)
マイナーエンジンバージョンの自動アップグレード

インスタンス設定
[$systemname]-[$env]-instance-1c

項目設定例決め方備考
インスタンス名[$systemname]-[$env]-instance-1c上記、インスタンス(1a)と同様。
DBインスタンスクラスdb.r6g.xlarge上記、インスタンス(1a)と同様。
DBパラメータグループ[$systemname]-[$env]-stack-auroradbparametergroup-xxxx上記、インスタンス(1a)と同様。
Performance Insights有効:7日(暗号化:aws/rds)上記、インスタンス(1a)と同様。
拡張モニタリング有効:60秒上記、インスタンス(1a)と同様。
モニタリングロール[$systemname]-[$env]-aurora-role上記、インスタンス(1a)と同様。
メンテナンスウィンドウsun:20:00-sun:20:30サービスの可用性要件。インスタンスが停止しても問題ない時間帯を指定する。

日本時間 月曜日 05:00-05:30
マイナーバージョン自動アップグレード無効上記、インスタンス(1a)と同様。

クラスタパラメータグループ設定
[$systemname]-[$env]-stack-auroradbclusterparametergroup-xxxx

項目設定例決め方備考
グループ名[$systemname]-[$env]-stack-auroradbclusterparametergroup-xxxx任意

(CFn作成の場合は自動採番)
familyaurora-mysql5.7アプリ要件

以下の項目を設定。その他デフォルト値。

項目設定例決め方備考
time_zoneAsia/Tokyoアプリ要件
character_set_clientutf8mb4アプリ要件
character_set_connectionutf8mb4アプリ要件
character_set_databaseutf8mb4アプリ要件
character_set_resultsutf8mb4アプリ要件
character_set_serverutf8mb4アプリ要件
character_set_filesystemutf8mb4アプリ要件
server_audit_logging1アプリ要件
server_audit_eventsCONNECT,QUERY_DCL,QUERY_DDLアプリ要件アドバンストな監査

インスタンスパラメータグループ設定
[$systemname]-[$env]-stack-auroradbparametergroup-xxxx

項目設定例決め方備考
グループ名[$systemname]-[$env]-stack-auroradbparametergroup-xxxx任意

(CFn作成の場合は自動採番)

familyaurora-mysql5.7アプリ要件


以下の項目を設定。その他デフォルト値。

項目設定例決め方備考
long_query_time3アプリ要件
slow_query_log1アプリ要件

サブネットグループ設定
[$systemname]-[$env]-aurora-subnet-group

アベイラビリティゾーンサブネット決め方備考
ap-northeast-1a[$systemname]-[$env]-private-subnet01a

RDSが稼動するサブネットを指定。

ap-northeast-1c[$systemname]-[$env]-private-subnet01c
RDSが稼動するサブネットを指定。

IAMロール
[$systemname]-[$env]-aurora-role

項目設定例決め方備考
AWS管理ポリシーAmazonRDSEnhancedMonitoringRole拡張モニタリングを使用する場合に必要なポリシー。拡張モニタリング用

構築

上記設定例を使用した場合のCloud Formationコード。(プライベートサブネット×2 でAuroraを稼動)


AWSTemplateFormatVersion: 2010-09-09
Metadata:
  AWS::CloudFormation::Interface:
    ParameterGroups:
      - Label:
          default: Common Setting
        Parameters:
          - SystemName
          - EnvType
          
Parameters:
  SystemName:
    Type: String
    Default: demo
  EnvType:
    Type: String
    Default: prod
    
Resources:
# VPC
  ## VPC CIDR
  VPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.0.0.0/16
      EnableDnsSupport: true
      EnableDnsHostnames: true
      InstanceTenancy: default
      Tags:
        - Key: Name
          Value: !Sub ${SystemName}-${EnvType}-vpc
        
          
  ## Private-Subnet01a
  PrivateSubnet01a:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC
      AvailabilityZone: ap-northeast-1a
      CidrBlock: 10.0.0.0/24
      MapPublicIpOnLaunch: true
      Tags:
        - Key: Name
          Value: !Sub ${SystemName}-${EnvType}-private01a

  ## Private-Subnet01c
  PrivateSubnet01c:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC
      AvailabilityZone: ap-northeast-1c
      CidrBlock: 10.0.1.0/24
      MapPublicIpOnLaunch: true
      Tags:
        - Key: Name
          Value: !Sub ${SystemName}-${EnvType}-private01c   

  ## RDSSecuritygroup
  RDSSecuritygroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupName: !Sub ${SystemName}-${EnvType}-rds-sg
      GroupDescription: !Sub ${SystemName}-${EnvType}-rds-sg
      Tags:
        - Key: Name
          Value: !Sub ${SystemName}-${EnvType}-rds-sg  
      VpcId: !Ref VPC
      SecurityGroupIngress:
      - IpProtocol: TCP
        FromPort: 3306
        ToPort: 3306
        CidrIp: 10.0.0.0/16

  # Aurora Cluster
  AuroraDBCluster:
    Type: AWS::RDS::DBCluster
    Properties:
      DBClusterIdentifier: !Sub ${SystemName}-${EnvType}-aurora-cluster
      Engine: aurora-mysql
      EngineVersion: "5.7.mysql_aurora.2.07.8"
      DBSubnetGroupName: !Ref AuroraDBSubnetGroup
      StorageEncrypted: true
      VpcSecurityGroupIds:
        - !GetAtt RDSSecuritygroup.GroupId
      Port: 3306
      DBClusterParameterGroupName: !Ref AuroraDBClusterParameterGroup
      BackupRetentionPeriod: 7
      PreferredBackupWindow: 18:00-18:30
      PreferredMaintenanceWindow: Sun:19:00-Sun:19:30
      EnableCloudwatchLogsExports:
        - audit
        - error
        - slowquery
      MasterUsername: admin
      MasterUserPassword: Password
      DeletionProtection: true
      Tags:
        - Key: Name
          Value: !Sub ${SystemName}-${EnvType}-aurora-cluster
          

  # Instance
  AuroraInstance1:
    Type: AWS::RDS::DBInstance
    Properties:
      Engine: aurora-mysql
      DBClusterIdentifier: !Ref AuroraDBCluster
      DBInstanceIdentifier: !Sub ${SystemName}-${EnvType}-aurora-instance-1a
      DBInstanceClass: db.r6g.xlarge
      AvailabilityZone: ap-northeast-1a
      DBParameterGroupName: !Ref AuroraDBParameterGroup
      EnablePerformanceInsights: true
      PerformanceInsightsRetentionPeriod: 7
      MonitoringInterval: 60
      MonitoringRoleArn: !GetAtt RDSRole.Arn
      PreferredMaintenanceWindow: sun:19:30-sun:20:00
      AutoMinorVersionUpgrade: false
      PubliclyAccessible: False
      DBSubnetGroupName: !Ref AuroraDBSubnetGroup
      Tags:
        - Key: Name
          Value: !Sub ${SystemName}-${EnvType}-aurora-instance-1a

  # Instance
  AuroraInstance2:
    DependsOn: AuroraInstance1
    Type: AWS::RDS::DBInstance
    Properties:
      Engine: aurora-mysql
      DBClusterIdentifier: !Ref AuroraDBCluster
      DBInstanceIdentifier: !Sub ${SystemName}-${EnvType}-aurora-instance-1c
      DBInstanceClass: db.r6g.xlarge
      AvailabilityZone: ap-northeast-1c
      DBParameterGroupName: !Ref AuroraDBParameterGroup
      EnablePerformanceInsights: true
      PerformanceInsightsRetentionPeriod: 7
      MonitoringInterval: 60
      MonitoringRoleArn: !GetAtt RDSRole.Arn
      PreferredMaintenanceWindow: sun:20:00-sun:20:30
      AutoMinorVersionUpgrade: false
      PubliclyAccessible: False
      DBSubnetGroupName: !Ref AuroraDBSubnetGroup
      Tags:
        - Key: Name
          Value: !Sub ${SystemName}-${EnvType}-aurora-instance-1c

  # Subnet Group
  AuroraDBSubnetGroup:
    Type: AWS::RDS::DBSubnetGroup
    Properties:
      DBSubnetGroupName: !Sub ${SystemName}-${EnvType}-aurora-subnet-group
      DBSubnetGroupDescription: Subnets available for the RDS DB Instance
      SubnetIds:
        - !Ref PrivateSubnet01a
        - !Ref PrivateSubnet01c
      Tags:
        - Key: Name
          Value: !Sub ${SystemName}-${EnvType}-aurora-subnet-group

  # Parameter Group(Cluster)
  AuroraDBClusterParameterGroup: 
    Type: AWS::RDS::DBClusterParameterGroup
    Properties:
      Description: !Sub ${SystemName}-${EnvType}-aurora-cluster-pg
      Family: aurora-mysql5.7
      Parameters:
        time_zone: Asia/Tokyo
        character_set_client: utf8mb4
        character_set_connection: utf8mb4
        character_set_database: utf8mb4
        character_set_results: utf8mb4
        character_set_server: utf8mb4
        character_set_filesystem: utf8mb4
        server_audit_logging: 1
        server_audit_events: CONNECT,QUERY_DCL,QUERY_DDL
      Tags:
          - Key: Name
            Value: !Sub ${SystemName}-${EnvType}-aurora-cluster-pg

  # Parameter Group
  AuroraDBParameterGroup:
    Type: AWS::RDS::DBParameterGroup
    Properties:
      Description: !Sub ${SystemName}-${EnvType}-aurora-pg
      Family: aurora-mysql5.7
      Parameters:
        long_query_time: 3
        slow_query_log: 1
      Tags:
          - Key: Name
            Value: !Sub ${SystemName}-${EnvType}-aurora-pg
            

  ## EDSRole
  RDSRole:
    Type: "AWS::IAM::Role"
    Properties:
      RoleName: !Sub ${SystemName}-${EnvType}-rds-role
      Path: "/"
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
          - Effect: Allow
            Principal:
              Service: monitoring.rds.amazonaws.com
            Action: sts:AssumeRole
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/service-role/AmazonRDSEnhancedMonitoringRole
      Tags:
        - Key: Name
          Value: !Sub ${SystemName}-${EnvType}-rds-role

接続方法

前提条件

  • 必要なポート接続が可能(セキュリティグループおよびルーティングの設定ができている。)
    ※IAMロールは不要
  • 以下のコマンドを実行してRDSに接続する。
mysql -h <エンドポイント> -P 3306 -u <ユーザ名> -p 
※パスワード入力する。

運用

バックアップ

バックアップは、以下4通りある。

  • 明確な要件が無い場合は、1.Aurora標準バックアップ(ポイントインタイムリカバリ)で足りるケースが多いが、クラスタ削除時にバックアップも消える点は注意。少なくともクラスタの削除保護を有効化しておいた方がよい
  • 既にAWS Backupを利用していたり、複数のバックアップ対象があるような場合には、AWS Backupを利用することで管理を一元化するというケースもある。
  1. Aurora標準バックアップ(ポイントインタイムリカバリ) 
    • 手軽にバックアップ設定が可能。
    • Auroraのクラスター削除時にバックアップデータが消える。
    • 指定した時刻にリストアすることが可能。
    • アーキテクチャとしては、日次のバックアップ+トランザクションのキャプチャと思われる。Auroraのバックアップ時間指定はこの日次バックアップ時間の指定を指す。
  2. Auroraの手動スナップショット作成
    • 手動実行が必要。
    • Auroraインスタンス削除しても消えない。
  3. AWS Backupによるバックアップ
    • 設定の手間があるが、柔軟な設計が可能。
    • Auroraインスタンス削除しても消えない。
  4. バックトラック
    • 既存のDBクラスタを復旧時点に戻すことができる。(テーブルを誤って削除したなどの、誤操作時の復旧用)

リストア

リストア動作

  • バックトラック以外のリストア(上記 1,2,3)では、既存のDBクラスタを、復旧時点に戻すのではなく、新たにDBクラスタを作成して復旧することになる。
  • バックトラックでは、既存のDBクラスタを復旧時点に戻す動作となる。

リストア手順

リストアによる、アプリ側の改修(接続するための識別子変更)を避ける場合、以下2通りが考えられるが、システム停止時間の短さと、リストア後に問題発生した場合のコンティンジェンシー用に既存DBが残っている②の方が安心。作業時間を優先するのであれば、①を選択する。

  1. 既存のDBクラスタを削除してから、既存のDBクラスタと同じ識別名で復元する。
  2. 一旦既存とは異なる識別名でDBクラスタを復元する。その後、既存のDBクラスタの識別名を変更する。(変更ではなく、削除してもいいが、コンチプラン用に残す。)最後に既存とは異なる識別名で作成したRDSの識別名を、既存で使用していた識別名に変更する。
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

目次