この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので十分ご注意ください。
Amazon RDS DBインスタンスのパフォーマンス向上のために、スケールアップしなければいけないことがあるかもしれません。
しかし、Amazon RDSのDBインスタンスクラスを変更する際には注意点があります。注意点とは公式ドキュメントに書かれている"この変更中に、ダウンタイムが発生します。"という点です。
サービス提供中にダウンタイムが発生すると、継続したサービス提供に影響が出ますよね。
今回の記事ではAmazon RDSのDBインスタンスクラスを変更方法と、WorePressサイトを利用しAmazon RDSのDBインスタンスクラスを変更中にどんな影響が出たか紹介します。
Amazon RDSのDBインスタンスクラスを変更してみる
この記事では、以下の3つを確認します。
- DBインスタンスクラスの変更方法
- DBインスタンスクラス変更中に記事投稿
- DBインスタンスクラス変更完了後に投稿記事確認
■構築図
■WordPressインストール
今回はAmazon RDSのDBインスタンスクラス変更が目的なので、それ以外の部分はCloudFormationテンプレートを利用して環境構築します。
↓テンプレートを利用すると、以下の図の部分が構築されます。
↓以下のドキュメントを利用して、環境を構築してください。わたしはシンガポールリージョンで構築します。
AWSTemplateFormatVersion: "2010-09-09"
Description:
Create VPC,Subnet,IGW,RouteTable,IAMrole,and EC2Instance
Parameters:
myVPCCIDR:
Type: String
Default: 10.0.0.0/16
myPublicSubnet1CIDR:
Type: String
Default: 10.0.0.0/24
myPublicSubnet2CIDR:
Type: String
Default: 10.0.16.0/24
myPrivateSubnet1CIDR:
Type: String
Default: 10.0.128.0/24
myPrivateSubnet2CIDR:
Type: String
Default: 10.0.144.0/24
myKeyName:
Type: "AWS::EC2::KeyPair::KeyName"
Resources:
myVPC:
Type: AWS::EC2::VPC
Properties:
CidrBlock: !Ref myVPCCIDR
EnableDnsHostnames: 'true'
EnableDnsSupport: 'true'
InstanceTenancy: default
Tags:
- Key: Name
Value: !Sub ${AWS::StackName}-vpc
myInternetGateway:
Type: AWS::EC2::InternetGateway
Properties:
Tags:
- Key: Name
Value: !Sub ${AWS::StackName}-IGW
attachGateway:
Type: AWS::EC2::VPCGatewayAttachment
Properties:
VpcId:
Ref: myVPC
InternetGatewayId:
Ref: myInternetGateway
myPublicSubnet1:
Type: AWS::EC2::Subnet
Properties:
VpcId:
Ref: myVPC
CidrBlock: !Ref myPublicSubnet1CIDR
AvailabilityZone: !Select
- 0
- Fn::GetAZs: !Ref 'AWS::Region'
Tags:
- Key: Name
Value: !Sub ${AWS::StackName}-subnet-public1
myPublicSubnet2:
Type: AWS::EC2::Subnet
Properties:
VpcId:
Ref: myVPC
CidrBlock: !Ref myPublicSubnet2CIDR
AvailabilityZone: !Select
- 1
- Fn::GetAZs: !Ref 'AWS::Region'
Tags:
- Key: Name
Value: !Sub ${AWS::StackName}-subnet-public2
myPrivateSubnet1:
Type: AWS::EC2::Subnet
Properties:
VpcId:
Ref: myVPC
CidrBlock: !Ref myPrivateSubnet1CIDR
AvailabilityZone: !Select
- 0
- Fn::GetAZs: !Ref 'AWS::Region'
Tags:
- Key: Name
Value: !Sub ${AWS::StackName}-subnet-private1
myPrivateSubnet2:
Type: AWS::EC2::Subnet
Properties:
VpcId:
Ref: myVPC
CidrBlock: !Ref myPrivateSubnet2CIDR
AvailabilityZone: !Select
- 1
- Fn::GetAZs: !Ref 'AWS::Region'
Tags:
- Key: Name
Value: !Sub ${AWS::StackName}-subnet-private2
myPublicRouteTable:
Type: AWS::EC2::RouteTable
Properties:
VpcId:
Ref: myVPC
Tags:
- Key: Name
Value: !Sub ${AWS::StackName}-rtb-public
myPrivateRouteTable1:
Type: AWS::EC2::RouteTable
Properties:
VpcId:
Ref: myVPC
Tags:
- Key: Name
Value: !Sub ${AWS::StackName}-rtb-private1
myPrivateRouteTable2:
Type: AWS::EC2::RouteTable
Properties:
VpcId:
Ref: myVPC
Tags:
- Key: Name
Value: !Sub ${AWS::StackName}-rtb-private2
myPublicRoute:
Type: AWS::EC2::Route
Properties:
RouteTableId:
Ref: myPublicRouteTable
DestinationCidrBlock: 0.0.0.0/0
GatewayId:
Ref: myInternetGateway
myPublicSubnet1RouteTableAssociation:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
SubnetId:
Ref: myPublicSubnet1
RouteTableId:
Ref: myPublicRouteTable
myPublicSubnet2RouteTableAssociation:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
SubnetId:
Ref: myPublicSubnet2
RouteTableId:
Ref: myPublicRouteTable
myPrivateSubnet1RouteTableAssociation:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
SubnetId:
Ref: myPrivateSubnet1
RouteTableId:
Ref: myPrivateRouteTable1
myPrivateSubnet2RouteTableAssociation:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
SubnetId:
Ref: myPrivateSubnet2
RouteTableId:
Ref: myPrivateRouteTable2
myEc2SecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: EC2 SG
VpcId: !Ref myVPC
SecurityGroupIngress:
- IpProtocol: -1
FromPort: -1
ToPort: -1
CidrIp: 10.0.0.0/16
- IpProtocol: tcp
FromPort: 80
ToPort: 80
CidrIp: 0.0.0.0/0
GroupName: !Sub ${AWS::StackName}-ec2-sg
Tags:
- Key: Name
Value: !Sub ${AWS::StackName}-ec2-sg
myRdsSecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: RDS SG
VpcId: !Ref myVPC
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: 3306
ToPort: 3306
SourceSecurityGroupId: !Ref myEc2SecurityGroup
GroupName: !Sub ${AWS::StackName}-rds-sg
Tags:
- Key: Name
Value: !Sub ${AWS::StackName}-rds-sg
myEc2Instance:
Type: AWS::EC2::Instance
DependsOn: attachGateway
Properties:
ImageId: ami-0406b8387ac37a82a
InstanceType: m6g.large
KeyName: !Ref myKeyName
NetworkInterfaces:
- SubnetId: !Ref myPublicSubnet1
GroupSet:
- !Ref myEc2SecurityGroup
AssociatePublicIpAddress: 'true'
DeviceIndex : 0
PrivateIpAddress: 10.0.0.10
IamInstanceProfile: !Ref myInstanceProfile
Tags:
- Key: Name
Value: !Sub ${AWS::StackName}-EC2
UserData:
Fn::Base64: |
#!/bin/bash
sudo dnf update -y
sudo dnf install -y httpd wget php-mysqlnd httpd php-fpm php-mysqli mariadb105-server php-json php php-devel -y
sudo wget -P /tmp https://wordpress.org/latest.zip
sudo unzip /tmp/latest.zip -d /tmp
sudo mv /tmp/wordpress/* /var/www/html/
sudo rm -rf /tmp/wordpress/ /tmp/latest.zip
sudo chown -R apache /var/www
sudo chgrp -R apache /var/www
sudo chmod 2775 /var/www
find /var/www -type d -exec sudo chmod 2775 {} \;
find /var/www -type f -exec sudo chmod 0664 {} \;
sudo systemctl start httpd.service
sudo systemctl enable httpd.service
myIamRole:
Type: AWS::IAM::Role
Properties:
RoleName: !Sub ${AWS::StackName}-iamrole
AssumeRolePolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: Allow
Principal:
Service: ec2.amazonaws.com
Action: sts:AssumeRole
ManagedPolicyArns:
- arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore
- arn:aws:iam::aws:policy/AmazonRDSReadOnlyAccess
myInstanceProfile:
Type: AWS::IAM::InstanceProfile
Properties:
Roles:
- !Ref myIamRole
Outputs:
myVPC:
Value: !Ref myVPC
Export:
Name: !Sub ${AWS::StackName}-vpc
myVPCCIDR:
Value: !Ref myVPCCIDR
Export:
Name: !Sub ${AWS::StackName}-vpc-cidr
myPublicSubnet1:
Value: !Ref myPublicSubnet1
Export:
Name: !Sub ${AWS::StackName}-subnet-public1
myPublicSubnet1CIDR:
Value: !Ref myPublicSubnet1CIDR
Export:
Name: !Sub ${AWS::StackName}-subnet-public1-cidr
myPublicSubnet2:
Value: !Ref myPublicSubnet2
Export:
Name: !Sub ${AWS::StackName}-subnet-public2
myPublicSubnet2CIDR:
Value: !Ref myPublicSubnet2CIDR
Export:
Name: !Sub ${AWS::StackName}-subnet-public2-cidr
myPrivateSubnet1:
Value: !Ref myPrivateSubnet1
Export:
Name: !Sub ${AWS::StackName}-subnet-private1
myPrivateSubnet1CIDR:
Value: !Ref myPrivateSubnet1CIDR
Export:
Name: !Sub ${AWS::StackName}-subnet-private1-cidr
myPrivateSubnet2:
Value: !Ref myPrivateSubnet2
Export:
Name: !Sub ${AWS::StackName}-subnet-private2
myPrivateSubnet2CIDR:
Value: !Ref myPrivateSubnet2CIDR
Export:
Name: !Sub ${AWS::StackName}-subnet-private2-cidr
myPublicRouteTable:
Value: !Ref myPublicRouteTable
Export:
Name: !Sub ${AWS::StackName}-rtb-public
myPrivateRouteTable1:
Value: !Ref myPrivateRouteTable1
Export:
Name: !Sub ${AWS::StackName}-rtb-private1
myPrivateRouteTable2:
Value: !Ref myPrivateRouteTable2
Export:
Name: !Sub ${AWS::StackName}-rtb-private2
myEc2InstancePublicIp:
Value: !GetAtt myEc2Instance.PublicIp
Export:
Name: !Sub ${AWS::StackName}-myEc2InstancePublicIp
myEc2InstancePrivateIp:
Value: !GetAtt myEc2Instance.PrivateIp
Export:
Name: !Sub ${AWS::StackName}-myEc2InstancePrivateIp
■Amazon RDS作成
環境が作成できましたら、Amazon RDS DBインスタンスを作成します。
●サブネットグループ作成
先にサブネットグループを作成しておきます。
設定値は以下の通りです。
項目 | 設定値 |
---|---|
Name | 任意 |
Description | 任意 |
VPC | 作成したもの |
Availability Zones | ap-southeast-1a,ap-southeast-1b |
Subnets | subnet-private1(10.0.128.0/24),subnet-private2(10.0.144.0/24) |
↓作成していきます。
↓
↓
サブネットグループ作成は以上です。
●DBインスタンス作成
DBインスタンスを作成します。
設定値は以下の通りです。
項目 | 設定値 |
---|---|
Choose a database creation method | Standard create |
Engine type | MySQL |
Templates | Dev/Test |
Deployment options | Multi-AZ DB instance |
DB instance identifier | 任意 |
Master username | 任意 |
Master password | 任意 |
DB instance class | db.t3.small |
Storage type | General Purpose SSD (gp3) |
Allocated storage | 20GiB |
Database authentication options | Password authentication |
Enable Enhanced monitoring | □ |
Initial database name | 任意 |
Enable auto minor version upgrade | □ |
↓作成していきます。
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
DBインスタンス作成は以上です。
■WordPress設定
Amazon RDS DBインスタンスが起動しましたら、WordPressの設定をします。
以下のURLにアクセスし、設定しましょう。
http://<EC2インスタンスパブリックIPアドレス>
ウィザードに従って入力していき、ログインしましょう。ログインが成功したら、以下のダッシュボード画面が表示されます。
WordPressが正常に稼働しているか、テスト投稿してみます。
↓
投稿が確認できました。
■DBインスタンス変更
準備が整いましたので、DBインスタンスクラスを変更してみます。
作成したEC2に接続し、DBインスタンスクラスを確かめてみます。
[ec2-user@ip-10-0-0-10 ~]$ aws rds describe-db-instances --query "DBInstances[].[DBInstanceIdentifier,DBInstanceClass,Engine,EngineVersion]" --output text | column -t
saitou-database-1 db.t3.small mysql 8.0.31
現在のDBインスタンスのクラスはdb.t3.smallですので、一つ上のdb.t3.mediumに変更してみましょう。
↓Amazon RDSコンソールで左のナビゲーションペインから[Databases] を選択し、変更するDBインスタンスを選択した後、[Modify] (変更) をクリックします
↓[Instance configuration]で[db.t3.small]から[db.t3.medium]に変更します。各設定の詳細については、「DBインスタンスの設定」を参照してください。
↓
↓すべての変更が正しいことを確認したら、[Continue] を選択して変更の概要を確認します。
↓変更をすぐに適用するために[Apply immediately(すぐに適用)] を選択します。設定次第でダウンタイムが発生しますので、こちらを確認してください。
Amazon RDS DBインスタンスクラス変更は以上です。
■検証
変更の設定が完了しましたので、以下の検証を行います。
- インスタンスクラス変更中に記事投稿
- 変更完了後に投稿記事確認
●インスタンスクラス変更中に記事投稿
Amazon RDS DBインスタンス変更の設定を完了すると、[Status]が[Modifying]になります。
↓[Status]が[Modifying]の状態で、記事を投稿してみました。
設定が変更中でも投稿できました。
DBインスタンスがどういう状況なのか、ログを確認してみると、
[Applying modification to database instance class]から[DB instance shutdown]に移行し、[Multi-AZ instance failover started.]となっています。そして、[Multi-AZ instance failover completed]まで1分程度です。
記事のテスト投稿をしている時点で、スタンバイインスタンスに切り替わっていたようですね。
●インスタンスクラス変更完了後に投稿記事確認
[Status]が[Modifying]から[Available]に変わりました。ちなみに[Available]に変わるまで、10分かかりました。
EC2インスタンスに接続し、DBインスタンスクラスを確認してみると、
↓変更中に投稿した記事を確認してみると、
記事が確認できました。
今回の検証とは別の話ですが、DBインスタンスクラス変更前はプライマリがap-southeast-1bに配置されていましたが、クラス変更後はap-southeast-1aに配置が変わっていました。
↓
クラス変更のためにプライマリをシャットダウンし、スタンバイにフェイルオーバーされます。クラス変更を適用した後、再起動し、元プライマリはプライマリに戻るものだと思っていました。2時間ほど放置していましたが、ap-southeast-1aからap-southeast-1bに変更されませんでした。これに関しては、後日検証いたします。
今回の検証は以上です。
まとめ:Amazon RDSのDBインスタンスクラスを変更してみる
マルチAZ配置で作成したAmazon RDSのDBインスタンスを利用してインスタンスクラスを変更したおかげで、わかりやすいダウンタイムが発生しませんでした。
プライマリからスタンバイにフェイルオーバーするマルチAZ配置だからこそですね。本稼働しているDBインスタンスのスケールアップをする際は、マルチAZ配置にしてから実施するのがオススメかもしません。
参考リンク:AWS公式ドキュメント
↓ほかの協栄情報メンバーもRDSに関する記事を公開しています。ぜひ参考にしてみてください。
■EC2からRDSにcsvファイルをアップロードしてデータテーブルを作成してみた(kioka)
https://cloud5.jp/import-csv-to-rds-kioka/
■WindowsにOracle Database Client 19cインストールし、RDS(oracle)に接続してみました。(小林 剛)
https://cloud5.jp/windows-oracle-database-client-19c/
■CloudFormationでRDS構築(Aurora PostgreSQL グローバル)を構築する(小林 剛)
https://cloud5.jp/create-rds-aurora-postgresql-global-by-cfn/