同一IPアドレスによるサーバ複製#
本構成はFJcloud-O 東日本/西日本リージョン3向けとなります。
要求事項#
- スナップショットを使用して仮想サーバを複製する際に、同一のプライベートIPアドレスを使用したい
対応するデザインパターン概要#
スナップショット/複製パターン の通りに仮想サーバの複製を行うと、通常は複製後のサーバと複製前のサーバではそれぞれ異なるプライベートIPアドレスが付与されます。
本パターンでは、複製後の仮想サーバに、複製前と同一のプライベートIPアドレスを保持させる手順を掲載します。
構造 (イメージ図)#
実装サンプル#
1. 事前準備#
複製を行う仮想サーバがWindows OSの場合、Sysprepを実施してください。
Sysprepの詳細は機能説明書を参照してください。
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 | "40" | 複製前の仮想サーバのシステムストレージと同じ容量のストレージ容量を指定 |
$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アドレスが再割り当て可能です。