AuroraをSIで扱う際に知る必要のある設計、構築、運用までの知識を体系化。
SIでAuroraを扱う際に必要な情報一式を集約。
目次
PJ 役割分担と本記事の前提
前提:複数の役割を兼任する場合もあるが、以下で人物定義する。
- アプリケーション開発者
AWS上で稼動するシステムのアプリケーションを開発する人を指す。ざっくりなくくりとしては、ソースコードを扱う人。 - システムの管理者
システムを監視、運用する人を指す。一般的には、AWSを所有する顧客自身になるケースが多い。 - インフラ(AWSサービス)担当者
AWSのサービスを構築し、アプリケーションが動作するための基盤(サーバやコンテナなど)を構築するする人を指す。本記事は、この担当者目線での記事となる。
以下の役割分担を想定し、本記事はインフラ担当者向けに整理している。
作業 | 担当者 |
---|---|
Auroraの設計(パラメータ設計) | インフラ担当者(承認:システム管理者) |
Auroraの構築 | インフラ担当者(承認:システム管理者) |
Auroraを使用したアプリの構築 | アプリケーション開発者(承認:システム管理者) |
Auroraの運用(障害時リストアなど) | システム管理者 |
Auroraの特徴
- Amazonが自前で開発したデータベース
- 自動でスケールアウトし、10GBから64TBまで性能影響なくシームレスに拡張される。
- 標準で高可用性(自動で3AZに6つのデータコピーを作成)
- 高速なフェイルオーバが可能。
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作成の場合は自動採番) | |
family | aurora-mysql5.7 | アプリ要件 |
以下の項目を設定。その他デフォルト値。
項目 | 設定例 | 決め方 | 備考 |
---|---|---|---|
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 | アプリ要件 | アドバンストな監査 |
インスタンスパラメータグループ設定
[$systemname]-[$env]-stack-auroradbparametergroup-xxxx
項目 | 設定例 | 決め方 | 備考 |
---|---|---|---|
グループ名 | [$systemname]-[$env]-stack-auroradbparametergroup-xxxx | 任意 (CFn作成の場合は自動採番) | |
family | aurora-mysql5.7 | アプリ要件 | |
以下の項目を設定。その他デフォルト値。
項目 | 設定例 | 決め方 | 備考 |
---|---|---|---|
long_query_time | 3 | アプリ要件 | |
slow_query_log | 1 | アプリ要件 |
サブネットグループ設定
[$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を利用することで管理を一元化するというケースもある。
- Aurora標準バックアップ(ポイントインタイムリカバリ)
- 手軽にバックアップ設定が可能。
- Auroraのクラスター削除時にバックアップデータが消える。
- 指定した時刻にリストアすることが可能。
- アーキテクチャとしては、日次のバックアップ+トランザクションのキャプチャと思われる。Auroraのバックアップ時間指定はこの日次バックアップ時間の指定を指す。
- Auroraの手動スナップショット作成
- 手動実行が必要。
- Auroraインスタンス削除しても消えない。
- AWS Backupによるバックアップ
- 設定の手間があるが、柔軟な設計が可能。
- Auroraインスタンス削除しても消えない。
- バックトラック
- 既存のDBクラスタを復旧時点に戻すことができる。(テーブルを誤って削除したなどの、誤操作時の復旧用)
リストア
リストア動作
- バックトラック以外のリストア(上記 1,2,3)では、既存のDBクラスタを、復旧時点に戻すのではなく、新たにDBクラスタを作成して復旧することになる。
- バックトラックでは、既存のDBクラスタを復旧時点に戻す動作となる。
リストア手順
リストアによる、アプリ側の改修(接続するための識別子変更)を避ける場合、以下2通りが考えられるが、システム停止時間の短さと、リストア後に問題発生した場合のコンティンジェンシー用に既存DBが残っている②の方が安心。作業時間を優先するのであれば、①を選択する。
- 既存のDBクラスタを削除してから、既存のDBクラスタと同じ識別名で復元する。
- 一旦既存とは異なる識別名でDBクラスタを復元する。その後、既存のDBクラスタの識別名を変更する。(変更ではなく、削除してもいいが、コンチプラン用に残す。)最後に既存とは異なる識別名で作成したRDSの識別名を、既存で使用していた識別名に変更する。