Fujitsu Cloud Direct ブログ

初心者エンジニア向け技術ブログ

セキュアな経路でニフクラオブジェクトストレージサービスとAmazon S3へのマルチクラウドバックアップ環境を構築してみた

この記事は、ニフクラブログで2022-07-06に公開された記事を移転したものです。

こんにちは、CRE部 技術支援チームです。

今回の記事も前回に続いて、ニフクラオブジェクトストレージサービスのお話です。 データのバックアップをクラウド上に保管できるクラウドストレージは大変便利なサービスです。
特に、Amazon Web Services(以後AWS)が提供しているAmazon S3は世界的にユーザーが多い代表的なクラウドストレージサービスの1つですが、ニフクラでもクラウドストレージサービスとしてニフクラオブジェクトストレージサービスを提供しています。
ニフクラオブジェクトストレージサービスは、インターフェースとしてAmazon S3互換のREST APIを提供しているので、Amazon S3と併用してマルチクラウドでバックアップ環境を構築すると、さらにリスクの分散が可能になります。

近年、自然災害の増加に伴いDR(Disaster Recovery)のニーズが高まっていますが、「バックアップデータを分散させておく」という観点でもマルチクラウドは有用な手段です。

マルチクラウドの実現は、専用回線契約等の手続きが必要であったり異なるクラウド間のサービス連携が複雑でハードルが高いという印象があるかもしれませんが、 ニフクラ拠点間VPNゲートウェイにAWSのAWS Site-to-Site VPNとAWS PrivateLinkを組み合わせて使うとブラウザー上のコントロールパネル操作で容易にマルチクラウド環境を構築することができます。

今回マルチクラウド環境を構築して、ニフクラオブジェクトストレージサービスにはニフクラルーターのNAT機能で、Amazon S3にはAWS PrivateLink for Amazon S3でアクセスしてバックアップファイルをアップロードするマルチクラウドバックアップの方法をご紹介します。


構成パターン

前提条件

本ブログ記事は、以下の前提知識がある方を想定しています。

  • AWSの基本的な操作、サービスに関する知識

  • ニフクラの基本的な操作と知識

  • ルーティングに関する知識

利用リソース

検証に利用したリソースは以下の通りです。

ニフクラリソース

リソース 数量
プライベートLAN 1
ファイアウォール 4
ルーター 1
DHCPオプション 1
NATテーブル 1
拠点間VPNゲートウェイ 1
検証サーバー 1
RDBサーバー 1
ニフクラオブジェクトストレージサービス 1
拠点間VPNゲートウェイ:VPNコネクション 1
拠点間VPNゲートウェイ:カスタマーゲートウェイ 1

※今回、構成の柔軟性も加味して拠点間VPNゲートウェイではIPSec VTIで接続をおこないました。本構成例に限定すると、IPSecでの接続でも実装可能です。

AWSリソース(表中のリンクは他社サイトへのリンクです。)

リソース 数量
Amazon Virtual Private Cloud 1
サブネット 1
セキュリティグループ 1
カスタマーゲートウェイ 1
仮想プライベートゲートウェイ 1
ルートテーブル 1
AWS PrivateLink for Amazon S3 1
AWS Site-to-Site VPN 1
Amazon S3 1

ニフクラ環境準備

ニフクラ環境リソース作成

ここでは赤枠の範囲のリソースを作成します。

・プライベートLAN作成

拠点間VPNゲートウェイ、ルーター、検証サーバー、RDBサーバーが接続されるプライベートLANを作成します。
作成方法は以下ヘルプサイトを参照ください。
クラウドヘルプ(プライベートLAN:基本情報)

プライベートLAN名 CIDR
VPNLAN01 172.16.1.0/24

・ファイアウォール作成

4つのファイアウォールを作成します。
作成方法は以下ヘルプサイトを参照ください。
クラウドヘルプ(ファイアウォールグループの新規作成)

ファイアウォール名 INルール
FWVPN01(拠点間VPNゲートウェイ用) [VPN connection用]
UDP500:192.168.0.0/16
UDP4500:192.168.0.0/16
ESP:192.168.0.0/16
[AWS PrivateLink for Amazon S3通信用]
HTTPS443:172.16.1.0/24
FWROUTER01(AWS向け&NATルーター用) [ニフクラオブジェクトストレージサービス接続SNAT用]
UDP53:172.16.1.0/24
[ニフクラオブジェクトストレージサービスSDK for Java操作用]
TCP443:172.16.1.0/24
[SSH外部接続DNAT用]
TCP22:xxx.xx.xx.xx.xx(外部の接続元IP)
FWMULTIBKTEST01(検証サーバー用) [SSH外部接続DNAT用]
TCP22:xxx.xx.xx.xx.xx(外部の接続元IP)
fwdb01(RDBサーバー用) [プライベートLAN内部用]
TCP3306:172.16.1.0/24

・拠点間VPNゲートウェイ作成

AWSとニフクラ環境の間を接続する拠点間VPNゲートウェイを作成します。
作成方法は以下ヘルプサイトを参照ください。
クラウドヘルプ(拠点間VPNゲートウェイ:作成)

項目名
拠点間VPNゲートウェイ名 VPNGW
ファイアウォール FWVPN01
プライベートネットワーク VPNLAN01
プライベートIPアドレス 172.16.1.2
グローバルIPアドレス 自動割り当て

・DHCPオプション作成

ルーターをVPNLAN01のデフォルトゲートウェイとして自動設定するためにDHCPオプションを作成します。
作成方法は以下ヘルプサイトを参照ください。
クラウドヘルプ(ルーター:DHCPオプション)

項目名
default-router 172.16.1.10
domain-name 空欄
domain-name-servers 空欄
ntp-servers 空欄
netbios-name-servers 空欄
netbios-node-type 選択しない
lease-time 空欄

・ルーター作成

VPNLAN01上の検証サーバーがインターネットと接続するためにルーターを作成します。 後述のNATテーブルを作成したルーターに紐づけます。

  • 「SNAT」機能で検証サーバーからニフクラオブジェクトストレージサービスに接続することができます。

  • 「DNAT」機能で外部端末からSSHで検証サーバーに接続することができます。

作成方法は以下ヘルプサイトを参照ください。
クラウドヘルプ(ルーター:作成)

項目名
ルーター名 multibktest
ファイアウォール FWROUTER01
プライベートネットワーク VPNLAN01
プライベートIPアドレス 172.16.1.10
DHCP 有効
DHCPオプション 作成したDHCPオプション
グローバルIPアドレス 自動割り当て

・NATテーブル作成

プライベートLAN上の検証サーバーがルーター経由で外部のインターネットに接続可能にするために NATテーブルを作成します。 作成後、作成済みのルーターとNATテーブルと紐づけます。
作成方法は以下ヘルプサイトを参照ください。
クラウドヘルプ(NATテーブル:作成)
デザインパターン(NATテーブル)

➀SNAT設定

優先順位 アウトバウントネットワーク 送信元 送信元プロトコル 送信元ポート
1 共通グローバル 172.16.1.1(ニフクラ検証サーバー) ALL

➁DNAT設定

優先順位 インバウンドネットワーク 送信先 送信先プロトコル 送信先ポート
1 共通グローバル 172.16.1.1(ニフクラ検証サーバー) TCP 22

・検証サーバー作成

検証サーバーをプライベートLAN(VPNLAN01)上に作成します。
作成方法は以下ヘルプサイトを参照ください。
クラウドヘルプ(サーバーの作成)

項目名
OS CentOS 7.9
サーバー名 MULTIBKTEST01
ファイアウォール FWMULTIBKTEST01
プライベートネットワーク VPNLAN01
プライベートIPアドレス 172.16.1.1

・RDBサーバー作成

RDBサーバーをプライベートLAN(VPNLAN01)上に作成します。
作成方法は以下ヘルプサイトを参照ください。
クラウドヘルプ(RDBサーバーの作成)

項目名
DB mysql5.7.15
サーバー名 multibktest02
ファイアウォール fwdb01
プライベートネットワーク VPNLAN01
プライベートIPアドレス 172.16.1.101
作成DB名 MULTIBKTEST_DB

検証サーバーとRDBサーバーの接続設定

ここでは赤枠の範囲のリソースを作成します。 検証サーバーとRDBサーバーを接続します。
詳細、設定方法は以下のブログ記事を参照ください。
検証サーバーとRDBサーバーの接続方法

ニフクラオブジェクトストレージサービス接続設定およびバケット作成

ニフクラオブジェクトストレージサービスに接続してdumpファイルを保管するためのバケットを作成します。
ここでは赤枠の範囲のリソースを作成します。
※ニフクラオブジェクトストレージサービスについて使用できるリージョン/ゾーンの制限があります。ご注意ください。

・アカウント作成

ニフクラオブジェクトストレージサービスを使用するためにアカウントを設定します。設定方法は以下ヘルプサイトを参照ください。
オブジェクトストレージサービス:アカウント作成

・アクセスキー、シークレットキーの確認
オブジェクトストレージサービスの操作にはアクセスキー、シークレットキーが必要なのでオブジェクトストレージサービス:アカウント詳細 で確認します。

・オブジェクトストレージサービスの操作
オブジェクトストレージサービスにはブラウザ上で操作するオブジェクトストレージエクスプローラーはございません。
オブジェクトストレージサービスの操作はオブジェクトストレージサービスAPI、またはニフクラオブジェクトストレージサービス SDK for Javaでおこないます。
今回、ニフクラ ストレージ SDK for JavaとSDKに同梱されているCLIツールで操作をおこないます。
※バケットを他アカウントにも許可する等、より高度な操作を実施したい場合はAPIで操作を実施してください。詳細は以下ブログ記事を参照ください。
”ニフクラオブジェクトストレージサービス用APIをPythonとBashで実行してみた”

・CLIツールの設定
上記で確認したアクセスキー、シークレットキーをCLIツール配下のプロパティファイルに設定します。
詳細は以下ヘルプサイトを参照ください。
ニフクラ ストレージ SDK for Java設定方法

# vi credentials.properties
# Fill in your NIFCLOUD Storage Service Access Key ID and Secret Access Key
# https://pfs.nifcloud.com/api/obj_storage/
accessKey =xxxxxxxxxx
secretKey =xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

・バケット作成
CLIツールでmbコマンドを実行してdumpファイルを保管するバケットを作成します。

項目名
バケット名 multibk-db-dump
#sh ncs_cli.sh mb ncss://multibk-db-dump
[INFO ] NiftyCloudClient execute - Sending Request: PUT jp-east-1.storage.api.nifcloud.com //multibk-db-dump Headers: (Authorization: AWS4-HMAC-SHA256 Credential=96U1JOCBD9XGUOFHKU4H/20220510/jp-east-3/s3/aws4_request, SignedHeaders=host;x-amz-content-sha256;x-amz-date, Signature=bf5732b4dc96e4f02484b5c862ab8515e3e8814a54f275bb735751c777d56431, x-amz-Date: 20220510T070126Z, x-amz-Content-SHA256: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855, )
[INFO ] request parseResponse - Success: 200, Request ID: 1652166087960129
Bucket 'ncss://multibk-db-dump' created

バケットが作成できました。
※CLIツールで作成したバケット、バケット内オブジェクトはアクセスキー、シークレットキーに紐づくアカウントのみ全権アクセス設定になっています。他アカウントからはアクセスできません。

・バケット確認
CLIツールでlsコマンドを実行して作成したバケットを確認します。

# sh ncs_cli.sh ls
[INFO ] NiftyCloudClient execute - Sending Request: GET jp-east-1.storage.api.nifcloud.com / Headers: (Authorization: AWS4-HMAC-SHA256 Credential=96U1JOCBD9XGUOFHKU4H/20220510/jp-east-3/s3/aws4_request, SignedHeaders=host;x-amz-content-sha256;x-amz-date, Signature=4eb220416caafa42ecaaea955174f84fc5b3cbe8a9a7339c7147d13d1158cab8, x-amz-Date: 20220510T071007Z, x-amz-Content-SHA256: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855, )
[INFO ] request parseResponse - Success: 200, Request ID: 1652166608434822
2022-05-10 04:01  ncss://multibk-db-dump

バケットが作成されたことを確認できました。
オブジェクトストレージサービス接続設定とバケット作成は完了です。

AWS環境準備

AWS環境リソース作成

ここでは赤枠の範囲のリソースを作成します。

・Amazon Virtual Private Cloud作成

AWS内に分離されたネットワーク領域を作成するためにAmazon Virtual Private Cloudを作成します。
作成方法は以下ヘルプサイトを参照ください。
VPC を作成する(他社サイトへのリンクです)

項目名
名前タグ vpc01-vpc
IPv4 CIDR ブロック 192.168.0.0/16

・サブネット作成

VPC内にCIDRブロックで分割したネットワークを構築するためにサブネットを作成します。
作成方法は以下ヘルプサイトを参照ください。
VPC でサブネットを作成する(他社サイトへのリンクです)

項目名
VPC ID vpc01-vpc
サブネット名 vpc01-subnet
IPv4 CIDR ブロック 192.168.10.0/24

・セキュリティグループ作成

ニフクラ側の検証サーバー(172.16.1.1)がVPCにアクセスができるようにセキュリティグループを作成してインバウンドルールを設定します。
作成方法は以下ヘルプサイトを参照ください。
セキュリティグループを作成する(他社サイトへのリンクです)

項目名
セキュリティグループ名 vpn01-sg
インバウンドルール HTTPS:172.16.1.1/32

・カスタマーゲートウェイ作成

ニフクラ側との接続情報を登録するカスタマーゲートウェイを作成します。
作成方法は以下ヘルプサイトを参照ください。
カスタマーゲートウェイを作成する(他社サイトへのリンクです)

項目名
名前 vpn01-cgw01
ルーティング 静的
IPアドレス ニフクラ拠点間VPNゲートウェイのグローバルIPアドレスを設定
Certificate ARN 空欄
Device 空欄

・仮想プライベートゲートウェイ作成

AWS側VPNトンネルのルーターとなる仮想プライベートゲートウェイを作成します。
作成方法は以下ヘルプサイトを参照ください。
仮想プライベートゲートウェイの作成(他社サイトへのリンクです)

項目名
名前タグ vpn01-vgw
ARN AmazonのデフォルトASN

VPCにアタッチします。

項目名
VPC 作成したVPC

・ルートテーブル作成

仮想プライベートゲートウェイ(172.16.1.0/24)の通信がおこなえるように設定します。 作成方法は以下ヘルプサイトを参照ください。
ルートテーブルを操作する(他社サイトへのリンクです)

項目名
名前タグ vpn01-route-table
VPC vpn01-vpc
ルート送信先 172.16.1.0/24
ターゲット vpn01-vgw

・AWS PrivateLink for Amazon S3 エンドポイント作成

Amazon S3にAWS PrivateLink for Amazon S3経由で接続できるようにエンドポイントを作成します。
作成方法は以下ヘルプサイトを参照ください。
エンドポイント作成(他社サイトへのリンクです)

項目名
エンドポイント名 privatelink-s3
サービスカテゴリ AWS のサービス
サービス サービス名:com.amazonaws.ap-northeast-1.s3 タイプ:Interface
VPC 作成したVPC
サブネット ap-northeast-1c (apne1-az1)
セキュリティグループ 作成したセキュリティグループ
ポリシー フルアクセス
タグ なし

作成されたエンドポイントのDNS名とIPアドレスは、後ほどの手順で利用するため控えておいてください。

・サイト間のVPN接続作成

トンネルの構成情報を持つサイト間のVPN接続を作成します。
作成後「設定のダウンロード」から「Generic (汎用)」の設定ファイルをダウンロードして、ニフクラ側で使用します。
作成方法は以下ヘルプサイトを参照ください。
サイト間 VPN 接続の作成(他社サイトへのリンクです)

項目名 備考
名前タグ vpn01-vpnc01
ターゲットゲートウェイ 仮想プライベートゲートウェイ
仮想プライベートゲートウェイ vpn01-vgw
カスタマーゲートウェイID vpn01-cgw01
ルーティングオプション 静的
静的IPプレフィックス
(静的ルート)
192.168.0.0/16 , 172.16.1.0/24
トンネル内線IPバージョン IPv4
ローカルIPv4ネットワークCIDR 0.0.0.0/0 下記『※』参照
リモートIPv4ネットワークCIDR 0.0.0.0/0 下記『※』参照
トンネル1の内部IPv4 CIDR 空欄
トンネル1の事前共有キー 任意のものを指定
トンネル2の内部IPv4 CIDR 空欄
トンネル2の事前共有キー 任意のものを指定
トンネル1の詳細オプション デフォルトオプションを使用
トンネル2の詳細オプション デフォルトオプションを使用

※ニフクラ拠点間VPNゲートウェイには、ニフクラ側ネットワークの任意のアドレス0.0.0.0/0からカスタマーゲートウェイ先ネットワークの任意のアドレス0.0.0.0/0への通信にIPSecを適用するポリシーが適用されます。また、IKEv1の仕様として両者が提示するセレクタ情報を合わせる必要があるため、AWS側のローカル/リモートIPv4ネットワークCIDRをニフクラ側に合わせる(0.0.0.0/0にする)必要があります。

・Amazon S3 オブジェクトストレージバケット作成

dumpファイルを保管するためにAmazon S3オブジェクトストレージ上にバケットを作成します。
作成方法は以下ヘルプサイトを参照ください。
Amazon S3バケット作成(他社サイトへのリンクです)

項目名
バケット名 multibk_db_dump

ニフクラ環境とAWS環境の接続

クラウド間VPN接続構築

ここでは赤枠の範囲のリソースを作成します。

・カスタマーゲートウェイ作成

ニフクラ拠点間VPNゲートウェイにAWS側のネットワーク情報を持たせるためにカスタマーゲートウェイを作成します。
作成方法は以下ヘルプサイトを参照ください。
クラウドヘルプ(拠点間VPNゲートウェイ:カスタマーゲートウェイ作成)

項目名 備考
カスタマーゲートウェイ名 VPNCGW
対向機器IPアドレス サイト間のVPN接続作成されたトンネル情報 下記『※』参照
接続方式 IPSec VTI
対向機器LAN側IPアドレス帯 192.168.0.0/16
対向機器LAN側IPアドレス 空欄 指定がない場合は対向機器IPアドレスの値が指定される

※対向機器IPアドレスには下記図の赤枠部分の「外部IPアドレス(Tunnel1、2どちらでも可)」を設定する。

・VPNコネクション作成

トンネルの構成情報を設定するVPNコネクションを作成します。 設定の際は「サイト間のVPN接続」でダウンロードした、Generic版設定ファイルを参照しながら設定します。
作成方法は以下ヘルプサイトを参照ください。
クラウドヘルプ(拠点間VPNゲートウェイ:VPNコネクション作成)

Generic版設定値例

項目名 備考
カスタマーゲートウェイ VPNCGW
接続方式 IPSec VTI
IKEバージョン IKEv1 GenericファイルのIKE versionを参照
暗号化アルゴリズム AES128 GenericファイルのEncryption Algorithmを参照
認証アルゴリズム SHA1 GenericファイルのAuthentication Algorithmを参照
事前共有キー xxxx GenericファイルのPre-Shared Keyを参照
IKE lifetime 28800 Genericファイルのlifetimeを参照
ESP lifetime 3600 Genericファイルのlifetimeを参照
DH Group 2 (1024-bit MODP Group) GenericファイルのPerfect Forward Secrecyを参照

作成後のニフクラネットワークは下記図の構成になります。

Amazon S3 PrivateLink接続

ここでは赤枠の範囲のリソースを作成します。

・AWS CLI のインストール

検証サーバーにAWS CLIをインストールしてAWSコマンドラインを実行できるようにします。
インストール方法は以下ヘルプサイトのLinuxの項を参照ください。
AWS CLI のインストール(他社サイトへのリンクです)

インストール完了後に以下のコマンドでAmazon S3を使用するための認証情報を設定してください。

# aws configure

設定内容を以下コマンドで確認します。

 # aws configure list
      Name                    Value             Type    Location
      ----                    -----             ----    --------
   profile                <not set>             None    None
access_key     ****************66U5 shared-credentials-file
secret_key     ****************rrTC shared-credentials-file
    region                <not set>             None    None

今回の検証環境ではCA ルート証明書の設定は省略するため、AWSコマンドでHTTPS通信すると「SSL: CERTIFICATE_ VERIFY_FAILED」エラーが発生してしまいます。
その対応としてviコマンドで設定ファイルを作成します。

 # vi ~/aws/.config

以下の内容を設定します。

[default]
ca_bundle = /data/ca-certs/ca-bundle.pem

・hostsファイルの設定

検証サーバーのhostsファイルにAWS PrivateLink for Amazon S3のエンドポイントの情報を設定します。
viコマンドでhostsを編集します。

# vi /etc/hosts

エンドポイント作成時に発行されたDNS名、IPアドレスをファイルに追加します。

#IPv4 アドレス DNS名
192.168.10.xxx bucket.vpce-xxxxxxxxxxxxxxx.s3.ap-northeast-1.vpce.amazonaws.com

・検証サーバーへのルーティング設定

検証サーバーではデフォルトゲートウェイをルーターに設定していて、ニフクラオブジェクトストレージサービスへ通信しています。
AWS PrivateLink for Amazon S3に接続するためのルーティングが必要なので設定を追加します。ゲートウェイにはニフクラの拠点間VPNGWを指定します。
ipコマンドでネットワークに接続しているインターフェースデバイスを確認します。

# ip addr

以下のような内容が表示されます。この場合は「ens160」がインターフェースデバイスになります。

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether e8:17:fc:1f:1f:33 brd ff:ff:ff:ff:ff:ff
    inet 172.16.1.1/24 brd 172.16.1.255 scope global noprefixroute dynamic ens160
       valid_lft 83495sec preferred_lft 83495sec
    inet6 fe80::ea17:fcff:fe1f:1f33/64 scope link
       valid_lft forever preferred_lft forever

viコマンドで/etc/sysconfig/network-scriptsディレクトリー配下に永続ルーティング用ファイルを作成します。

# vi /etc/sysconfig/network-scripts/route-ens160

以下の内容を設定します。

192.168.10.0/24 via 172.16.1.2

内容保存後、rebootコマンドで検証サーバーを再起動する。

# reboot

検証サーバー再起動後、ipコマンドでルーティング設定を確認する。

# ip r

以下のような内容が表示されていれば設定完了です。

default via 172.16.1.10 dev ens160 proto dhcp metric 100
172.16.1.0/24 dev ens160 proto kernel scope link src 172.16.1.1 metric 100
192.168.10.0/24 via 172.16.1.2 dev ens160 proto static metric 100

・awsコマンドで疎通確認

awsコマンドでAmazon S3のバケット一覧を取得します

# aws s3 ls --region ap-northeast-1 --endpoint-url https://bucket.エンドポイント作成時に発行されたDNS名(vpce-xxxxxxxxxxxxxxx)  s3://バケット名                  

バケット一覧が表示されます。AWS PrivateLink for Amazon S3接続は完了です。

PRE multibk_db_dump/

検証用シェル作成

検証実施のために以下の実行シェルを作成する。

  • バックアップ用dumpファイルアップロードシェル(multibktest_backup.sh)
#!/bin/bash

#RDBサーバーIPアドレス
rdbhost=172.16.1.101

#ローカルディレクトリdb_dump配下にシェルパラメタ$1で設定されたファイル名でdumpファイルを出力する。※extra.cnfにDBログインパスワードを設定する。
mysqldump --defaults-extra-file=/usr/multibktest/extra.cnf --skip-column-statistics --host=$rdbhost --user=admin  MULTIBKTEST_DB --ssl-mode=DISABLED > /usr/multibktest/db_dump/$1.sql


#ニフクラオブジェクトストレージサービスにファイルをアップロード
for filename in `find /usr/multibktest/db_dump  -type f `; do
 #ニフクラ ストレージ SDK for Java配置場所に移動してコマンドラインツールを実行
 cd /root/NIFCLOUDStorage-SDK-CLI
 sh ncs_cli.sh put $filename ncss://multibk-db-dump/`echo $filename | gawk -F/ '{print $NF}'`
done

#Amazon S3にファイルをアップロード
/usr/local/bin/aws s3 sync --region ap-northeast-1 --endpoint-url https://bucket.エンドポイント作成時に発行されたDNS名(vpce-xxxxxxxxxxxxxxx) /usr/multibktest/db_dump s3://cre-verify39-mulitibktest/multibk_db_dump
  • リストア用dumpファイルダウンロードシェル(multibktest_restore.sh)
#!/bin/bash

#RDBサーバーIPアドレス
rdbhost=172.16.1.101

#ニフクラ ストレージ SDK for Java配置場所に移動してコマンドラインツールを実行
echo "NCloud Download"
cd /root/NIFCLOUDStorage-SDK-CLI
#ニフクラオブジェクトストレージサービスからローカルディレクトリdb_restore配下にシェルパラメタ$1で指定したファイル名でdumpファイルをダウンロードする。
sh ncs_cli.sh get ncss://multibk-db-dump/$1.sql /usr/multibktest/db_restore/$1.sql

#ニフクラオブジェクトストレージサービスからdumpファイルをダウンロードできなかった場合
if [ $? -gt 0 ]; then
 #Amazon S3からローカルディレクトリdb_restore配下にシェルパラメタ$1で指定したファイル名でdumpファイルをダウンロードする。
 /usr/local/bin/aws s3 --region ap-northeast-1 --endpoint-url https://bucket.エンドポイント作成時に発行されたDNS名(vpce-xxxxxxxxxxxxxxx)  cp s3://バケット名/multibk_db_dump/$1.sql /usr/multibktest/db_restore/$1.sql
fi

#ニフクラオブジェクトストレージサービス、またはAmazon S3からdumpファイルをダウンロードできた場合にMULTIBKTEST_DBをリストする。※extra.cnfにDBログインパスワードを設定する。
if [ $? = 0 ]; then
 mysql --defaults-extra-file=/usr/multibktest/extra.cnf --host=$rdbhost --user=admin  MULTIBKTEST_DB --ssl-mode=DISABLED < /usr/multibktest/db_restore/$1.sql
fi

DBログインパスワードを格納するため設定ファイルとしてextra.cnf を作成する。

  • DB設定ファイル(extra.cnf)
[client]
password=DBログインパスワード

検証実施

2世代分のバックアップデータをdumpファイルで出力します。出力したdumpファイルをニフクラオブジェクトストレージサービスとAmazon S3にアップロードします。
検証の手順は以下の内容です。

  1. mysqlに接続してmultibk_userテーブルの1世代目バックアップデータ(USER_A,USER_B,USER_C)をINSERT文で登録する。

  2. mysqlに接続してmultibk_userテーブルの1世代目バックアップデータ(USER_A,USER_B,USER_C)をdumpファイルに出力する。dumpファイルをニフクラオブジェクトストレージサービスとAmazon S3にアップロードする。(multibktest_backup.sh実行)

  3. mysqlに接続してmultibk_userテーブルの2世代目バックアップデータ(USER_A,USER_B,USER_C,USER_D,USER_E,USER_F)をINSERT文で登録する。

  4. mysqlに接続してmultibk_userテーブルの2世代目バックアップデータ(USER_A,USER_B,USER_C,USER_D,USER_E,USER_F)をdumpファイルに出力する。dumpファイルをニフクラオブジェクトストレージサービスとAmazon S3にアップロードする。(multibktest_backup.sh実行)

  5. multibk_userテーブルの内容を全件削除する。

  6. ニフクラオブジェクトストレージサービスから1世代目バックアップデータ(USER_A,USER_B,USER_C)dumpファイルをダウンロードする。リストア実施。(multibktest_restore.sh実行)

  7. 1世代目バックアップデータ(USER_A,USER_B,USER_C)の内容がリストアされたことをSELECT文で確認する。

  8. multibk_userテーブルの内容をALL_DELETEする。

  9. ニフクラオブジェクトストレージサービスのSNATを遮断する。

  10. Amazon S3から2世代目バックアップデータ(USER_A,USER_B,USER_C,USER_D,USER_E,USER_F)dumpファイルをダウンロードする。リストア実施。(multibktest_restore.sh実行)

  11. 2世代目バックアップデータ(USER_A,USER_B,USER_C,USER_D,USER_E,USER_F)の内容がリストアされたことをSELECT文で確認する。

1回目ダンプファイルアップロード

mysqlコマンドでRDBに接続してテーブルに1回目のデータを登録します。

# mysql --host=172.16.1.101 --user=admin -p  MULTIBKTEST_DB --ssl-mode=DISABLED
Enter password:
--省略--
mysql> insert into multibk_user values('001','USER_A');
Query OK, 1 row affected (0.01 sec)

mysql> insert into multibk_user values('002','USER_B');
Query OK, 1 row affected (0.00 sec)

mysql> insert into multibk_user values('003','USER_C');
Query OK, 1 row affected (0.00 sec)
mysql> select * from multibk_user;
+---------+-----------+
| user_id | user_name |
+---------+-----------+
| 001     | USER_A    |
| 002     | USER_B    |
| 003     | USER_C    |
+---------+-----------+
3 rows in set (0.00 sec)

パラメータに「bkdump01」と入力してバックアップシェル実行します。

# sh multibktest_backup.sh bkdump01
[INFO ] NiftyCloudClient execute - Sending Request: PUT jp-east-1.storage.api.nifcloud.com //multibk-db-dump Headers: (Authorization: AWS4-HMAC-SHA256 Credential=96U1JOCBD9XGUOFHKU4H/20220510/jp-east-3/s3/aws4_request, SignedHeaders=content-length;content-md5;content-type;host;x-amz-content-sha256;x-amz-date, Signature=aaae8dde4dd19c5948ebc91cfc8518fd99fcc43c9400a0dab803a247403e8840, x-amz-Date: 20220510T073626Z, x-amz-Content-SHA256: 685bea6e7a2b3cd35ed30ac94d499c3247b5efc23bbd8f28b29ce2e81cf8fce2, Content-Type: application/octet-stream, Content-MD5: 92L/XKCfrb7BuUUJ1PZ2ig==, )
[INFO ] request parseResponse - Success: 200, Request ID: 1652168188029851
/usr/multibktest/db_dump/bkdump01.sql -> ncss://multibk-db-dump/bkdump01.sql
upload: ../../usr/multibktest/db_dump/bkdump01.sql to s3://cre-verify39-mulitibktest/multibk_db_dump/bkdump01.sql

ニフクラオブジェクトストレージサービスとAmazon S3にダンプファイルがアップロードされました。

  • ニフクラオブジェクトストレージサービス

※ニフクラオブジェクトストレージサービスはブラウザーで確認できないのでコマンドラインで確認します。

# sh ncs_cli.sh ls ncss://multibk-db-dump
[INFO ] NiftyCloudClient execute - Sending Request: GET jp-east-1.storage.api.nifcloud.com //multibk-db-dump Headers: (Authorization: AWS4-HMAC-SHA256 Credential=96U1JOCBD9XGUOFHKU4H/20220510/jp-east-3/s3/aws4_request, SignedHeaders=host;x-amz-content-sha256;x-amz-date, Signature=7f4920b8e35380c2b4104a8e8e162515cdcedcb31d5f0d9eccd48fba92772934, x-amz-Date: 20220510T080715Z, x-amz-Content-SHA256: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855, )
[INFO ] request parseResponse - Success: 200, Request ID: 1652170037152055
2022-05-10 04:36             1956  ncss://multibk-db-dump/bkdump01.sql
  • Amazon S3

2回目ダンプファイルアップロード

mysqlコマンドでRDBに接続してテーブルに2回目のデータを登録します。

# mysql --host=172.16.1.101 --user=admin -p  MULTIBKTEST_DB --ssl-mode=DISABLED
Enter password:
--省略--
mysql> insert into multibk_user values('004','USER_D');
Query OK, 1 row affected (0.01 sec)

mysql> insert into multibk_user values('005','USER_E');
Query OK, 1 row affected (0.01 sec)

mysql> insert into multibk_user values('006','USER_F');
Query OK, 1 row affected (0.00 sec)

mysql> select * from multibk_user;
+---------+-----------+
| user_id | user_name |
+---------+-----------+
| 001     | USER_A    |
| 002     | USER_B    |
| 003     | USER_C    |
| 004     | USER_D    |
| 005     | USER_E    |
| 006     | USER_F    |
+---------+-----------+
6 rows in set (0.00 sec)

パラメータに「bkdump02」と入力してバックアップシェル実行します。

# sh multibktest_backup.sh bkdump02
[INFO ] NiftyCloudClient execute - Sending Request: PUT jp-east-1.storage.api.nifcloud.com //multibk-db-dump Headers: (Authorization: AWS4-HMAC-SHA256 Credential=96U1JOCBD9XGUOFHKU4H/20220510/jp-east-3/s3/aws4_request, SignedHeaders=content-length;content-md5;content-type;host;x-amz-content-sha256;x-amz-date, Signature=e7649d5b860c2340b9e63a51cd64e8ee2ecefb1d7a6b54dbc8306996c5c4b3c3, x-amz-Date: 20220510T081322Z, x-amz-Content-SHA256: 685bea6e7a2b3cd35ed30ac94d499c3247b5efc23bbd8f28b29ce2e81cf8fce2, Content-Type: application/octet-stream, Content-MD5: 92L/XKCfrb7BuUUJ1PZ2ig==, )
[INFO ] request parseResponse - Success: 200, Request ID: 1652170403477947
/usr/multibktest/db_dump/bkdump01.sql -> ncss://multibk-db-dump/bkdump01.sql
[INFO ] NiftyCloudClient execute - Sending Request: PUT jp-east-1.storage.api.nifcloud.com //multibk-db-dump Headers: (Authorization: AWS4-HMAC-SHA256 Credential=96U1JOCBD9XGUOFHKU4H/20220510/jp-east-3/s3/aws4_request, SignedHeaders=content-length;content-md5;content-type;host;x-amz-content-sha256;x-amz-date, Signature=6a88198d1a2e06ac05dfb3eac999160e275be340d633d5931ca9cd7db6d83e36, x-amz-Date: 20220510T081323Z, x-amz-Content-SHA256: 986c3cb71f831866cbb897312c9680bd059ac55210d81128e137dc0e3600efd8, Content-Type: application/octet-stream, Content-MD5: KSrRhhsEaifhem9mP40gdA==, )
[INFO ] request parseResponse - Success: 200, Request ID: 1652170405026398
/usr/multibktest/db_dump/bkdump02.sql -> ncss://multibk-db-dump/bkdump02.sql
upload: ../../usr/multibktest/db_dump/bkdump02.sql to s3://cre-verify39-mulitibktest/multibk_db_dump/bkdump02.sql

ニフクラオブジェクトストレージサービスとAmazon S3にダンプファイルがアップロードされました。

  • ニフクラオブジェクトストレージサービス

※ニフクラオブジェクトストレージサービスはブラウザで確認できないのでコマンドラインで確認します。

# sh ncs_cli.sh ls ncss://multibk-db-dump
[INFO ] NiftyCloudClient execute - Sending Request: GET jp-east-1.storage.api.nifcloud.com //multibk-db-dump Headers: (Authorization: AWS4-HMAC-SHA256 Credential=96U1JOCBD9XGUOFHKU4H/20220510/jp-east-3/s3/aws4_request, SignedHeaders=host;x-amz-content-sha256;x-amz-date, Signature=2054c7b44d4bb419a5fdb32e0640757c4a622f427ccf8568bdf36f00d295da11, x-amz-Date: 20220510T081514Z, x-amz-Content-SHA256: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855, )
[INFO ] request parseResponse - Success: 200, Request ID: 1652170515649806
2022-05-10 05:13             1956  ncss://multibk-db-dump/bkdump01.sql
2022-05-10 05:13             2007  ncss://multibk-db-dump/bkdump02.sql
  • Amazon S3

1回目ダンプファイルでリストア

mysqlコマンドでRDBに接続してテーブルデータを削除します。

# mysql --host=172.16.1.101 --user=admin -p  MULTIBKTEST_DB --ssl-mode=DISABLED
Enter password:
--省略--
mysql> delete from multibk_user;
Query OK, 6 rows affected (0.01 sec)

mysql> select * from multibk_user;
Empty set (0.00 sec)

パラメータに「bkdump01」と入力してリストアシェル実行します。
1回目でアップロードしたダンプファイルをニフクラオブジェクトストレージサービスからダウンロードしてデータを復旧します。

ニフクラオブジェクトストレージサービスとの接続を確認します。

# nslookup jp-east-1.storage.api.nifcloud.com
Server:         127.0.0.1
Address:        127.0.0.1#53

Non-authoritative answer:
Name:   jp-east-1.storage.api.nifcloud.com
Address: 220.209.74.75

シェルを実行します。

# sh multibktest_restore.sh bkdump01
NCloud Download
[INFO ] NiftyCloudClient execute - Sending Request: GET jp-east-1.storage.api.nifcloud.com //multibk-db-dump Headers: (Authorization: AWS4-HMAC-SHA256 Credential=96U1JOCBD9XGUOFHKU4H/20220510/jp-east-3/s3/aws4_request, SignedHeaders=host;x-amz-content-sha256;x-amz-date, Signature=f9a10933c695fcfa272a97a6cf27de72f76ff890f3833b8e02c12db8f1e82a77, x-amz-Date: 20220510T082313Z, x-amz-Content-SHA256: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855, )
[INFO ] request parseResponse - Success: 200, Request ID: 1652170994818301
ncss://multibk-db-dump/bkdump01.sql -> /usr/multibktest/db_restore/bkdump01.sql

mysqlコマンドでRDBに接続してデータが復旧されたことを確認します。

# mysql --host=172.16.1.101 --user=admin -p  MULTIBKTEST_DB --ssl-mode=DISABLED
Enter password:
--省略--
mysql> select * from multibk_user;
+---------+-----------+
| user_id | user_name |
+---------+-----------+
| 001     | USER_A    |
| 002     | USER_B    |
| 003     | USER_C    |
+---------+-----------+
3 rows in set (0.00 sec)

データが復旧されたことを確認できました。

2回目ダンプファイルでリストア

mysqlコマンドでRDBに接続してテーブルデータを削除します。

# mysql --host=172.16.1.101 --user=admin -p  MULTIBKTEST_DB --ssl-mode=DISABLED
Enter password:
--省略--
mysql> delete from multibk_user;
Query OK, 3 rows affected (0.01 sec)

mysql> select * from multibk_user;
Empty set (0.00 sec)

パラメータに「bkdump02」と入力してリストアシェル実行します。
ニフクラオブジェクトストレージサービスとの接続を遮断して
2回目でアップロードしたダンプファイルをAmazon S3からダウンロードしてデータを復旧します。

ニフクラオブジェクトストレージサービスと接続が遮断されていることを確認します。

# nslookup jp-east-1.storage.api.nifcloud.com
;; connection timed out; no servers could be reached

シェルを実行します。

# sh multibktest_restore.sh bkdump02
NCloud Download
[INFO ] NiftyCloudClient execute - Sending Request: GET jp-east-1.storage.api.nifcloud.com //multibk-db-dump Headers: (Authorization: AWS4-HMAC-SHA256 Credential=96U1JOCBD9XGUOFHKU4H/20220510/jp-east-3/s3/aws4_request, SignedHeaders=host;x-amz-content-sha256;x-amz-date, Signature=3435354e4f83de39ab808fcce61c9dbc7bed7a464b65e9b58bd13f63f951e631, x-amz-Date: 20220510T082915Z, x-amz-Content-SHA256: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855, )
[ERROR] NiftyCloudClient execute - Failed to execute HTTP request: jp-east-1.storage.api.nifcloud.com: Name or service not known
Caught an NiftyCloudClientException, which means the client encountered a serious internal problem while trying to communicate with NIFCLOUD Storage, such as not being able to access the network.
Error Message: Failed to execute HTTP request: jp-east-1.storage.api.nifcloud.com: Name or service not known
download: s3://cre-verify39-mulitibktest/multibk_db_dump/bkdump02.sql to ../../usr/multibktest/db_restore/bkdump02.sql

ニフクラオブジェクトストレージサービスの接続に失敗して、Amazon S3からダウンロードに切り替わっています。

[ERROR] NiftyCloudClient execute - Failed to execute HTTP request: jp-east-1.storage.api.nifcloud.com: Name or service not known
Caught an NiftyCloudClientException, which means the client encountered a serious internal problem while trying to communicate with NIFCLOUD Storage, such as not being able to access the network.
Error Message: Failed to execute HTTP request: jp-east-1.storage.api.nifcloud.com: Name or service not known
download: s3://cre-verify39-mulitibktest/multibk_db_dump/bkdump02.sql to ../../usr/multibktest/db_restore/bkdump02.sql

mysqlコマンドでRDBに接続してデータが復旧されたことを確認します。

# mysql --host=172.16.1.101 --user=admin -p  MULTIBKTEST_DB --ssl-mode=DISABLED
Enter password:
--省略--
mysql> select * from multibk_user;
+---------+-----------+
| user_id | user_name |
+---------+-----------+
| 001     | USER_A    |
| 002     | USER_B    |
| 003     | USER_C    |
| 004     | USER_D    |
| 005     | USER_E    |
| 006     | USER_F    |
+---------+-----------+
6 rows in set (0.00 sec)

データが復旧されたことを確認できました。

まとめ

今回ニフクラオブジェクトストレージサービスとAmazon S3を利用したマルチクラウドバックアップの検証を紹介しました。
容易にマルチクラウドの環境が構築できるということがご理解いただけたかと思います。

本記事がシステム構成検討の際の助けになれば幸いです。
ここまで読んでいただきありがとうございました!

注意事項

  • 本記事に記載されている会社名、製品名等の固有名詞は各社の商号、登録商標または商標です。

  • 本記事の他社サイトへのリンクにつきまして、リンク切れの際はご容赦ください。

  • 本記事で記載した各サービス/ニフクラの機能等は、2022年6月時点の情報です。ご利用の際は、各サービス/ニフクラの機能の最新情報をご確認ください。

  • 本記事の他社サービス利用に関する記載については、ニフクラのサポート対象外となります。ご自身の責任でご利用ください。

  • AWSのVPN機器は、拠点間VPNゲートウェイの「接続確認済み機器またはOS」にありません。そのため本構成はご利用者様の責任でご利用ください。