usacloudを使ってさくらのクラウドでサーバを作ったりスペックを変更したりスイッチと接続したりする

# 概要

[さくらのクラウド用の公認CLIクライアント usacloud](https://github.com/sacloud/usacloud) を使って、
CLIからサーバを作成したり、作成したサーバのスペックを変更したり、スイッチと接続したりする。

# 準備

- usacloudのインストールは終わっていてAPIキーの設定も済んでいる
まだの人は [公式ドキュメントのこのページ](https://docs.usacloud.jp/usacloud/installation/start_guide/) を見て実施しておく

# 作りたいサーバの設定を記載したjsonのベースを生成する

公式のドキュメントを見ながら書いてもいいけど、
`usacloud server create --example` を実行すると
設定例を出力してくれるのでこれをベースにやっていく。

まず、 `usacloud server create --example >> global.json` を実行してファイルを生成しておく。

# インターネットにのみ接続されたサーバを作る

global.json を以下の感じに修正する。

```json
{
    "Zone": "is1b",
    "Name": "testme",
    "Tags": [
        "tag1",
        "tag2",
        "temp"
    ],
    "CPU": 1,
    "Memory": 1,
    "GPU": 0,
    "Commitment": "standard",
    "Generation": "default",
    "InterfaceDriver": "virtio",
    "BootAfterCreate": true,
    "NetworkInterfaces": [
        {
            "Upstream": "shared"
        }
    ],
    "Disks": [
        {
            "DiskPlan": "ssd",
            "SizeGB": 20,
            "OSType": "ubuntu2004",
            "EditDisk": {
                "HostName": "testme",
                "Password": "superhimitsustring"
            }
        }
    ],
    "NoWait": false
}
```

以下のコマンドを実行してサーバを作る。

```shell
usacloud server create -y --parameters global.json
# 以下実行結果
[is1b] server/create: started...
        [is1b] server/create: 10s elapsed
        [is1b] server/create: 20s elapsed
        (後略)
```

コントロールパネルを見ると以下の感じでサーバが作られている。(画像は割愛しているがディスクも作られている。)
![server1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86853/050fb6ba-9b84-aeab-8411-5e606d24fd86.png)

## 作成したサーバを確認する

方法は幾通りかあるけれども、とりあえずここでは2通りのやりかたを記載する。

- 既存のサーバもまとめて一覧で表示する

```shell
usacloud server ls
# 以下実行結果
+------+--------------+---------------------+------------------+-----+--------+-----+--------------------+----------------+----------------+----------------+
| Zone |      ID      |        Name         |       Tags       | CPU | Memory | GPU |     IPAddress      | Upstream(Mbps) | InstanceStatus |  InstanceHost  |
+------+--------------+---------------------+------------------+-----+--------+-----+--------------------+----------------+----------------+----------------+
| is1b | 119999250561 | myvpn               | -                | 1   | 1      | 0   | 999.999.999.999/24  | shared/100     | up             | sac-is1b-sv453 |
| is1b | 188209999113 | golang_django_train | -                | 1   | 1      | 0   | 192.168.1.14/24    | switch/1000    | down           | -              |
| is1b | 999900463618 | container01         | -                | 1   | 2      | 0   | 192.168.1.10/24    | switch/1000    | up             | sac-is1b-sv722 |
| is1b | 999900584997 | temp_usacloud       | -                | 1   | 1      | 0   | 999.999.999.998/24  | shared/100     | up             | sac-is1b-sv499 |
| is1b | 999900815646 | testme              | [tag1 tag2 temp] | 1   | 2      | 0   | 777.777.777.777/24 | shared/100     | up             | sac-is1b-sv541 |
+------+--------------+---------------------+------------------+-----+--------+-----+--------------------+----------------+----------------+----------------+
```

- 名前で絞り込む

```shell
usacloud server read testme
# 以下実行結果
+------+--------------+--------+------------------+-----+--------+-----+--------------------+----------------+----------------+----------------+
| Zone |      ID      |  Name  |       Tags       | CPU | Memory | GPU |     IPAddress      | Upstream(Mbps) | InstanceStatus |  InstanceHost  |
+------+--------------+--------+------------------+-----+--------+-----+--------------------+----------------+----------------+----------------+
| is1b | 999900815646 | testme | [tag1 tag2 temp] | 1   | 2      | 0   | 777.777.777.777/24 | shared/100     | up             | sac-is1b-sv541 |
+------+--------------+--------+------------------+-----+--------+-----+--------------------+----------------+----------------+----------------+
``` 


ちなみにどちらの方法でも `--output-type json` をつけるとjsonの形で出力してくれる。

## スペックをアップしてみる

以下のコマンドを実行するとサーバのシャットダウンとスペックアップとサーバの起動が行われる。

```shell
# testme の部分はサーバのIDやコントロールパネル上の名前、tagでもOK
usacloud server update --memory 2 testme 
```

コントロールパネルからだとサーバをシャットダウンして、スペックを変更して、サーバを起動してと
それぞれ操作しないといけないけどusacloudを使うとひとまとめで実行してくれるので便利。

## 作ったサーバを削除する

削除しよう。削除する場合はシャットダウンしてから削除するというプロセスが必要。
以下の2つのコマンドを実行する。

```shell
usacloud server shutdown -y testme 
usacloud server delete -y --with-disks testme
```
delete 実行時に--with-disksをつけないとディスクは削除されないので注意。

# スイッチに接続するサーバを作成する

まずはスイッチを作成してそのIDを控える。

```shell
usacloud switch create -y --name testme_sw
# 以下実行結果
------+--------------+-----------+------+-------------+--------+
| Zone |      ID      |   Name    | Tags | Description |  Type  |
+------+--------------+-----------+------+-------------+--------+
| is1b | 999900818888 | testme_sw | -    | -           | switch |
+------+--------------+-----------+------+-------------+--------+
```

実行結果から作成したスイッチのIDは *999900818888* だと確認できる。

global.jsonを以下のように編集してlocal.jsonとして保存する。

```json
{
    "Zone": "is1b",
    "Name": "testme",
    "Tags": [
        "tag1",
        "tag2",
        "temp"
    ],
    "CPU": 1,
    "Memory": 1,
    "GPU": 0,
    "Commitment": "standard",
    "Generation": "default",
    "InterfaceDriver": "virtio",
    "BootAfterCreate": true,
    "NetworkInterfaces": [
        {
            "Upstream": "999900818888",
            "UserIPAddress": "192.168.1.99"
        }
    ],
    "Disks": [
        {
            "DiskPlan": "ssd",
            "SizeGB": 20,
            "OSType": "ubuntu2004",
            "EditDisk": {
                "HostName": "testme",
                "Password": "superstring",
                "EnableDHCP": false,
                "IPAddress": "192.168.1.99",
                "NetworkMaskLen": 24,
                "DefaultRoute": "192.168.1.254"
            }
        }
    ],
    "NoWait": false
}
```

変更している部分は

 - NetworkInterfaces で接続するスイッチのIDを指定している。
 IPアドレスはサーバの設定ではなくコントロールパネルに表示されるIPの設定値
 - EditDisk

の部分。

続いて以下のコマンドを実行してサーバを作成する。

```shell
usacloud server create -y --parameters local.json 
```

処理が完了した後にコントロールパネルのマップを見ると
以下の様にサーバが作成されてスイッチに接続されていることが分かる。

![local1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86853/9a86ae0f-049a-039b-695a-7ceb1437a547.png)

リモートコンソールでサーバの設定を確認すると以下のように設定されていることが確認できる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86853/701b0b71-395e-f887-e65b-e19ef44dd23b.png)

以下のコマンドを実行してサーバとディスクは削除する。

```shell
usacloud server shutdown -y testme
usacloud server delete --with-disks -y testme 
```

# インターネットとスイッチの両方に接続するサーバを作成する

global.jsonを以下のように編集してlocalAndGlobal.jsonとして保存する。

```json
{
    "Zone": "is1b",
    "Name": "testme",
    "Tags": [
        "tag1",
        "tag2",
        "temp"
    ],
    "CPU": 1,
    "Memory": 1,
    "GPU": 0,
    "Commitment": "standard",
    "Generation": "default",
    "InterfaceDriver": "virtio",
    "BootAfterCreate": true,
    "NetworkInterfaces": [
        {
            "Upstream": "shared"
        },
        {
            "Upstream": "999900818888",
            "UserIPAddress": "192.168.1.99"
        }
    ],
    "Disks": [
        {
            "DiskPlan": "ssd",
            "SizeGB": 20,
            "OSType": "ubuntu2004",
            "EditDisk": {
                "HostName": "testme",
                "Password": "himitsuhimitsu"
            }
        }
    ],
    "NoWait": false
}
```

変更している部分は

 - NetworkInterfaces でUpstreamの記述が2つある

の部分。

以下のコマンドを実行してサーバを作成する。

```shell
usacloud server create -y --parameters localAndGlobal.json 
```

処理が完了した後にコントロールパネルのマップを見ると
インターネットとスイッチのそれぞれに接続されている事が分かる。
![loAndglo1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86853/7ea316a5-506e-2655-0b03-b8df56d36be0.png)

が、スイッチに接続されコントロールパネル上ではローカルのIPアドレスも表示されているが、
あくまでコントロールパネルの表示のみで、サーバにはIPアドレスの設定はされていない状態になっている。
jsonのDisksの部分でIPアドレスを指定したとしても反映されないため、サーバへの設定は別途手立てが必要。
一方で、グローバルのIPはサーバにちゃんと設定されている。

最後に以下のコマンドでスイッチとサーバとディスクを削除する。

```shell
usacloud server shutdown -y testme
usacloud server delete --with-disks -y testme
usacloud switch delete -y testme_sw
```

おわり