イメージの転送(東日本リージョン3/西日本リージョン3)

移行元仮想環境から採取したイメージは、オブジェクトストレージサービスを経由してIaaSイメージとして登録します。

始める前に

  • 転送対象となるイメージは、仮想マシンのイメージファイルです。

    ヒント: VMWareの場合はvmdkファイルになります。
  • イメージファイル名は、以下のように設定してください。

    <任意の文字列>.vmdk

このタスクについて

オブジェクトストレージへのアップロードには、curlコマンドを使用します。例として、移行元仮想環境がCentOS 6.6の場合のアップロード手順を以下に示します。

手順

  1. トークンの取得
    トークンを取得するためには、利用者管理サービスのAPI(POST /v3/auth/tokens)を実行します。詳細はAPIリファレンスを参照してください。
  2. 変数を定義

    移行元仮想環境に以下の変数を定義します。

    # TOKEN=<取得したトークン>
    # PROJECT_ID=<アップロード先のプロジェクトID>
    # CONTAINER=<アップロード先のコンテナ名>
    # OBJECT=<アップロード先でのイメージファイル名>
    # FILE_PATH=<移行元仮想環境のイメージファイルの絶対パスまたは相対パス>
  3. イメージファイルのアップロード

    以下のコマンドを実行します。

    # curl -i -H "X-Auth-Token: ${TOKEN}" ${OBJECTSTRAGE_EP}/v2/AUTH_${PROJECT_ID}/${CONTAINER}/${OBJECT} -X PUT -T ${FILE_PATH}

タスクの結果

仮想サーバイメージインポート機能を参照し、アップロードしたイメージファイルを仮想サーバのイメージとして登録します。

ヒント: イメージファイルが破損していないかチェックする場合、イメージ登録APIのchecksumパラメーターを利用してください。
ヒント:

上記手順(トークンの取得、イメージファイルのアップロード)および、イメージファイルの登録までを実行するシェルスクリプトの実行サンプルを以下に示します。

アカウント情報などはお客様環境に合わせて変更してください。

実行サンプル

#!/bin/bash

##### お客様のご利用環境に応じて以下の情報を変更してください。
PROJECT_ID=00000000000000000000000000000000 # プロジェクトID
DOMAIN=testdomain1                          # ドメイン名
USER=testuser1                              # ユーザ名
PASSWORD=********                           # パスワード

NAME=CentOS7.2                              # VMイメージ名
OS_TYPE=centos                              # 移行元VMイメージのOS種別
OBJECT=CentOS7.2_en_2018xxxx-disk1.vmdk     # 移行元VMイメージファイル名
FILE_PATH=/home/vmimport/image/${OBJECT}    # 移行元VMイメージファイルパス
CONTAINER=upload_dir                        # 移行元VMイメージファイルアップロードディレクトリ名
#####

IDENTITY_EP=https://identity.jp-west-3.cloud.global.fujitsu.com
OBJECTSTORAGE_EP=https://objectstorage.jp-west-3.cloud.global.fujitsu.com
IMAGE_IMPORT_EP=https://import-export.jp-west-3.cloud.global.fujitsu.com

# トークン取得
TOKEN=`curl -ikSs -X POST -H "Content-Type: application/json" -H "Accept: application/json" ${IDENTITY_EP}/v3/auth/tokens -d '{"auth":{"identity":{"methods":["password"],"password":{"user":{"domain":{"name":"'${DOMAIN}'"},"name":"'${USER}'","password":"'${PASSWORD}'"}}}, "scope":{"project":{"id":"'${PROJECT_ID}'"}}}}' | awk '/X-Subject-Token/{print $2}' | tr -d "\r"`

# イメージアップロード
echo "=== upload image start ==="
curl -Ss -X PUT -H "Content-Type: application/octet-stream" -H "X-Auth-Token: ${TOKEN}" ${OBJECTSTORAGE_EP}/v2/AUTH_${PROJECT_ID}/${CONTAINER}/${OBJECT} -T ${FILE_PATH}
echo "=== upload image end ==="

# イメージ登録
echo "=== import image start ==="
CONVERSION=true
LOCATION=/v1/AUTH_${PROJECT_ID}/${CONTAINER}/${OBJECT}
RESPONSE=`curl -Ss -X POST -H "Content-Type: application/json" -H "X-Auth-Token: ${TOKEN}" ${IMAGE_IMPORT_EP}/v1/imageimport -d '{"name": "'${NAME}'", "location": "'${LOCATION}'", "conversion": '${CONVERSION}', "os_type": "'${OS_TYPE}'"}'`
echo ${RESPONSE}
IMPORT_ID=`echo ${RESPONSE} | jq -r .import_id`

STATUS=queued
while :
do
  TOKEN=`curl -ikSs -X POST -H "Content-Type: application/json" -H "Accept: application/json" ${IDENTITY_EP}/v3/auth/tokens -d '{"auth":{"identity":{"methods":["password"],"password":{"user":{"domain":{"name":"'${DOMAIN}'"},"name":"'${USER}'","password":"'${PASSWORD}'"}}}, "scope":{"project":{"id":"'${PROJECT_ID}'"}}}}' | awk '/X-Subject-Token/{print $2}' | tr -d "\r"`

  RESPONSE=`curl -Ss -X GET -H "Content-Type: application/json" -H "X-Auth-Token: ${TOKEN}" ${IMAGE_IMPORT_EP}/v1/imageimport/${IMPORT_ID}/status`
  STATUS=`echo ${RESPONSE} | jq -r .import_status`
  if [ -n "${STATUS}" ]; then
    if [ "${STATUS}" = "processing" -o "${STATUS}" = "queued" ]; then
      printf "%s" "#"
      sleep 600s
    else
      echo
      break;
    fi
  else
    break;
  fi
done
echo "=== import image end ==="
if [ -z "${STATUS}" -o ${STATUS} = "failed" ]; then
  echo ${RESPONSE}
  echo ${RESPONSE} | jq -r .message
  exit 1
fi
exit 0