Amazon RDSのDBインスタンスクラスを変更してみる

Amazon RDS DBインスタンスのパフォーマンス向上のために、スケールアップしなければいけないことがあるかもしれません。

 

しかし、Amazon RDSのDBインスタンスクラスを変更する際には注意点があります。注意点とは公式ドキュメントに書かれている"この変更中に、ダウンタイムが発生します。"という点です。

 

サービス提供中にダウンタイムが発生すると、継続したサービス提供に影響が出ますよね。

 

今回の記事ではAmazon RDSのDBインスタンスクラスを変更方法と、WorePressサイトを利用しAmazon RDSのDBインスタンスクラスを変更中にどんな影響が出たか紹介します。

 

 

Amazon RDSのDBインスタンスクラスを変更してみる

この記事では、以下の3つを確認します。

 

  • DBインスタンスクラスの変更方法
  • DBインスタンスクラス変更中に記事投稿
  • DBインスタンスクラス変更完了後に投稿記事確認

 

 

■構築図

saitou-rds-changeclass構築図

 

 

■WordPressインストール

今回はAmazon RDSのDBインスタンスクラス変更が目的なので、それ以外の部分はCloudFormationテンプレートを利用して環境構築します。

 

↓テンプレートを利用すると、以下の図の部分が構築されます。

 

saitou-rds-changeclass構築図2

 

 

↓以下のドキュメントを利用して、環境を構築してください。わたしはシンガポールリージョンで構築します。

 

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)

 

 

↓作成していきます。

 

saitou-rds-changeclassサブネットグループ作成

saitou-rds-changeclassサブネットグループ作成

saitou-rds-changeclassサブネットグループ作成

 

 

サブネットグループ作成は以上です。

 

 

●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

 

 

↓作成していきます。

 

saitou-rds-changeclassDBインスタンス作成

saitou-rds-changeclassDBインスタンス作成

saitou-rds-changeclassDBインスタンス作成

saitou-rds-changeclassDBインスタンス作成

saitou-rds-changeclassDBインスタンス作成

saitou-rds-changeclassDBインスタンス作成

saitou-rds-changeclassDBインスタンス作成


saitou-rds-changeclassDBインスタンス作成

saitou-rds-changeclassDBインスタンス作成

saitou-rds-changeclassDBインスタンス作成

saitou-rds-changeclassDBインスタンス作成

saitou-rds-changeclassDBインスタンス作成

 

 

DBインスタンス作成は以上です。

 

 

■WordPress設定

Amazon RDS DBインスタンスが起動しましたら、WordPressの設定をします。

 

以下のURLにアクセスし、設定しましょう。
http://<EC2インスタンスパブリックIPアドレス>

 

ウィザードに従って入力していき、ログインしましょう。ログインが成功したら、以下のダッシュボード画面が表示されます。

 

saitou-rds-changeclassWordPress設定

 

 

WordPressが正常に稼働しているか、テスト投稿してみます。

 

saitou-rds-changeclassテスト投稿

saitou-rds-changeclassテスト投稿

 

投稿が確認できました。

 

 

■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] (変更) をクリックします

 

saitou-rds-changeclassクラス変更

 

↓[Instance configuration]で[db.t3.small]から[db.t3.medium]に変更します。各設定の詳細については、「DBインスタンスの設定」を参照してください。

 

saitou-rds-changeclassクラス変更

saitou-rds-changeclassクラス変更

 

↓すべての変更が正しいことを確認したら、[Continue] を選択して変更の概要を確認します。

 

saitou-rds-changeclassクラス変更

 

↓変更をすぐに適用するために[Apply immediately(すぐに適用)] を選択します。設定次第でダウンタイムが発生しますので、こちらを確認してください。

 

saitou-rds-changeclassクラス変更

 

 

Amazon RDS DBインスタンスクラス変更は以上です。

 

 

■検証

変更の設定が完了しましたので、以下の検証を行います。

 

  • インスタンスクラス変更中に記事投稿
  • 変更完了後に投稿記事確認

 

●インスタンスクラス変更中に記事投稿

Amazon RDS DBインスタンス変更の設定を完了すると、[Status]が[Modifying]になります。

 

saitou-rds-changeclass変更中

 

↓[Status]が[Modifying]の状態で、記事を投稿してみました。

 

saitou-rds-changeclassテスト投稿

 

設定が変更中でも投稿できました。

 

DBインスタンスがどういう状況なのか、ログを確認してみると、

 

saitou-rds-changeclassログ

 

[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分かかりました。

 

saitou-rds-changeclass検証

 

EC2インスタンスに接続し、DBインスタンスクラスを確認してみると、

 

saitou-rds-changeclass検証

 

↓変更中に投稿した記事を確認してみると、

 

saitou-rds-changeclass検証

 

記事が確認できました。

 

 

今回の検証とは別の話ですが、DBインスタンスクラス変更前はプライマリがap-southeast-1bに配置されていましたが、クラス変更後はap-southeast-1aに配置が変わっていました。

 

saitou-rds-changeclassクラス変更

saitou-rds-changeclass検証

 

クラス変更のためにプライマリをシャットダウンし、スタンバイにフェイルオーバーされます。クラス変更を適用した後、再起動し、元プライマリはプライマリに戻るものだと思っていました。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/

Last modified: 2023-05-21

Author