ConoHaのオブジェクトストレージをPowerShell(+C#)で使ってみた ~その1・認証編


9月3日、GMOインターネットのConoHaからオブジェクトストレージがリリースされたので、さっそく登録してみました。

はじめに

※オブジェクトストレージは初めて使い、PowerShellのスクリプトも初めて使用するため、詳しい人にとっては物足りない記事だと思います。
※基盤ソフトウェアとしてOpenStack Swiftを使用しているとのことですので、同じソフトウェアなら応用できる可能性もありますが未確認です。

まず、公式サイトでの概要や説明のページを紹介します。

上級者はもちろん、右上の言語をJapaneseからConoHaに変えてログイン。
https://www.conoha.jp/conoha からアクセスすると変更の手間がかかりません。
conohatop

実際に操作してみた

今回は、「オブジェクトストレージ操作例:cURL」を参考に、Windowsでも利用できるPowerShellやC#での操作を紹介します。
本当はファイルのオブジェクトのアップロードやダウンロードまで行いたいと思いましたが、少し手間取ったので今回はAPI認証までを紹介します。

公式サイトにはcURLの操作例として、以下のコマンドが紹介されています。

curl -i '{API Auth URL}/tokens' -X POST -H "Content-Type: application/json" -H "Accept: application/json"  -d '{"auth": {"tenantName": "{テナント名}", "passwordCredentials": {"username": "{APIユーザー名}", "password": "{パスワード}"}}}'


(2014/09/08)操作例が更新され、下の書き換え後のような{}がない表記になりました。

curl -i 'https://********.jp/v2.0/tokens' -X POST -H "Content-Type: application/json" -H "Accept: application/json"  -d '{"auth": {"tenantName": "1234567", "passwordCredentials": {"username": "1234567", "password": "************"}}}'


これを書き換えたのですが、まずは上記のコードにおいてPOSTするデータをわかりやすく改行して紹介します。

{
  "auth": 
  {
    "tenantName": "{テナント名}",
    "passwordCredentials":
    {
      "username": "{APIユーザー名}",
      "password": "{パスワード}"
    }
  }
}

ですが、この通りに実装すると401エラーによる認証失敗が続いたため、以下の通り書き換えると問題なく動作しました。

{
  "auth": 
  {
    "tenantName": "テナント名",
    "passwordCredentials":
    {
      "username": "APIユーザー名",
      "password": "パスワード"
    }
  }
}

これがわかるまでいろいろなところを書き換えていたため、今回の記事がAPI認証までとなってしまいました。
操作例の通りcURLで実行すると問題なく処理できるのかもしれませんが、未確認です。

今回はとりあえずトークンの取得までです。
PowerShellとC#の例を紹介しますが、どちらも表示されるコードからtokenのidを取得することでトークンが得られます。

PowerShellでのソースコード

$authurl = "API Auth URL"
$tenantname = "テナント名"
$username =  "ユーザー名"
$password = "パスワード"
# API認証をおこないトークンを取得します
$req = [Net.HttpWebRequest]::Create($authurl + "/tokens")
$req.Method = "POST"
$req.ContentType="application/json";
$req.Accept = "application/json";
$datastr = "{""auth"": {""tenantName"": """ + $tenantname + """, ""passwordCredentials"": {""username"": """ + $username + """, ""password"": """ + $password + """}}}";
# リクエスト
$data = [System.Text.Encoding]::ASCII.GetBytes($datastr);
$reqStream = $req.GetRequestStream();
$reqStream.Write($data, 0, $data.Length);
$reqStream.Close()
# レスポンスの取得と読み込み
$res = $req.GetResponse()
$resStream = $res.GetResponseStream()
$sr = new-object System.IO.StreamReader($resStream, [System.Text.Encoding]::ASCII)
$result = $sr.ReadToEnd()
$sr.Close()
$resStream.Close()
echo $result

PowerShellではechoはふつう使わない気がしますが、バッチファイル経験者のPowerShell初心者なのでとりあえず動いたのでこれにしています。

PowerShellでのスクリプトは初めて操作したため以下のようなエラーが発生してしまいました。

スクリプトの実行がシステムで無効になっているため、ファイル ○○ を読み込めません。詳細については、「get-help about_signing」と入力してヘルプを参照してください。

管理者でPowerShellを起動し以下のコマンドを実行すると解決します。

Set-ExecutionPolicy RemoteSigned

C#でのソースコード

Visual Studio 2013 .NET 4.5で確認しました。途中、エラーに悩まされていた時、入力支援や、エラーの指摘などこちらのほうが機能が豊富だったため、こちらで作成した後、PowerShellに書き換えてみました。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.IO;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string authurl = "API Auth URL";
            string tenantname = "テナント名";
            string username = "ユーザー名";
            string password = "パスワード";

            // API認証をおこないトークンを取得します
            var req = (HttpWebRequest)WebRequest.Create(authurl + "/tokens");
            req.Method = "POST";
            req.ContentType="application/json";
            req.Accept = "application/json";
            string datastr = "{\"auth\": {\"tenantName\": \"" + tenantname + "\", \"passwordCredentials\": {\"username\": \"" + username + "\", \"password\": \"" + password + "\"}}}";

            byte[] data = Encoding.ASCII.GetBytes(datastr); 
            req.ContentLength = data.Length;
            // リクエスト
            Stream reqStream = req.GetRequestStream();
            reqStream.Write(data, 0, data.Length);
            reqStream.Close();
            // レスポンスの取得と読み込み
            WebResponse res = req.GetResponse();
            Stream resStream = res.GetResponseStream();
            StreamReader sr = new StreamReader(resStream, Encoding.ASCII);
            string result = sr.ReadToEnd();
            sr.Close();
            resStream.Close();
            //
            Console.WriteLine(result);
        }
    }
}

補足

トークンが得られたら、C#なら req.Headers.Add(“X-Auth-Token: (トークン)”); として、アップロードならリクエストのbyte[]を書き換えて、ダウンロードならレスポンスの取得と読み込み部分を書き換えたら動くのではないかと思います。


Comments

comments

“ConoHaのオブジェクトストレージをPowerShell(+C#)で使ってみた ~その1・認証編” への4件の返信

  1. >Tonghyun Kim さん
    Facebookでのコメントありがとうございます。
    URLも拝見しました。Invoke-RestMethodを使うとコードがより簡単に出来そうですね。
    すでにこの記事(HttpWebRequest)をベースにした続編の準備をしていたので、次々回の更新に反映させたいと思います。

naoto_gohko へ返信する コメントをキャンセル

メールアドレスが公開されることはありません。

*

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)