【30分AWSハンズオン(6)】RDSのポイントインタイムリカバリをしてみよう

記事タイトルとURLをコピーする

こんにちは、ラーニングエクスペリエンス課の小倉です。だいぶ間があいてしまいまして、久しぶりの投稿です。

サーバーワークスでは、自由に勉強会を開催してスキルアップをしています。その中で私は毎週月曜日の朝、「30分AWSハンズオン」という30分でできるAWSハンズオンを2021年9月から継続して開催しています。その内容をブログで定期的に紹介していきます。AWSをご利用のみなさまのスキルアップにお役立ていただければと考えています。

6回目は、「RDSのポイントインタイムリカバリをしてみよう」をやります。

ポイントインタイムリカバリとは、自動バックアップとトランザクションログ(※)を使用して、現在から5分以上前の指定した時間の状態でDBインスタンスを作成することができる機能です。例えば、障害の復旧であれば、障害発生時刻の少し前の時間の状態のDBインスタンスを作成できます。
※トランザクションログとは、データベースの変更を順番に記録したものです。

ハンズオンは、以下の流れで実施します。

1.CloudFormationでハンズオン環境の作成
2.DBインスタンスに接続してレコードを登録
3.時間をメモしてデータベースのレコード削除を2回実施(1回目と2回目の間隔を少しあける)
4.ポイントインタイムリカバリで1回目と2回目の間の時間を指定してDBインスタンスを作成

使用するAWSサービス

Amazon VPC

VPCとは、AWS内で作成できる仮想ネットワークです。

参考サイト: [AWS Black Belt Online Seminar]Amazon VPC

Amazon EC2

EC2とは、AWS上に仮想サーバーを提供するためのサービスです。インスタンスという単位で仮想サーバーが管理され、マネジメントコンソールから数クリックで、VPCのサブネット内にすぐに作成することができます。

参考サイト: [AWS Black Belt Online Seminar]Amazon EC2

Amazon RDS

RDSとは、マネージドのデータベースのサービスです。マネージドとはほとんどの部分(ハードウェア、OS、データベースエンジンなど)をAWS側が管理してくれることを表しています。数クリックでDBインスタンス(DBサーバー)を作成することができます。

参考サイト: [AWS Black Belt Online Seminar]Amazon RDS

構成図

今回の構成図です。
プライベートサブネットが2つあるのは、RDSのDBインスタンスを作成するときは必ず2つ以上のAZのサブネットを登録する必要があるためです。パブリックサブネットは1つでもよかったのですが、プライベートに合わせて2つにしています。
DBインスタンスのレコードを操作して、同じサブネットにポイントインタイムリカバリでDBインスタンスを作成します。

ハンズオン手順

1. CloudFormationでハンズオン環境を作成します

まず、ハンズオン環境をCloudFormationを使って準備します。CloudFormationとはコードでインフラを管理できるAWSサービスです。以下のコードをコピーしてローカルのメモ帳などのテキストエディタに貼りつけて、ファイル名 handson6.yml で保存します。このコードを利用するとVPC、サブネット、EC2、RDSを作成してくれます。

AWSTemplateFormatVersion: "2010-09-09"
Description: Provision handson environment

Parameters:
  ImageId:
    Type: AWS::SSM::Parameter::Value<String>
    Default: /aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2

Resources:
  VPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.0.0.0/16
      EnableDnsSupport: true
      EnableDnsHostnames: true
      InstanceTenancy: default
      Tags:
        - Key: Name
          Value: handson-vpc
  InternetGateway:
    Type: AWS::EC2::InternetGateway
    Properties:
      Tags:
        - Key: Name
          Value: handson-igw
  InternetGatewayAttachment:
    Type: AWS::EC2::VPCGatewayAttachment
    Properties:
      InternetGatewayId: !Ref InternetGateway
      VpcId: !Ref VPC
  PublicSubnetA:
    Type: AWS::EC2::Subnet
    Properties:
      AvailabilityZone: ap-northeast-1a
      CidrBlock: 10.0.0.0/24
      VpcId: !Ref VPC
      Tags:
        - Key: Name
          Value: handson-subnet-public-a
  PublicSubnetC:
    Type: AWS::EC2::Subnet
    Properties:
      AvailabilityZone: ap-northeast-1c
      CidrBlock: 10.0.1.0/24
      VpcId: !Ref VPC
      Tags:
        - Key: Name
          Value: handson-subnet-public-c
  PrivateSubnetA:
    Type: AWS::EC2::Subnet
    Properties:
      AvailabilityZone: ap-northeast-1a
      CidrBlock: 10.0.10.0/24
      VpcId: !Ref VPC
      Tags:
        - Key: Name
          Value: handson-subnet-private-a
  PrivateSubnetC:
    Type: AWS::EC2::Subnet
    Properties:
      AvailabilityZone: ap-northeast-1c
      CidrBlock: 10.0.11.0/24
      VpcId: !Ref VPC
      Tags:
        - Key: Name
          Value: handson-subnet-private-c
  PublicRouteTable:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId: !Ref VPC
      Tags:
        - Key: Name
          Value: handson-rtb-public
  PrivateRouteTable:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId: !Ref VPC
      Tags:
        - Key: Name
          Value: handson-rtb-private
  PublicRoute:
    Type: AWS::EC2::Route
    Properties:
      RouteTableId: !Ref PublicRouteTable
      DestinationCidrBlock: 0.0.0.0/0
      GatewayId: !Ref InternetGateway
  PublicSubnetARouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId: !Ref PublicSubnetA
      RouteTableId: !Ref PublicRouteTable
  PublicSubnetCRouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId: !Ref PublicSubnetC
      RouteTableId: !Ref PublicRouteTable
  PrivateSubnetARouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId: !Ref PrivateSubnetA
      RouteTableId: !Ref PrivateRouteTable
  PrivateSubnetCRouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId: !Ref PrivateSubnetC
      RouteTableId: !Ref PrivateRouteTable
  SecurityGroupforEC2:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupName: handson-ec2-sg
      GroupDescription: handson-ec2-sg
      VpcId: !Ref VPC
      SecurityGroupIngress:
      - IpProtocol: tcp
        FromPort: 22
        ToPort: 22
        CidrIp: 0.0.0.0/0
      Tags:
      - Key: Name
        Value: handson-ec2-sg
  SecurityGroupforRDS:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupName: handson-rds-sg
      GroupDescription: handson-rds-sg
      VpcId: !Ref VPC
      SecurityGroupIngress:
      - IpProtocol: tcp
        FromPort: 3306
        ToPort: 3306
        SourceSecurityGroupId: !Ref SecurityGroupforEC2
      Tags:
      - Key: Name
        Value: handson-rds-sg
  DBSubnetGroup:
    Type: AWS::RDS::DBSubnetGroup
    Properties:
      DBSubnetGroupName: handson-rds-subnetgroup
      DBSubnetGroupDescription: DB Subnet Group for Training
      SubnetIds:
        - !Ref PrivateSubnetA
        - !Ref PrivateSubnetC
  RDS:
    Type: "AWS::RDS::DBInstance"
    Properties:
      DBInstanceIdentifier: handson-rds
      Engine: MySQL
      DBInstanceClass: db.t3.micro
      AllocatedStorage: 20
      StorageType: gp2
      DBName: pitrtest
      DBSubnetGroupName: !Ref DBSubnetGroup
      CACertificateIdentifier: rds-ca-rsa2048-g1
      PubliclyAccessible: false
      MultiAZ: false
      AvailabilityZone: ap-northeast-1a
      AutoMinorVersionUpgrade: false
      MasterUsername: admin
      MasterUserPassword: 7oWo6oZuCh
      DBParameterGroupName: "default.mysql8.0"
      VPCSecurityGroups:
        - !Ref SecurityGroupforRDS
      CopyTagsToSnapshot: true
      BackupRetentionPeriod: 7
      Tags:
        - Key: Name
          Value: handson-rds
    DeletionPolicy: Delete
  WebAppInstance:
    Type: AWS::EC2::Instance
    Properties:
      Tags:
        - Key: Name
          Value: handson-ec2
      ImageId: !Ref ImageId
      InstanceType: t3.nano
      DisableApiTermination: false
      EbsOptimized: false
      BlockDeviceMappings:
        - DeviceName: /dev/xvda
          Ebs:
            VolumeSize: 8
      UserData:
        Fn::Base64: "#!/bin/bash -v\nexec > >(tee /var/log/user-data.log || logger -t user-data -s 2> /dev/console) 2>&1\nyum -y update\nyum install -y https://dev.mysql.com/get/mysql80-community-release-el7-5.noarch.rpm\nyum install -y mysql-community-client\nreboot"
      NetworkInterfaces:
        - AssociatePublicIpAddress: "true"
          DeleteOnTermination: "true"
          DeviceIndex: "0"
          SubnetId: !Ref PublicSubnetA
          GroupSet:
            - !Ref SecurityGroupforEC2


CloudFormationで上記のコードを実行すると以下の構成ができあがります。


AWSマネジメントコンソールにログインし、画面上の検索窓で「CloudFormation」と入力し、サービスの下に表示された [CloudFormation] をクリックし、CloudFormationのコンソール画面を開きます。また今回のハンズオンは東京リージョンで実施しますので、右上のリージョンが東京になっていない場合は東京に変更しておきましょう。


スタック一覧の画面が表示されるので、右上の [スタックの作成] - [新しいリソースを使用 (標準)] をクリックします。 もしスタック一覧が表示されない場合は、左上のハンバーガーメニュー(三本線のアイコン)をクリックし、ナビゲーションペイン(左メニュー)を表示し、スタックをクリックしてスタック一覧を表示します。


スタックの作成画面が表示されるので、以下を設定して [次へ] をクリックします。

・テンプレートソース: テンプレートファイルのアップロード
・テンプレートファイルのアップロード: ファイルの選択をクリックし、先ほどローカルに保管した handson6.yml を選択


スタックの詳細を指定の画面で、スタック名に pitr-handson と入力して、右下の [次へ] をクリックします。 パラメータの変更は不要です。


スタックオプションの設定画面が表示されるので、ここはなにも変更せずに下にスクロールして右下の [次へ] をクリックします。


レビューの画面が表示されるので、下にスクロールして右下の [送信] をクリックします。


[送信] をクリックすると、CloudFormationによって、AWSリソースの作成が始まります。ステータスが CREATE_IN_PROGRESS から CREATE_COMPLETE になったら作成完了です。10分ほどかかりますので、作成完了まで待ちます。

【作成中】

【作成完了】

2. DBインスタンスに接続してレコードを登録します

次にDBインスタンスに接続してレコードを登録します。新規作成したDBインスタンスは中身は空のため、レコードを登録する必要があります。接続の方法はEC2にログインして、EC2からDBインスタンスに接続します。

EC2にログインする前に接続先のDBインスタンスの情報を取得します。
画面上の検索窓で「RDS」と入力し、サービスの下に表示された [RDS] をクリックしRDSのコンソール画面を開きます。また今回のハンズオンは東京リージョンで実施しますので、右上のリージョンが東京になっていない場合は東京に変更しておきましょう。


ナビゲーションペイン(左メニュー)の [データベース] をクリックして、データベース一覧の画面を表示した後、CloudFormationで作成されたDBインスタンスをクリックします。


接続とセキュリティ タブをクリックし、エンドポイントをコピーしてメモ帳などにメモしておきます。この画像の例だとエンドポイントは handson-rds.cmz3zihsayop.ap-northeast-1.rds.amazonaws.com になります。


次にEC2にログインしてDBインスタンスに接続をします。
画面上の検索窓で「EC2」と入力し、サービスの下に表示された [EC2] をクリックしEC2のコンソール画面を開きます。また今回のハンズオンは東京リージョンで実施しますので、右上のリージョンが東京になっていない場合は東京に変更しておきましょう。


ナビゲーションペイン(左メニュー)の [インスタンス] をクリックして、インスタンス一覧の画面を表示した後、CloudFormationで作成されたEC2インスタンスにチェックを入れ、右上の [接続] をクリックします。


インスタンスに接続の画面で、以下を設定して、右下の [接続] をクリックします。

EC2 Instance Connect タブを選択
・接続タイプは、 EC2 Instance Connect を使用して接続する を選択
・ユーザー名は、ec2-user


接続をクリックするとEC2インスタンスにログインできます。


ここからコマンドを実行して、RDSへ接続し、レコードの登録を行っていきます。
以下のコマンドを実行してDBインスタンスに接続します。エンドポイントは先ほどRDSのコンソール画面でメモしたものを入力します。コマンドを実行するとパスワードを求められるので、今回は 7oWo6oZuCh と入力してください(パスワードはCloudFormationで設定済みです)。

mysql -h <エンドポイント> -u admin -p

コマンドがうまくいくと以下のような mysql> のプロンプトが表示されます。

[ec2-user@ip-10-0-0-119 ~]$ mysql -h handson-rds.cmz3zihsayop.ap-northeast-1.rds.amazonaws.com -u admin -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 43
Server version: 8.0.33 Source distribution

Copyright (c) 2000, 2023, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 

DBインスタンスに接続できたので、レコードの登録を行っていきます。今回はMySQLのサイトにあるサンプルの一部を利用します。以下のコマンドを実行します。
MySQL :: Other MySQL Documentation

use pitrtest;

以下はすべてコピーしてまとめて貼りつけます。

CREATE TABLE payment (
  payment_id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
  customer_id SMALLINT UNSIGNED NOT NULL,
  staff_id TINYINT UNSIGNED NOT NULL,
  rental_id INT DEFAULT NULL,
  amount DECIMAL(5,2) NOT NULL,
  payment_date DATETIME NOT NULL,
  last_update TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY  (payment_id)
);

以下もすべてコピーしてまとめて貼りつけます。

INSERT INTO payment VALUES (1,1,1,76,'2.99','2005-05-25 11:30:37','2006-02-15 22:12:30'),
(2,1,1,573,'0.99','2005-05-28 10:35:23','2006-02-15 22:12:30'),
(3,1,1,1185,'5.99','2005-06-15 00:54:12','2006-02-15 22:12:30'),
(4,1,2,1422,'0.99','2005-06-15 18:02:53','2006-02-15 22:12:30'),
(5,1,2,1476,'9.99','2005-06-15 21:08:46','2006-02-15 22:12:30'),
(6,1,1,1725,'4.99','2005-06-16 15:18:57','2006-02-15 22:12:30'),
(7,1,1,2308,'4.99','2005-06-18 08:41:48','2006-02-15 22:12:30'),
(8,1,2,2363,'0.99','2005-06-18 13:33:59','2006-02-15 22:12:30'),
(9,1,1,3284,'3.99','2005-06-21 06:24:45','2006-02-15 22:12:30'),
(10,1,2,4526,'5.99','2005-07-08 03:17:05','2006-02-15 22:12:30'),
(11,1,1,4611,'5.99','2005-07-08 07:33:56','2006-02-15 22:12:30'),
(12,1,1,5244,'4.99','2005-07-09 13:24:07','2006-02-15 22:12:30'),
(13,1,1,5326,'4.99','2005-07-09 16:38:01','2006-02-15 22:12:30'),
(14,1,1,6163,'7.99','2005-07-11 10:13:46','2006-02-15 22:12:30'),
(15,1,2,7273,'2.99','2005-07-27 11:31:22','2006-02-15 22:12:30'),
(16,1,1,7841,'4.99','2005-07-28 09:04:45','2006-02-15 22:12:30'),
(17,1,2,8033,'4.99','2005-07-28 16:18:23','2006-02-15 22:12:30'),
(18,1,1,8074,'0.99','2005-07-28 17:33:39','2006-02-15 22:12:30'),
(19,1,2,8116,'0.99','2005-07-28 19:20:07','2006-02-15 22:12:30'),
(20,1,2,8326,'2.99','2005-07-29 03:58:49','2006-02-15 22:12:30');

レコードの登録作業が終わったので、念のため、以下のコマンドを実行してレコードが登録されていることを確認します。

select * from pitrtest.payment;

<実行結果>
+------------+-------------+----------+-----------+--------+---------------------+---------------------+
| payment_id | customer_id | staff_id | rental_id | amount | payment_date        | last_update         |
+------------+-------------+----------+-----------+--------+---------------------+---------------------+
|          1 |           1 |        1 |        76 |   2.99 | 2005-05-25 11:30:37 | 2006-02-15 22:12:30 |
|          2 |           1 |        1 |       573 |   0.99 | 2005-05-28 10:35:23 | 2006-02-15 22:12:30 |
|          3 |           1 |        1 |      1185 |   5.99 | 2005-06-15 00:54:12 | 2006-02-15 22:12:30 |
|          4 |           1 |        2 |      1422 |   0.99 | 2005-06-15 18:02:53 | 2006-02-15 22:12:30 |
|          5 |           1 |        2 |      1476 |   9.99 | 2005-06-15 21:08:46 | 2006-02-15 22:12:30 |
|          6 |           1 |        1 |      1725 |   4.99 | 2005-06-16 15:18:57 | 2006-02-15 22:12:30 |
|          7 |           1 |        1 |      2308 |   4.99 | 2005-06-18 08:41:48 | 2006-02-15 22:12:30 |
|          8 |           1 |        2 |      2363 |   0.99 | 2005-06-18 13:33:59 | 2006-02-15 22:12:30 |
|          9 |           1 |        1 |      3284 |   3.99 | 2005-06-21 06:24:45 | 2006-02-15 22:12:30 |
|         10 |           1 |        2 |      4526 |   5.99 | 2005-07-08 03:17:05 | 2006-02-15 22:12:30 |
|         11 |           1 |        1 |      4611 |   5.99 | 2005-07-08 07:33:56 | 2006-02-15 22:12:30 |
|         12 |           1 |        1 |      5244 |   4.99 | 2005-07-09 13:24:07 | 2006-02-15 22:12:30 |
|         13 |           1 |        1 |      5326 |   4.99 | 2005-07-09 16:38:01 | 2006-02-15 22:12:30 |
|         14 |           1 |        1 |      6163 |   7.99 | 2005-07-11 10:13:46 | 2006-02-15 22:12:30 |
|         15 |           1 |        2 |      7273 |   2.99 | 2005-07-27 11:31:22 | 2006-02-15 22:12:30 |
|         16 |           1 |        1 |      7841 |   4.99 | 2005-07-28 09:04:45 | 2006-02-15 22:12:30 |
|         17 |           1 |        2 |      8033 |   4.99 | 2005-07-28 16:18:23 | 2006-02-15 22:12:30 |
|         18 |           1 |        1 |      8074 |   0.99 | 2005-07-28 17:33:39 | 2006-02-15 22:12:30 |
|         19 |           1 |        2 |      8116 |   0.99 | 2005-07-28 19:20:07 | 2006-02-15 22:12:30 |
|         20 |           1 |        2 |      8326 |   2.99 | 2005-07-29 03:58:49 | 2006-02-15 22:12:30 |
+------------+-------------+----------+-----------+--------+---------------------+---------------------+
20 rows in set (0.00 sec)

これでレコードの登録作業が終わりました。このあともEC2にログインしての作業が続きますので、ログアウトせずそのままにしておきます。

3. 時間をメモしてデータベースのレコード削除を2回実施

現在、20行のレコードを登録しましたが、レコードを2行削除を時間をおいて2回実施します。削除するときはコマンドを実行した時間をメモしておきます。

以下のコマンドを実行して、レコードを2行削除します。実行した時間をメモしておきます。

delete from pitrtest.payment order by payment_id desc LIMIT 2;

以下を実行するとレコードが2行削除されて18行になっていることが確認できます。

select * from pitrtest.payment;

<実行結果>
+------------+-------------+----------+-----------+--------+---------------------+---------------------+
| payment_id | customer_id | staff_id | rental_id | amount | payment_date        | last_update         |
+------------+-------------+----------+-----------+--------+---------------------+---------------------+
|          1 |           1 |        1 |        76 |   2.99 | 2005-05-25 11:30:37 | 2006-02-15 22:12:30 |
|          2 |           1 |        1 |       573 |   0.99 | 2005-05-28 10:35:23 | 2006-02-15 22:12:30 |
|          3 |           1 |        1 |      1185 |   5.99 | 2005-06-15 00:54:12 | 2006-02-15 22:12:30 |
|          4 |           1 |        2 |      1422 |   0.99 | 2005-06-15 18:02:53 | 2006-02-15 22:12:30 |
|          5 |           1 |        2 |      1476 |   9.99 | 2005-06-15 21:08:46 | 2006-02-15 22:12:30 |
|          6 |           1 |        1 |      1725 |   4.99 | 2005-06-16 15:18:57 | 2006-02-15 22:12:30 |
|          7 |           1 |        1 |      2308 |   4.99 | 2005-06-18 08:41:48 | 2006-02-15 22:12:30 |
|          8 |           1 |        2 |      2363 |   0.99 | 2005-06-18 13:33:59 | 2006-02-15 22:12:30 |
|          9 |           1 |        1 |      3284 |   3.99 | 2005-06-21 06:24:45 | 2006-02-15 22:12:30 |
|         10 |           1 |        2 |      4526 |   5.99 | 2005-07-08 03:17:05 | 2006-02-15 22:12:30 |
|         11 |           1 |        1 |      4611 |   5.99 | 2005-07-08 07:33:56 | 2006-02-15 22:12:30 |
|         12 |           1 |        1 |      5244 |   4.99 | 2005-07-09 13:24:07 | 2006-02-15 22:12:30 |
|         13 |           1 |        1 |      5326 |   4.99 | 2005-07-09 16:38:01 | 2006-02-15 22:12:30 |
|         14 |           1 |        1 |      6163 |   7.99 | 2005-07-11 10:13:46 | 2006-02-15 22:12:30 |
|         15 |           1 |        2 |      7273 |   2.99 | 2005-07-27 11:31:22 | 2006-02-15 22:12:30 |
|         16 |           1 |        1 |      7841 |   4.99 | 2005-07-28 09:04:45 | 2006-02-15 22:12:30 |
|         17 |           1 |        2 |      8033 |   4.99 | 2005-07-28 16:18:23 | 2006-02-15 22:12:30 |
|         18 |           1 |        1 |      8074 |   0.99 | 2005-07-28 17:33:39 | 2006-02-15 22:12:30 |
+------------+-------------+----------+-----------+--------+---------------------+---------------------+
18 rows in set (0.00 sec)

1回目のレコード削除から数分間隔をあけて、もう一度レコードを2行削除します。こちらも実行した時間をメモしておきます。

delete from pitrtest.payment order by payment_id desc LIMIT 2;

以下を実行するとレコードが2行削除されて16行になっていることが確認できます。

select * from pitrtest.payment;

<実行結果>
+------------+-------------+----------+-----------+--------+---------------------+---------------------+
| payment_id | customer_id | staff_id | rental_id | amount | payment_date        | last_update         |
+------------+-------------+----------+-----------+--------+---------------------+---------------------+
|          1 |           1 |        1 |        76 |   2.99 | 2005-05-25 11:30:37 | 2006-02-15 22:12:30 |
|          2 |           1 |        1 |       573 |   0.99 | 2005-05-28 10:35:23 | 2006-02-15 22:12:30 |
|          3 |           1 |        1 |      1185 |   5.99 | 2005-06-15 00:54:12 | 2006-02-15 22:12:30 |
|          4 |           1 |        2 |      1422 |   0.99 | 2005-06-15 18:02:53 | 2006-02-15 22:12:30 |
|          5 |           1 |        2 |      1476 |   9.99 | 2005-06-15 21:08:46 | 2006-02-15 22:12:30 |
|          6 |           1 |        1 |      1725 |   4.99 | 2005-06-16 15:18:57 | 2006-02-15 22:12:30 |
|          7 |           1 |        1 |      2308 |   4.99 | 2005-06-18 08:41:48 | 2006-02-15 22:12:30 |
|          8 |           1 |        2 |      2363 |   0.99 | 2005-06-18 13:33:59 | 2006-02-15 22:12:30 |
|          9 |           1 |        1 |      3284 |   3.99 | 2005-06-21 06:24:45 | 2006-02-15 22:12:30 |
|         10 |           1 |        2 |      4526 |   5.99 | 2005-07-08 03:17:05 | 2006-02-15 22:12:30 |
|         11 |           1 |        1 |      4611 |   5.99 | 2005-07-08 07:33:56 | 2006-02-15 22:12:30 |
|         12 |           1 |        1 |      5244 |   4.99 | 2005-07-09 13:24:07 | 2006-02-15 22:12:30 |
|         13 |           1 |        1 |      5326 |   4.99 | 2005-07-09 16:38:01 | 2006-02-15 22:12:30 |
|         14 |           1 |        1 |      6163 |   7.99 | 2005-07-11 10:13:46 | 2006-02-15 22:12:30 |
|         15 |           1 |        2 |      7273 |   2.99 | 2005-07-27 11:31:22 | 2006-02-15 22:12:30 |
|         16 |           1 |        1 |      7841 |   4.99 | 2005-07-28 09:04:45 | 2006-02-15 22:12:30 |
+------------+-------------+----------+-----------+--------+---------------------+---------------------+
16 rows in set (0.00 sec)

現在の状態を整理すると以下のようになっています。

作業前のレコード   20行
1回目のレコード削除 18行
2回目のレコード削除 16行

この状態で、ポイントインタイムリカバリの機能で、1回目と2回目の間の時間を指定してDBインスタンスを作成することによって、レコードが18行の状態に戻すことができます。

4. ポイントインタイムリカバリで1回目と2回目の間の時間を指定してDBインスタンスを作成します

ポイントインタイムリカバリを使って、DBインスタンスを作成します。
画面上の検索窓で「RDS」と入力し、サービスの下に表示された [RDS] をクリックしRDSのコンソール画面を開きます。また今回のハンズオンは東京リージョンで実施しますので、右上のリージョンが東京になっていない場合は東京に変更しておきましょう。


ナビゲーションペイン(左メニュー)の [データベース] をクリックして、データベース一覧の画面を表示した後、CloudFormationで作成されたDBインスタンスを選択します。右上の [アクション] - [特定時点への復元] をクリックします。


特定時点への復元の画面で、以下を設定し、右下の [特定時点への復元] をクリックします。

・復元時刻: カスタム日時で、レコードを削除した1回目と2回目の間の時間を指定
・DBインスタンス識別子: 今回は handson-rds-2 を入力
・インスタンスの設定: バースト可能クラスで、db.t3.micro を選択
・可用性と耐久性: 単一のDBインスタンスを選択
・接続: VPCは, handson-vpc、DBサブネットグループは、handson-rds-subnetgroup を選択


データベース一覧の画面に戻り、DBインスタンスが作成中になっていることを確認します。10分くらい経つとステータスが利用可能になります。


ステータスが利用可能になったら、データベース名をクリックします。


接続とセキュリティ タブをクリックし、エンドポイントをコピーしてメモ帳などにメモしておきます。この画像の例だとエンドポイントは handson-rds-2.cmz3zihsayop.ap-northeast-1.rds.amazonaws.com になります。


手順2を参照して、EC2インスタンスにログインします。
ログイン後に以下のコマンドを実行して、ポイントインタイムリカバリで作成したDBインスタンスに接続します。エンドポイントはこの直前で確認したものです。

mysql -h <エンドポイント> -u admin -p

コマンドがうまくいくと以下のような mysql> のプロンプトが表示されます。

[ec2-user@ip-10-0-0-119 ~]$ mysql -h handson-rds-2.cmz3zihsayop.ap-northeast-1.rds.amazonaws.com -u admin -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 11
Server version: 8.0.33 Source distribution

Copyright (c) 2000, 2023, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 

レコードを確認するコマンドを実行して、レコードが18行表示されることを確認します。

select * from pitrtest.payment;

<実行結果>
+------------+-------------+----------+-----------+--------+---------------------+---------------------+
| payment_id | customer_id | staff_id | rental_id | amount | payment_date        | last_update         |
+------------+-------------+----------+-----------+--------+---------------------+---------------------+
|          1 |           1 |        1 |        76 |   2.99 | 2005-05-25 11:30:37 | 2006-02-15 22:12:30 |
|          2 |           1 |        1 |       573 |   0.99 | 2005-05-28 10:35:23 | 2006-02-15 22:12:30 |
|          3 |           1 |        1 |      1185 |   5.99 | 2005-06-15 00:54:12 | 2006-02-15 22:12:30 |
|          4 |           1 |        2 |      1422 |   0.99 | 2005-06-15 18:02:53 | 2006-02-15 22:12:30 |
|          5 |           1 |        2 |      1476 |   9.99 | 2005-06-15 21:08:46 | 2006-02-15 22:12:30 |
|          6 |           1 |        1 |      1725 |   4.99 | 2005-06-16 15:18:57 | 2006-02-15 22:12:30 |
|          7 |           1 |        1 |      2308 |   4.99 | 2005-06-18 08:41:48 | 2006-02-15 22:12:30 |
|          8 |           1 |        2 |      2363 |   0.99 | 2005-06-18 13:33:59 | 2006-02-15 22:12:30 |
|          9 |           1 |        1 |      3284 |   3.99 | 2005-06-21 06:24:45 | 2006-02-15 22:12:30 |
|         10 |           1 |        2 |      4526 |   5.99 | 2005-07-08 03:17:05 | 2006-02-15 22:12:30 |
|         11 |           1 |        1 |      4611 |   5.99 | 2005-07-08 07:33:56 | 2006-02-15 22:12:30 |
|         12 |           1 |        1 |      5244 |   4.99 | 2005-07-09 13:24:07 | 2006-02-15 22:12:30 |
|         13 |           1 |        1 |      5326 |   4.99 | 2005-07-09 16:38:01 | 2006-02-15 22:12:30 |
|         14 |           1 |        1 |      6163 |   7.99 | 2005-07-11 10:13:46 | 2006-02-15 22:12:30 |
|         15 |           1 |        2 |      7273 |   2.99 | 2005-07-27 11:31:22 | 2006-02-15 22:12:30 |
|         16 |           1 |        1 |      7841 |   4.99 | 2005-07-28 09:04:45 | 2006-02-15 22:12:30 |
|         17 |           1 |        2 |      8033 |   4.99 | 2005-07-28 16:18:23 | 2006-02-15 22:12:30 |
|         18 |           1 |        1 |      8074 |   0.99 | 2005-07-28 17:33:39 | 2006-02-15 22:12:30 |
+------------+-------------+----------+-----------+--------+---------------------+---------------------+
18 rows in set (0.01 sec)

これで、ポイントインタイムリカバリで指定した時間の状態に戻すことができることを確認しました。

5. 後片付け

AWSのリソースは従量課金のため、作ったまま放置しておくとお金がかかってしまいます。そのため、ハンズオンが終わったら不要なリソースは削除しておきましょう。

ポイントインタイムリカバリで作成した DBインスタンスを削除します。 RDSのコンソール画面を開き、ナビゲーションペイン(左メニュー)の [データベース] をクリックしてデータベース一覧を開きます。ポイントインタイムリカバリで作成したDBインスタンス(handson-rds-2) にチェックを入れ、[アクション] - [削除] をクリックします。


削除の確認画面が表示されるので、以下の設定をして、右下の [削除] をクリックします。

・最終スナップショットを作成のチェックを外す
・自動バックアップの保持のチェックを外す
・私は、インスタンスの削除後、~にチェックを入れる
・テキスト入力フィールドに delete me と入力する


DBインスタンスの削除が始まり、10分ほどで削除が完了します。
次の手順はDBインスタンスの削除が完了してから進めましょう。完了せずに進めてしまうと削除作業が失敗します。

次は、CloudFormationでスタックの削除をします。
CloudFormationでまとめて作成したリソース(VPC、EC2、RDSなど)は、まとめて削除できます。

CloudFormationのコンソール画面を開き、ナビゲーションペイン(左メニュー)の [スタック] をクリックしてスタック一覧を開きます。ハンズオン環境構築のスタック(pitr-handson) を選択し、 [削除] をクリックします。


確認画面が表示されますので、右下の [削除] をクリックします。


10分ほど経つと削除が完了します。
これで今回のハンズオンは以上となります。

まとめ

今回はポイントインタイムリカバリの動作確認を行いました。バックアップを取得したタイミング以外の指定した時間の状態に戻すことができますので、障害発生時やオペレーションミスなどで発生前の状態に簡単に戻すことができます。便利な機能ですので、このハンズオンで操作方法を習得しておきましょう。

参考資料

docs.aws.amazon.com

小倉 大(記事一覧)

アプリケーションサービス部ラーニングエクスペリエンス課 札幌在住

AWSトレーニングの講師をしています。

最近は5歳の息子と遊ぶのが楽しいです!

Twitter: @MasaruOgura