またまたMacbook が欲しいために「ConoHa」の API に関する記事を公開します。
タイトルにもありますが、今回は上手くいかなかった例を紹介します。
どなたか詳しい方がいらっしゃれば、アドバイスをいただけると嬉しいです。
挑戦したいこと
先日更新した記事で、ConoHa には noVNC コンソールと HTTP のシリアルコンソールがあると紹介しました。
API ドキュメントにはあるものの紹介していないコンソールがありました。
WebSocket については Wikipedia にもありますが、サーバーとクライアントを常時接続するようなプロトコルで、プロキシサーバーが必要な環境でも接続できるのが特徴です。
WebSocket 接続用 URL の取得
前回紹介した PowerShell のスクリプトの
{"os-getVNCConsole":{"type": "novnc"}}
を
{"os-getSerialConsole":{"type": "serial"}}
に書き換えるだけです。
$apiUser = "APIユーザー名"
$apiPassword = "APIパスワード"
$tenantId = "テナントID"
$identityServiceUrl = "https://identity.tyo1.conoha.io/v2.0"
$computeService = "https://compute.tyo1.conoha.io/v2"
$uuid = "VPS設定-UUID"
# 有効な期間のトークンがあれば
$token = ""
# トークンの取得
function getToken([string] $tenantId, [string] $apiUser, [string] $apiPassword, [string] $authurl){
$body = '{"auth":{"passwordCredentials":{"username":"' + $apiUser + '","password":"'+$apiPassword+'"},"tenantId":"'+$tenantId+'"}}'
$url = $identityServiceUrl+"/tokens"
$result = Invoke-RestMethod $url -Method POST -Body $body
return $result
}
# コンソールの URL 取得
function getWebSocketConsole([string] $tenantId, [string] $uuid, [Hashtable] $tokenHeader, [string] $computeService){
$body = '{"os-getSerialConsole":{"type": "serial"}}'
$url = $computeService + "/" + $tenantId + "/servers/" + $uuid + "/action"
$result = Invoke-RestMethod $url -Method POST -Body $body -Headers $tokenHeader
return $result.console.url
}
# 処理
if ($token -eq "") {
$mytokens = getToken $tenantId $apiUser $apiPassword $identityServiceUrl
$token = $mytokens.access.token
}
$tokenHeader = @{"X-Auth-Token" = $token}
$url = getWebSocketConsole $tenantId $uuid $tokenHeader $computeService
# URL 表示
Write-Output $url
成功するとこのような wss で始まる WebSocket の URL が得られます。
wss://console.tyo1.conoha.io/?token=○○
WebSocket クライアントからの接続
とりあえず WebSocket の接続サンプルを使うことにしました。
JavaScript
WebSocket の公式サイトにテストがあったので試してみました。
WebSocket の URL を入力して接続しても、ERROR:undefined と表示されてしまいました。
Creating your own test を自分で書き換えても同様のエラーが発生しました。
テストサーバーである、
ws://echo.websocket.org/
wss://echo.websocket.org/
は問題なく接続できるので、回線が WebSocket を制限しているわけでもなさそうです。
ブラウザの開発者ツールで確認してみると、502 Bad Gateway エラーが発生しているようです。
![[H27.07.17]ConoHa WebSocket 502](https://blog.oyasu.info/wp-content/uploads/H27.07.17ConoHa-WebSocket-502-300x151.png)
C#
こちらのブログを参考に、C# での確認も行いました。
こちらも、ws://echo.websocket.org/ や wss://echo.websocket.org/ は問題なく接続できました。
違うネットワークから接続してもだめでした。
サポートに問い合わせてみた
困ったので、ConoHa のサポートに問い合わせてみました。
回答は「APIで接続用URL取得後の動作については案内が困難」とのことでした。
クライアントの問題や利用者の回線の問題も考えられるため、そこまではサポートできないというのも納得できます。
今回は、こうしてブログに書くことによって、誰かの参考になればと思います。
おわりに
現在友達の紹介キャンペーンを実施しており、こちらのリンクから ConoHa に登録していただくと、1000円分のクーポンがもらえますので是非登録し、試してみてください。