【さくらのクラウドAPI】curlでサーバーの起動・再起動・停止してみた

## 概要

curlでさくらのクラウドAPIを叩いて作成済みのサーバーの起動・再起動・停止をしたくなったので記事に起こします。

### できるようになること

- curlでさくらのクラウドAPIを叩き、作成済みの起動状態の確認、およびサーバの起動・再起動・停止ができる

### 必要なもの

1. **curlが実行できるターミナル**
  - Windows, Mac, LinuxどのOSでもだいたい実行できると思います。できない場合は環境を用意してください。
1. **アクセストークン、アクセストークンシークレット**
  - さくらのクラウドホームからAPIキーを作成し、上記の2つを控えておいてください。後ほど使用します。
  - なお、作成APIキーを作成する際はアクセスレベルを`電源操作 or 設定編集 or 作成・削除`に変更してください。この変更がないとアクセスできないです。
  - 詳しい作成方法は下のリンクから 

https://manual.sakura.ad.jp/cloud/api/apikey.html

## curlサンプルコマンド

今回は私が使用している`石狩第1（is1a）`のサーバーに対してコマンドを実行します。
`アクセストークン`、`アクセスシークレットキー`、`serverid`についてはご自身のものに置き換えてください。
すべて公式のサンプルを引用しているので詳細は公式ドキュメントを参照してください。

## 起動状態を取得 `GET /server/:serverid/power`

電源操作をする前に状態を把握することはとても大切です。
間違えて起動や停止するとサービスに大きな影響を与える可能性があるので。
コンパネから状態を確認できていれば問題ないと思いますが、そうでなければこちらを実行をおすすめします。

https://developer.sakura.ad.jp/cloud/api/1.1/server/#get_server_serverid_power

```terminal
# サーバーの起動状態を取得
curl --user "Access Token":"Access Token Secret"\
    https://secure.sakura.ad.jp/cloud/zone/is1a/api/cloud/1.1/server/:serverid/power
```

### 実行結果

これは私のリソースですが`Instance.Status`が`down`になっているので停止していることが確認できました。
他にも`down`になる前は`cleaning`（`down`の前に必ずなる状態）になっていたことや、その変更日時も確認できます。

```json
{
    "Instance": {
        "Server": {
            "ID": "113301645700"
        },
        "Status": "down",
        "BeforeStatus": "cleaning",
        "Warnings": "none",
        "WarningsValue": 0,
        "StatusChangedAt": "2021-09-13T13:30:14+09:00",
        "MigrationProgress": null,
        "MigrationSchedule": null,
        "MigrationAllowed": null,
        "ModifiedAt": "2021-09-13T13:30:14+09:00",
        "Host": null,
        "CDROM": null
    },
    "is_ok": true
}
```

## 起動 `PUT /server/:serverid/power`

停止状態のサーバーを起動するコマンドです。停止の状態でコマンドを実行してください。

https://developer.sakura.ad.jp/cloud/api/1.1/server/#put_server_serverid_power

```terminal
# サーバ起動のリクエストサンプル
curl --user "Access Token":"Access Token Secret" -X PUT -d '' \
     https://secure.sakura.ad.jp/cloud/zone/is1a/api/cloud/1.1/server/:serverid/power
```

### 実行結果

```json
{"Success":true,"is_ok":true}
```

当然ですが、起動後にもう一度このコマンドを叩くと`409 Conflict`のエラーになります。

```json
{
    "is_fatal": true,
    "serial": "91c28d78a832f33f6ab2b6d5b51f0f37",
    "status": "409 Conflict",
    "error_code": "conflict",
    "error_msg": "要求された操作を行えません。現在の対象の状態では、この操作を受け付けできません。"
}
```

## 再起動（強制リブート） `PUT /server/:serverid/reset`

実際のコントロールパネルでは再起動という文字は無く、強制リブートという文字になっています。
なのでWindowsやMac、LinuxなどのGUIから行う再起動ではなく、ハードウェアのリセットボタンをポチッと押す感じのものですね。

![reboot0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/901444/234eec94-8ba1-dad4-7314-a91cbbe4c291.png)

安全に行いたい方はOSにログインしてから`reboot`や再起動ボタンをGUIから操作するのが良さそうです。
なんでもいいからAPIから再起動させたい人はこれでおｋです。

https://developer.sakura.ad.jp/cloud/api/1.1/server/#put_server_serverid_reset

```terminal
# サーバ再起動のリクエストサンプル
curl --user "Access Token":"Access Token Secret" -X PUT -d '' \
     https://secure.sakura.ad.jp/cloud/zone/is1a/api/cloud/1.1/server/:serverid/reset
```

### 実行結果

```json
{"Success":true,"is_ok":true}
```

### コンパネでの挙動

コントロールパネルで表示を更新を連打して確認していると`cleaning → down`、`down → up`の流れで再起動していました。
これも実際のハードウェアと同様の挙動ですね。

- `cleaning → down` スクリーンショット
![reboot1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/901444/6fbac87d-0d06-72b5-c604-fcec8adffc7d.png)

- `down → up` スクリーンショット
![reboot2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/901444/be931de1-b451-656d-fdeb-76270b73bbd5.png)

## 停止（シャットダウン） `DELETE /server/:serverid/power`

このコマンドはOSのシャットダウンと同じ挙動で、OS内からシャットダウンを実行したものと同じでした。
正常にシャットダウンさせたい場合はこのコマンドを叩くとよさそうですね。

https://developer.sakura.ad.jp/cloud/api/1.1/server/#delete_server_serverid_power

```terminal
# シャットダウン
curl --user "Access Token":"Access Token Secret" -X DELETE -d '' \
    https://secure.sakura.ad.jp/cloud/zone/is1a/api/cloud/1.1/server/:serverid/power
```

### 実行結果

```json
{"Success":true,"is_ok":true}
```

これもサーバー同様に起動しているものに実行してください。でないとエラーになります。

```json
{
    "is_fatal": true,
    "serial": "ea3cb6eb1ff1b10bf15258c5a526993d",
    "status": "409 Conflict",
    "error_code": "conflict",
    "error_msg": "要求された操作を行えません。現在の対象の状態では、この操作を受け付けできません。"
}
```

## 停止（強制停止） `DELETE /server/:serverid/power`

コンパネ上には強制停止というボタンがあり、このAPIを実行しているみたいです。
実際のハードウェアに例えると電源長押しって感じですかね。どうしてもサーバーが落ちないときに実行しましょう。

https://developer.sakura.ad.jp/cloud/api/1.1/server/#delete_server_serverid_power

```terminal
# 強制停止
curl --user "Access Token":"Access Token Secret" -X DELETE -d '{Force:true}' \
    https://secure.sakura.ad.jp/cloud/zone/is1a/api/cloud/1.1/server/:serverid/power
```

### 実行結果

```json
{"Success":true,"is_ok":true}
```

強制停止の場合は電源が停止の状態で実行しても上記と同じ成功のレスポンスが返ってきました。

## まとめ

これでcurlからサーバーの起動状態を操作できるようになったと思います。
curlで実行するのはそこまで実用性高くはないと思いますので、挙動の確認とかで参考になれば幸いです。