こんにちは、ラーニングエクスペリエンス課の小倉です。だいぶ間があいてしまいまして、久しぶりの投稿です。
サーバーワークスでは、自由に勉強会を開催してスキルアップをしています。その中で私は毎週月曜日の朝、「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分ほど経つと削除が完了します。
これで今回のハンズオンは以上となります。
まとめ
今回はポイントインタイムリカバリの動作確認を行いました。バックアップを取得したタイミング以外の指定した時間の状態に戻すことができますので、障害発生時やオペレーションミスなどで発生前の状態に簡単に戻すことができます。便利な機能ですので、このハンズオンで操作方法を習得しておきましょう。
参考資料
小倉 大(記事一覧)
アプリケーションサービス部ラーニングエクスペリエンス課 札幌在住
AWSトレーニングの講師をしています。
最近は5歳の息子と遊ぶのが楽しいです!
Twitter: @MasaruOgura