はじめに
前回の記事では、PowerShellとC#を用いてトークンを含むJSONデータの取得まで出来ました。
今回は、PowerShellにおいて、JSONデータからのトークンの抽出、コンテナリストの確認、オブジェクトリストの確認、オブジェクトのアップロード、オブジェクトのダウンロードについて紹介します。
今回のサンプルから、PowerShell 3.0以降で動作します。Windows 8以降の方は問題ありませんが、Vistaや7でバージョンが古い場合は最新版をインストールしてください。(Windows 7→4.0、Vista→3.0)
参考リンク
まず、公式サイトでの概要や説明のページを紹介します。
- オブジェクトストレージの概要(ConoHa活用ガイド)
詳しいAPI情報についてはこちらを参照してください。 - ConoHaオブジェクトストレージを使ってみよう(コントロールパネル編)(ConoHa技術ブログ)
この記事のサンプルを実行する前に、こちらの記事を参考にコンテナを作成してください。
次に、ConoHaのオブジェクトストレージ利用者のブログです。
- ConoHaオブジェクトストレージクライアントを作ろう(たっけんの気まぐれ撫子日記)
日本語プログラミング言語「なでしこ」を用いたサンプルです。 - ConoHaのオブジェクトストレージサービスについて。(OSSはアルミニウムの翼で飛ぶ)
Pythonにおけるサンプルです。コンテナの読み取り属性の変更を参考にしました。
前回の記事のコメント
前回の記事にTonghyun Kim様よりコメントをいただきました。
Powershellなら、Invoke-RestMethodはどうでしょう。
今回は、今後更新するであろうC#のコードと同じHttpWebRequestを利用していますが、Invoke-RestMethodを使用するとシンプルになりそうなので、そちらを使ったサンプルも公開したいなと思います。
サンプルコード
※予めコンテナ「test」を作成してください。
今回、PowerShellのfunctionを使用したり、echoではなく正式なWrite-Outputを使用するなど、追加した機能以外においても変化しています。
ConvertFrom-JsonはJSONを扱うことがあれば、覚えておいて損は無いと思います。
トークンは24時間有効なので、デバッグなどであればコード中に書き込み、トークン取得を省略することも出来ます。
# 関数の定義 # API認証をおこないトークンを取得します function getToken([string] $tenantname, [string] $username, [string] $password, [string] $authurl){ $req = [Net.HttpWebRequest]::Create($tokensurl) $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(); $res.Close(); # JSONからTokenの取得 $tokens = $result | ConvertFrom-Json $token = $tokens.access.token.id; return $token } # コンテナリストの確認 function getContainer([string]$token, [string] $endpoint){ $req = [Net.HttpWebRequest]::Create($endpoint) $req.Method = "GET" $req.Headers.Add("X-Auth-Token: "+$token) $res = $req.GetResponse(); $resStream = $res.GetResponseStream(); $sr = new-object System.IO.StreamReader($resStream, [System.Text.Encoding]::ASCII); $result = $sr.ReadToEnd(); $sr.Close(); $resStream.Close(); $res.Close() Write-OutPut "コンテナリスト" Write-OutPut $result } # オブジェクトリストの確認 function getObjectList([string]$containerName, [string]$token, [string] $endpoint){ $req = [Net.HttpWebRequest]::Create($endpoint+"/"+$containerName) $req.Method = "GET" $req.Headers.Add("X-Auth-Token: "+$token) $res = $req.GetResponse() $resStream = $res.GetResponseStream() $sr = new-object System.IO.StreamReader($resStream, [System.Text.Encoding]::ASCII) $result = $sr.ReadToEnd() $sr.Close() $resStream.Close() $res.Close() Write-OutPut "ttt のオブジェクトリスト" Write-OutPut $result } # オブジェクトのアップロード function putObject([byte[]]$data, [string]$fileName, [string]$containerName, [string]$token, [string]$endpoint){ $req = [Net.HttpWebRequest]::Create($endpoint+"/"+$containerName+"/"+$fileName) $req.Method = "PUT" $req.Headers.Add("X-Auth-Token: "+$token) $req.SendChunked = "true" # Content-Length 省略のため $reqStream = $req.GetRequestStream(); $reqStream.Write($data, 0, $data.Length); $reqStream.Close(); } # オブジェクトのダウンロード function getObject([string]$fileName, [string]$containerName, [string]$token, [string]$endpoint){ $req = [Net.HttpWebRequest]::Create($endpoint+"/"+$containerName+"/"+$fileName) Write-OutPut $req.RequestUri $req.Method = "GET" $req.Headers.Add("X-Auth-Token: "+$token) $res = $req.GetResponse() $resStream = $res.GetResponseStream() $sr = new-object System.IO.StreamReader($resStream, [System.Text.Encoding]::ASCII) $result = $sr.ReadToEnd() $sr.Close() $resStream.Close() $res.Close() Write-OutPut "ファイルの内容" Write-OutPut $result } # Public function postContainerReadPublic([string]$containerName,[string]$token, [string] $endpoint){ $req = [Net.HttpWebRequest]::Create($endpoint+"/"+$containerName) $req.Method = "POST" $req.Headers.Add("X-Auth-Token: "+$token) $req.Headers.Add("X-Container-Read: .r:*,.rlistings") $res = $req.GetResponse(); $resStream = $res.GetResponseStream(); $sr = new-object System.IO.StreamReader($resStream, [System.Text.Encoding]::ASCII); $result = $sr.ReadToEnd(); $sr.Close(); $resStream.Close(); $res.Close() Write-OutPut "Result " Write-OutPut $result } # ユーザー設定 # 入力するAPI情報は https://www.conoha.jp/guide/guide.php?g=46 $authurl = "API Auth URL" $tokensurl = $authurl + "/tokens" $tenantname = "テナント名" $username = "ユーザー名" $password = "パスワード" $endpoint = "オブジェクトストレージエンドポイント" # 24時間有効なので、デバッグ時はこちらに入力すると良いかも $token = "" # トークンの取得 if($token -eq "") { $token = getToken $tenantname $username $password $authurl Write-OutPut "getToken" Write-OutPut $token } # コンテナリストの確認 getContainer $token $endpoint # オブジェクトリストの確認 getObjectList "test" $token $endpoint # オブジェクトのアップロード [byte[]]$upData = 0x43,0x6f,0x6e,0x6f,0x48,0x61 putObject $upData "conoha.txt" "test" $token $endpoint # オブジェクトのダウンロード getObject "conoha.txt" "test" $token $endpoint # Public #postContainerReadPublic "test" $token $endpoint
バイナリ形式のデータもアップロードできるかの確認のため、あえてbyte[]で書いています。
このサンプルコードにおいて、Publicと書かれた部分は、コンテナの属性を変更して誰でも読み取り可能にするコードです。
通常ならコードにあるとおり、ダウンロードにも認証が必要ですが、コンテナ単位で一般公開用、プライベート用が変更可能です。
ConoHaなら転送量の制限がないので、気にせずに公開することが出来ます。