またまた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 エラーが発生しているようです。
C#
こちらのブログを参考に、C# での確認も行いました。
こちらも、ws://echo.websocket.org/ や wss://echo.websocket.org/ は問題なく接続できました。
違うネットワークから接続してもだめでした。
サポートに問い合わせてみた
困ったので、ConoHa のサポートに問い合わせてみました。
回答は「APIで接続用URL取得後の動作については案内が困難」とのことでした。
クライアントの問題や利用者の回線の問題も考えられるため、そこまではサポートできないというのも納得できます。
今回は、こうしてブログに書くことによって、誰かの参考になればと思います。
おわりに
現在友達の紹介キャンペーンを実施しており、こちらのリンクから ConoHa に登録していただくと、1000円分のクーポンがもらえますので是非登録し、試してみてください。