同一IPアドレスによるサーバ複製#

要求事項#

  • スナップショットを使用して仮想サーバを複製する際に、同一のプライベートIPアドレスを使用したい

対応するデザインパターン概要#

スナップショット/複製パターン の通りに仮想サーバの複製を行うと、通常は複製後のサーバと複製前のサーバではそれぞれ異なるプライベートIPアドレスが付与されます。

本パターンでは、複製後の仮想サーバに複製前と同一のプライベートIPアドレスを保持させる手順を掲載します。

構造 (イメージ図)#

image

実装サンプル#

1. 事前準備#

複製を行う仮想サーバに対して、仮想サーバのOSに必要に応じて以下(1)または(2)の作業を実施してください。

(1) OS種別がLinuxのシステムストレージの場合#

スナップショットを採取する仮想サーバのOSが以下に該当する場合のみ、以下の(A)および(B)の手順を実施してください。
下記以外のOSは、該当するネットワーク設定が存在しないため対処不要です。

  • CentOS 6.x(xは数字)
  • Red Hat Enterprise Linux 6.x(xは数字)
(A) write_net_rules の無効化#

以下のファイルを開いてください。

/lib/udev/rules.d/75-persistent-net-generator.rules
上記ファイル内に記載されている以下の行を、コメントアウト(行頭に#を追加)してください。
DRIVERS=="?*", IMPORT{program}="write_net_rules"

(B) /etc/udev/rules.d/70-persistent-net.rulesの削除#

以下のファイルを削除してください。

rm -f /etc/udev/rules.d/70-persistent-net.rules

(2) OS種別がWindowsのシステムストレージの場合#

Windows OSのSysprep手順を実施してください。
Sysprepの詳細は機能説明書をご参照ください。

通常、Windows OSにてSysprepを実施すると、仮想サーバは「停止」状態(SHUTOFF)となります。

2. ポートの再作成#

本手順では、複製前のサーバで使用されているポートをいったん削除し、同一のプライベートIPアドレス保持するポートを再作成します。

(1) 仮想サーバの停止#

仮想サーバの一覧画面にて、複製対象の仮想サーバの「アクション」より「強制停止」を選択し、 仮想サーバを「停止」状態(SHUTOFF)にします。
(Windows OSにてSysprepを実行し、既に「停止」状態(SHUTOFF)となっている場合は不要です。)

(2) ポートIDの確認#

「仮想サーバ詳細」画面にて削除予定のポート名を選択し、「ポート詳細」画面より以下を控えます。

  • 削除予定ポートのポートID
  • 上記のポートに付与されている、再度使用予定のプライベートIPアドレス

ポートIDは、以下の手順にて、ポートが正常に削除されたことを確認するために使用します。

(3) ポートの削除#

「仮想サーバ詳細」画面のポート一覧より、対象となるポートの「アクション」を選択し、「削除」を押下します。

(4) ポートの確認#

上記で削除したポートが正常に削除されていることを確認します。
以下のAPI実行後に"type": "PortNotFound"と出力されることを確認します。

  • 設定項目(REST API)
項目 設定値例 内容
$PORT_ID (ポートID) 上記「ポートの削除」手順にて削除したポートIDを入力
  • 実行API
curl -Ss $NETWORK/v2.0/ports/$PORT_ID -X GET -H "X-Auth-Token: $OS_AUTH_TOKEN" | jq .

(5) ポートの再作成#

サーバを再作成する際に必要となるポートを作成します。
以下のAPI実行後に出力されるポートIDは必ず控えてください。

  • 設定項目(REST API)
項目 設定値例 内容
$PORT_NAME "New-Port-CDP" 作成するポートに付与する名前を指定
$NETWORK_ID (仮想ネットワークID) 再作成するサーバを配備する仮想ネットワークIDを指定
$SUBNET_ID (サブネットID) 再作成するサーバを配備するサブネットIDを指定
$FIXED_IP_ADDRESS (固定プライベートIPアドレス) 再作成するサーバで使用する固定IPアドレスを指定
$SG_ID (セキュリティグループID) 作成するポートに付与するセキュリティグループIDを指定
  • 実行API
curl -Ss $NETWORK/v2.0/ports -X POST -H "X-Auth-Token: $OS_AUTH_TOKEN" -H "Content-Type: application/json" -d '{"port":{"network_id": "'$NETWORK_ID'", "name": "'$PORT_NAME'", "fixed_ips": [{"subnet_id": "'$SUBNET_ID'", "ip_address": "'$FIXED_IP_ADDRESS'"}], "security_groups": ["'$SG_ID'"] }}' | jq .

3. スナップショットの取得#

本手順では、仮想サーバを複製するためにシステムストレージのスナップショットを作成します。

(1) スナップショットの取得#

複製前のサーバのシステムストレージのスナップショットを取得します。
以下のAPI実行後に出力されるスナップショットIDは必ず控えてください。

  • 設定項目(REST API)
項目 設定値例 内容
$SNAPSHOT_NAME "Snapshot-ip-inherit" 任意のスナップショット名を指定
$DESCRIPTION "SnapshotCDP" 必要に応じてスナップショットの詳細を指定
$VMVOL_ID (ボリュームID) スナップショットを取得する対象のシステムストレージのボリュームIDを指定
$FORCE "true" 対象のストレージが仮想サーバに接続されている場合、trueを指定
$SG_ID (セキュリティグループID) 作成するポートに付与するセキュリティグループIDを指定
  • 実行API
curl -Ss $BLOCKSTORAGE/v2/$PROJECT_ID/snapshots -X POST -H "Content-Type: application/json" -H "Accept: application/json" -H "X-Auth-Token: $OS_AUTH_TOKEN" -d '{"snapshot":{"name":"'$SNAPSHOT_NAME'", "description":"'$DESCRIPTION'","volume_id":"'$VMVOL_ID'","force":"'$FORCE'"}}' | jq .

(2) スナップショットの確認#

スナップショットが無事に作成されたことを確認します。
以下のAPI実行後に"status": "available"と出力されることを確認します。

  • 設定項目(REST API)
項目 設定値例 内容
$SNAP_ID (スナップショットID) 作成したスナップショットに対するスナップショットIDを指定
  • 実行API
curl -Ss $BLOCKSTORAGE/v2/$PROJECT_ID/snapshots/$SNAP_ID -X GET -H "X-Auth-Token: $OS_AUTH_TOKEN" | jq  

4. サーバの再作成#

本手順では、事前に作成したポートを使用して仮想サーバを再作成します。

(1) ポートの確認#

上記で作成したポートが利用可能であることを確認します。
以下のAPI実行後に"status": "DOWN"と出力されることを確認します。

  • 設定項目(REST API)
項目 設定値例 内容
$PORT_ID (ポートID) 作成したポートのポートIDを指定
  • 実行API
curl -Ss $NETWORK/v2.0/ports/$PORT_ID -X GET -H "X-Auth-Token: $OS_AUTH_TOKEN" -H "Content-Type: application/json" | jq .

(2) フレーバーIDの確認#

作成予定のサーバのフレーバーIDを確認し、控えてください。

curl -Ss $COMPUTE/v2/$PROJECT_ID/flavors/detail -X GET -H "X-Auth-Token: $OS_AUTH_TOKEN" | jq '.flavors[] | {"name": .name, "vcpus": .vcpus, "ram": .ram, "id": .id,}'

(3) サーバの作成#

仮想サーバを作成します。
作成するOSにより実行APIが異なりますので、必要に応じて以下の(A)または(B)を選択してください。

(A) サーバの作成(Linuxの場合)#

ポートを指定し、スナップショットを使用して仮想サーバを作成します。

  • 設定項目(REST API)
項目 設定値例 内容
$SERVER_NAME "demo_Linux_server" 任意のサーバ名を指定
$FLAVOR_ID (フレーバーID) 上記で確認したフレーバーIDを指定
$SNAP_ID (スナップショットID) 上記で作成したスナップショットのスナップショットIDを指定
$VOLUME_SIZE "30" 複製前の仮想サーバのシステムストレージと同じ容量のストレージ容量を指定 
$DEVICE_NAME "/dev/vda" システムストレージの場合、"/dev/vda"を指定
$SOURCE "snapshot" ブロックストレージのソースタイプを指定
$DESTINATION "volume" 仮想サーバの接続先をvolumeに指定
$ISDELETE "1" 仮想サーバと同時に作成されるシステムストレージを、仮想サーバ削除時に同時に削除するために1を指定
(仮想サーバと同時に作成されるシステムストレージを、仮想サーバ削除時に同時に削除しない場合には0を指定)
$KEY_NAME (キーペア名) 指定仮想サーバへのログインで利用するキーペア名を指定
$INSTANCE_MAX "1" 仮想サーバの最大数を指定
$INSTANCE_MIN "1" 仮想サーバの最小数を指定
$PORT_ID (ポートID) 仮想サーバにアタッチするポートを指定
  • 実行API
curl -Ss $COMPUTE/v2/$PROJECT_ID/servers -X POST -H "X-Auth-Token: $OS_AUTH_TOKEN" -H "Content-Type: application/json" -d '{"server": {"name": "'$SERVER_NAME'", "flavorRef": "'$FLAVOR_ID'", "block_device_mapping_v2":[ {"boot_index": "0", "uuid":"'$SNAP_ID'", "volume_size": "'$VOLUME_SIZE'", "device_name": "'$DEVICE_NAME'", "source_type": "'$SOURCE'", "destination_type": "'$DESTINATION'", "delete_on_termination": "'$ISDELETE'"} ] , "key_name": "'$KEY_NAME'", "max_count": "'$INSTANCE_MAX'", "min_count": "'$INSTANCE_MIN'", "networks": [{"port": "'$PORT_ID'"}] }}' | jq .
(B) サーバの作成 (Windowsの場合)#

ポートを指定し、スナップショットを使用して仮想サーバを作成します。

  • 設定項目(REST API)
項目 設定値例 内容
$SERVER_NAME "demo_Win_server" 任意のサーバ名を指定
$FLAVOR_ID (フレーバーID) 上記で確認したフレーバーIDを指定
$SNAP_ID (スナップショットID) 上記で作成したスナップショットのスナップショットIDを指定
$VOLUME_SIZE "80" 複製前の仮想サーバのシステムストレージと同じ容量のストレージ容量を指定 
$DEVICE_NAME "/dev/vda" システムストレージの場合、"/dev/vda"を指定
$SOURCE "snapshot" ブロックストレージのソースタイプを指定
$DESTINATION "volume" 仮想サーバの接続先をvolumeに指定
$ISDELETE "1" 仮想サーバと同時に作成されるシステムストレージを、仮想サーバ削除時に同時に削除するために1を指定
(仮想サーバと同時に作成されるシステムストレージを、仮想サーバ削除時に同時に削除しない場合には0を指定))
$INSTANCE_MAX "1" 仮想サーバの最大数を指定
$INSTANCE_MIN "1" 仮想サーバの最小数を指定
$PORT_ID (ポートID) 仮想サーバにアタッチするポートを指定
$ADMIN_PASS (任意のパスワードを入力) サーバの管理者パスワードを指定
  • 実行API
curl -Ss $COMPUTE/v2/$PROJECT_ID/servers -X POST -H "X-Auth-Token: $OS_AUTH_TOKEN" -H "Content-Type: application/json" -d '{"server": {"name": "'$SERVER_NAME'", "flavorRef": "'$FLAVOR_ID'", "block_device_mapping_v2":[ {"boot_index": "0", "uuid": "'$SNAP_ID'", "volume_size": "'$VOLUME_SIZE'", "source_type": "'$SOURCE'", "destination_type": "'$DESTINATION'", "delete_on_termination": "'$ISDELETE'"} ] , "max_count": "'$INSTANCE_MAX'", "min_count": "'$INSTANCE_MIN'", "networks": [{"port": "'$PORT_ID'"}], "metadata":{"admin_pass": "'$ADMIN_PASS'"} }}' | jq .

メリット・効果#

  • オペレーションミス等により、同一の仮想サーバを再作成する切り戻しを行う必要がある際にも、同一のプライベートIPアドレスを保持することが可能です。
    そのため、他のデバイス等へのネットワーク接続の影響を最小化することが可能です。

  • 本手順を応用することで、特定のプライベートIPアドレスを保持する仮想サーバを作成することが可能です。
    そのため、オンプレからの移行の際にも、オンプレ上の仮想サーバと同じプライベートIPアドレスを保持する仮想サーバをFJcloud-O上に構築することが可能となります。

注意事項#

  • 本パターンは2020年1月時点のFJcloud-O 東日本/西日本リージョン3で動作検証しています。
  • グローバルIPアドレスサービスでは、グローバルIPアドレス解放操作を行わない限り、同一のIPアドレスが再割り当て可能です。