Server API チュートリアル
このチュートリアルでは、cloud-init 対応パブリックアーカイブから Server を作成し、共有セグメントへ接続して SSH ログインします。server create の個別オプションでディスクと NIC を指定し、cloud-init の user-data は起動時に server boot へ渡します。秘密鍵はローカルで生成し、API へ送信しません。
この手順では is1b を使用します。アーカイブ ID、ディスクプラン ID、ディスクサイズは、作成前に同じゾーンの検索結果から取得します。
前提条件
skrと SSH クライアントが利用できること- さくらのクラウドの認証設定と、is1b で Server・Disk を作成できるプロジェクトを選択していること
- is1b で Archive・DiskPlan を検索・参照できること
- Server の作成、起動、外部 SSH 接続および削除が許可されていること
Server と Disk の利用料金が発生します。共有セグメントへ接続した Server は外部から SSH 接続できるため、公開鍵認証を設定し、不要になったら削除してください。
コマンドを確認する
$ skr iaas-api archive find --help
$ skr iaas-api archive read --help
$ skr iaas-api product disk find --help
$ skr iaas-api product disk read --help
$ skr iaas-api server create --help
$ skr iaas-api server boot --help
$ skr iaas-api server read --help
$ skr iaas-api server delete --help
$ skr iaas-api server find --help
$ skr iaas-api disk find --help
アーカイブとディスクプランを選ぶ
--query で検索結果を絞り込み、必要な ID をそのままシェル変数に取り込みます。アーカイブは Ubuntu の cloudimg に絞り込み、ID が最大 (最新) のものを選びます。通常の OS アーカイブではなく、cloud-init 対応パブリックアーカイブ(cloudimg)を選んでください。
$ CLOUDIMG_ARCHIVE_ID=$(skr iaas-api archive find --zone is1b \
--query 'map(select(.Name | test("Ubuntu") and test("cloudimg"))) | sort_by(-.ID) | .[0].ID')
$ echo "$CLOUDIMG_ARCHIVE_ID"
$ skr iaas-api archive read --zone is1b --id "$CLOUDIMG_ARCHIVE_ID" \
--query '{ID,Name,Description,DiskPlanName,SizeMB}'
続いてディスクプランです。SSDプランに絞り込み、ID が最小のものを選びます。ディスクプランや作成先のゾーンによって選択可能なサイズは異なります。
$ DISK_PLAN_ID=$(skr iaas-api product disk find --zone is1b \
--query '.DiskPlans | map(select(.Name | test("SSD"))) | sort_by(.ID) | .[0].ID')
$ DISK_SIZE_GB=$(skr iaas-api product disk read --zone is1b --id "$DISK_PLAN_ID" \
--query '[.Size[] | select(.Availability == "available" and .DisplaySuffix == "GB") | .DisplaySize] | .[0]')
$ echo "$DISK_PLAN_ID, $DISK_SIZE_GB"
DISK_SIZE_GB は、プラン内で利用可能な GB 単位のサイズのうちもっとも小さい値です。--disk に指定するディスクのサイズはアーカイブのサイズ以上が必要です。より大きいサイズが必要な場合は、skr iaas-api product disk read の結果から選び直してください。検索条件の指定方法は Archive API チュートリアルを、各フィールドの説明は DiskPlan API チュートリアルを参照してください。
ここまでの操作は検索・参照のみで、クラウドリソースを変更しません。
SSH 鍵を作成する
作業用ディレクトリを作成し、その中に鍵を生成します。秘密鍵はローカルに保管し、コマンドの引数や API リクエストに含めません。
$ umask 077
$ WORK_DIR=$(mktemp -d)
$ KEY_PATH="$WORK_DIR/server-tutorial-key"
$ USER_DATA_PATH="$WORK_DIR/server-c0nfig.yaml"
$ ssh-keygen -t rsa -b 3072 -N '' -f "$KEY_PATH"
cloud-init の user-data を作成する
公開鍵を cloud-config に設定します。次のコマンドは公開鍵だけをファイルへ書き込みます。
$ cat > "$USER_DATA_PATH" <<EOF
#cloud-config
users:
- default
- name: skr-tutorial
shell: /bin/bash
ssh_authorized_keys:
- $(cat "$KEY_PATH.pub")
EOF
Server を作成して起動する
Server 名には重複しない値を指定します。CLOUDIMG_ARCHIVE_ID、DISK_PLAN_ID、DISK_SIZE_GB には、前の手順で取得した値が設定されています。
--disk の plan-id と size-gb は必須です。archive-id を省略すると空のディスクを作成します。--disk と --nic は繰り返して指定でき、それぞれ指定順に接続します。upstream=shared は先頭の NIC にだけ指定できます。この手順ではディスクと共有 NIC を1個ずつ指定します。--request とは併用できません。
--nic "upstream=$SWITCH_ID" で、正の整数の ID を持つスイッチへの接続も指定できます。ルータ+スイッチに接続し、ゲスト OS の IP アドレスを設定して SSH 接続する手順は Internet API チュートリアルを参照してください。
$ SERVER_NAME="skr-tutorial-cloudinit-$(date +%s)"
$ skr iaas-api server create \
--zone is1b \
--name "$SERVER_NAME" \
--cpu 1 \
--memory-gb 1 \
--disk "archive-id=$CLOUDIMG_ARCHIVE_ID,plan-id=$DISK_PLAN_ID,size-gb=$DISK_SIZE_GB" \
--nic 'upstream=shared'
作成結果の Server ID を控え、SERVER_ID に設定します。cloud-init の user-data を適用するため、作成時には Server を起動せず、次の boot 操作で起動します。
--user-data 自体は任意ですが、この手順では SSH 公開鍵とユーザーを設定するために指定します。user-data が不要な通常の起動では省略できます。指定する場合は @path または - を使い、内容を直接引数に渡さないでください。
$ SERVER_ID=SERVER_ID
$ skr iaas-api server boot \
--zone is1b \
--id "$SERVER_ID" \
--user-data "@$USER_DATA_PATH"
Server の状態と NIC の IP アドレスを確認します。Interfaces の共有セグメントに割り当てられた IPAddress を PUBLIC_IP に設定してください。
$ skr iaas-api server read --zone is1b --id "$SERVER_ID" \
--query '{ID, Name, InstanceStatus, Interfaces}'
$ PUBLIC_IP=PUBLIC_IP
InstanceStatus が起動状態になり、IP アドレスが割り当てられるまで待ってから SSH 接続します。初回接続では表示されるホスト鍵の指紋を確認してください。
$ ssh -i "$KEY_PATH" \
-o IdentitiesOnly=yes \
"skr-tutorial@$PUBLIC_IP"
ログインできたら、次のコマンドで Server のホスト名を確認します。
$ hostname
Server と Disk を削除する
SSH セッションで exit を実行し、削除前に Server ID と名前を確認します。--with-disks は接続中の Disk も削除します。対象がこの手順で作成した Server であることを必ず確認してください。
$ skr iaas-api server read --zone is1b --id "$SERVER_ID" \
--query '{ID, Name, InstanceStatus}'
$ skr iaas-api server delete \
--zone is1b \
--id "$SERVER_ID" \
--with-disks \
--force \
--fail-if-not-found
Server が残っていないことを ID と名前で確認します。出力が空の配列なら該当する Server はありません。
$ skr iaas-api server find --zone is1b \
--query "map(select((.ID | tostring) == \"$SERVER_ID\" or .Name == \"$SERVER_NAME\") | {ID, Name})"
[]
続いて Server と同名の Disk が残っていないことを確認します。出力が空の配列なら該当する Disk はありません。
$ skr iaas-api disk find --zone is1b \
--query "map(select(.Name == \"$SERVER_NAME\") | {ID, Name})"
[]
ローカルの鍵と user-data も不要になったら削除してください。秘密鍵を失うと同じ鍵では再接続できません。必要なデータを退避してから削除します。
$ rm "$KEY_PATH" "$KEY_PATH.pub" "$USER_DATA_PATH"
$ rmdir "$WORK_DIR"