1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ConoHaのオブジェクトストレージを使ってみる

Last updated at Posted at 2024-12-14

本記事は、ConoHa Advent Calendar 2024 15日目の記事です。

はじめに

今年もやってきました、アドベントカレンダーの季節です。

去年からConoHaの使ってない機能とかを使う機会になってます。やったね。

ついでに、去年はChromeBookでしたが今年はWindows PCになりました。うれしい。

みんなもう美雲このはちゃんのかわいさはご存じだと思いますので省略します。記事が長くなっちゃう。

やること

今年はオブジェクトストレージを使ってみます。

オブジェクトストレージとは?

ConoHaさんのホームページから引用します。

オブジェクトストレージは、大容量データを低コストで保存するのに最適なストレージです。容量無制限、データ転送料金無料で利用できるため、お客様は高品質なストレージを低価格でシンプルな価格体系で利用できます。

オブジェクトストレージ|レンタルサーバーならConoHa

安価に大容量データを保存できるストレージってことですね

オブジェクトストレージといえば、AWSのS3とかが有名ですがS3はデータの転送料金が従量課金制となっています。(詳しくはAWSのホームページを見てください)

個人的には、転送料金が掛かっちゃうと毎月のコスト計算が大変になるので困ります。

転送料金無料なのはありがたい!

契約

早速契約します。

image.png

管理ページからオブジェクトストレージに行きます。

右のツールアイコンを押します。

image.png

容量選択画面が出るので、ここでは一番最小の100GBを選びます。

料金安くてうれしいね。

image.png

「0GB/100GB」となっていればOKです。

使ってみる

ConoHaさんは優しいので、利用ガイドを用意してくれています。

オブジェクトストレージ

しかし!この利用ガイドは更新されていないようで、古いAPIの仕様が書かれてます。

(具体的には、Ver.2.0のものが書かれているようです。)

気をつけてください。(一敗)

最新のAPI仕様は別ページを見ましょう。

ConoHa VPS 3.0 APIドキュメント

今回はcurlをつかってオブジェクトストレージを使ってみます。

API利用準備をする

オブジェクトストレージを使うには、ConoHaのAPIを利用します。

APIを利用するために必要な情報を取得します。

image.png

管理画面のAPIに必要な情報があります。

APIユーザー欄にある「ユーザーID」と「パスワード」が必要です。

また、テナント情報欄にある「テナントID」も必要です。

image.png

そして、エンドポイントURLも入手しておきましょう。

一番上の「Identity Service」と「Object Storage Service」のURLを入手しておきます。

image.png

認証トークンを生成する

リクエストは以下のようにします。

curl -v -s -XPOST \
-H "Accept: application/json" \
-d '{"auth": {"identity": {"methods": ["password"],"password":{"user":{"id": "APIユーザーID","password": "パスワード"}}},"scope": {"project":{"id": "テナントID"}}}}' \
~Identity Serviceのエンドポイント~/auth/tokens

POSTでやります。

ヘッダをAccept: application/jsonにします。

また、データをJSONにします。

-dで指定したものがJSONです。

リクエスト先は、エンドポイントでOKです。

ヘッダのx-subject-token:がトークンです。

トークンは毎回入力すると長くなるので、環境変数にぶち込んでおきましょう

ついでに、Object Storage ServiceのエンドポイントURLも環境変数に入れておきます。

token=~返ってきたトークン~
object_storage_service_endpoint=~Object Storage Serviceのエンドポイント~

コンテナ一覧を取得する

それでは早速オブジェクトストレージにアクセスします。

リクエストは以下のようにします。

curl -s -XGET \
-H "Accept: application/json" \
-H "X-Auth-Token: $token" \
$object_storage_service_endpoint

レスポンスが[]となっていればOKです。

コンテナを作る

早速コンテナを作ってみましょう

リクエストは以下のようにします。

curl -v -XPUT \
-H "Accept: application/json" \
-H "X-Auth-Token: $token" \
$object_storage_service_endpoint/~コンテナ名~

HTTP/1.1 202 Acceptedとなっていれば成功です。

先ほどのコンテナ一覧取得を使うと以下のようにレスポンスが返ってきました。

[{"name":"test_container","count":0,"bytes":0}]

ちゃんと作られてますね。やったぜ。

オブジェクトをアップロードする

それでは、オブジェクトをアップロードします。

つまり、ファイルをアップロードします。

テキストファイルをアップロードしてみます。

リクエストは以下のようにします。

curl -v -s -XPUT \
-H "Accept: application/json" \
-H "X-Auth-Token: $token" \
$object_storage_service_endpoint/~コンテナ名~/~ファイル名~ -d @./~アップロードするファイル~

HTTP/1.1 201 CreatedとなっていればOKです。

これで、オブジェクトをアップロードできました。やったね。

先ほどのコンテナ一覧取得を使うと以下のようにレスポンスが返ってきました。

[{"name":"test_container","count":1,"bytes":36}]

ちゃんとオブジェクトが作られてるっぽいですね。

オブジェクトをダウンロード

では、先ほどアップロードしたオブジェクトをダウンロードしてみます。

リクエストは以下のようにします。

curl -XGET \
-H "Accept: application/json" \
-H "X-Auth-Token: $token" \
-H "Content-Type: ~コンテンツタイプ~" \
$object_storage_service_endpoint/~コンテナ名~/~オブジェクト名~ -O

ダウンロードしたファイルを確認してみます。

$ cat text_file.txt
このはちゃん清楚かわいい

大丈夫そうです。

コンテナをWebで公開

では、このコンテナをWebで公開してみます。

なお、オブジェクト単位で公開は無理です。コンテナ単位となります。ご注意を。

リクエストは以下のようにします。

curl -v -XPOST \
-H "Accept: application/json" \
-H "X-Auth-Token: $token" \
-H "X-Container-Read: .r:*" \
$object_storage_service_endpoint/~コンテナ名~

HTTP/1.1 204 No ContentとなっていればOKです。

これでコンテナごとWebに公開しました。

それでは、アクセスしてみます。

curl $object_storage_service_endpoint/test_container/text_file.txt

レスポンス:

このはちゃん清楚かわいい

ちゃんと見れてますね!

公開したコンテナを非公開にする

ちゃんと非公開にしておきましょう。

リクエストは以下のようにします。

curl -v -XPOST \
-H "Accept: application/json" \
-H "X-Auth-Token: $token" \
-H "X-Container-Read;" \
$object_storage_service_endpoint/~コンテナ名~

HTTP/1.1 204 No ContentとなっていればOKです。

オブジェクトを削除

それでは、オブジェクトを削除してみます。

リクエストは以下のようにします。

curl -v -s -X DELETE \
-H "Accept: application/json" \
-H "X-Auth-Token: $token" \
$object_storage_service_endpoint/~コンテナ名~/~ファイル名~

HTTP/1.1 204 No ContentとなっていればOKです。

コンテナ一覧取得を使うと以下のようにレスポンスが返ってきました。

[{"name":"test_container","count":0,"bytes":0}]

ちゃんと消えてるみたいです。

(ちなみにワイルドカードは使えません。)

コンテナを削除

オブジェクトの次はコンテナの削除です。

リクエストは以下のようにします。

curl -v -s -X DELETE \
-H "Accept: application/json" \
-H "X-Auth-Token: $token" \
$object_storage_service_endpoint/~コンテナ名~

HTTP/1.1 204 No ContentとなっていればOKです。

コンテナ一覧取得を使うと以下のようにレスポンスが返ってきました。

[]

ちゃんと消えてますね!

(ちなみに、オブジェクトが入っている場合はコンテナを削除できません。)

容量の大きい(5GB以上)動画をアップロードしてみる

上で紹介したAPIでは、5GB以上のファイルはアップロードできません。

そのため、DLOもしくはSLOを使用します。

ドキュメントによると、SLOはDLOに比べて完全性、信頼性が向上するらしいです。

(よくわかんない)

ドキュメントを見ると、何やらファイルを分割してアップロードして...と普通にオブジェクトをアップロードするのと比べて少々面倒なようです。

今回は、SLOの方を使ってみたいと思います。

頑張って探した5GB以上の動画ファイルをアップロードしてみようと思います。

公式ドキュメント(ラージオブジェクトアップロード(SLO))に従ってやってみます。

今回は次のファイルをアップロードします。

ファイル名: Minecraft_Rec_01.mp4

まずは、ファイルを1GBごとに分割します。

split -b 1G Minecraft_Rec_01_mp4 segment_Minecraft_Rec_01_mp4_

セグメントファイルができました。

$ ls
Minecraft_Rec_01.mp4             segment_Minecraft_Rec_01_mp4_ab  segment_Minecraft_Rec_01_mp4_ad  segment_Minecraft_Rec_01_mp4_af
segment_Minecraft_Rec_01_mp4_aa  segment_Minecraft_Rec_01_mp4_ac  segment_Minecraft_Rec_01_mp4_ae

次に、コンテナを作ります。

curl -i -X PUT \
-H "Accept: application/json" \
-H "X-Auth-Token: $token" \
$object_storage_service_endpoint/Movies

次に、セグメントファイルというファイル専用のコンテナを作ります。

curl -i -X PUT \
-H "Accept: application/json" \
-H "X-Auth-Token: $token" \
$object_storage_service_endpoint/Movies_segments

このセグメントファイルをアップロードします。

curl -i -X PUT -H "X-Auth-Token: $token" $object_storage_service_endpoint/Movies_segments/segment_Minecraft_Rec_01_mp4_aa -T segment_Minecraft_Rec_01_mp4_aa
curl -i -X PUT -H "X-Auth-Token: $token" $object_storage_service_endpoint/Movies_segments/segment_Minecraft_Rec_01_mp4_ab -T segment_Minecraft_Rec_01_mp4_ab
curl -i -X PUT -H "X-Auth-Token: $token" $object_storage_service_endpoint/Movies_segments/segment_Minecraft_Rec_01_mp4_ac -T segment_Minecraft_Rec_01_mp4_ac
curl -i -X PUT -H "X-Auth-Token: $token" $object_storage_service_endpoint/Movies_segments/segment_Minecraft_Rec_01_mp4_ad -T segment_Minecraft_Rec_01_mp4_ad
curl -i -X PUT -H "X-Auth-Token: $token" $object_storage_service_endpoint/Movies_segments/segment_Minecraft_Rec_01_mp4_ae -T segment_Minecraft_Rec_01_mp4_ae
curl -i -X PUT -H "X-Auth-Token: $token" $object_storage_service_endpoint/Movies_segments/segment_Minecraft_Rec_01_mp4_af -T segment_Minecraft_Rec_01_mp4_af

このセグメントファイルは大体1つ1GBぐらいなのでちょっと時間がかかります。

(&使うとかシェルスクリプトにするなどすることをお勧めします。)

次に、MD5ハッシュを確認します。

md5sum segment_Minecraft_Rec_01_mp4_a*
$ md5sum segment_Minecraft_Rec_01_mp4_a*
e14aa0586ab60d8fb25d7cc3c6386db7  segment_Minecraft_Rec_01_mp4_aa
dd66a8de8864ff0376323d46b096a1d5  segment_Minecraft_Rec_01_mp4_ab
2f180136f5a134237ad4384e64f8bfce  segment_Minecraft_Rec_01_mp4_ac
82994d560638a3b3bdd6fa3eb9feb63c  segment_Minecraft_Rec_01_mp4_ad
bc3bf40b860a6e0cc57692ebab700591  segment_Minecraft_Rec_01_mp4_ae
8ecbb3648528fbcc728bbfe811a21298  segment_Minecraft_Rec_01_mp4_af

ファイルサイズも確認します。

ls -l
$ ls -l
total 11871696
-rwxrwxrwx 1 mendoitarou mendoitarou 6078304474 Sep  8 11:56 Minecraft_Rec_01.mp4
-rwxrwxrwx 1 mendoitarou mendoitarou 1048576000 Nov 22 22:18 segment_Minecraft_Rec_01_mp4_aa
-rwxrwxrwx 1 mendoitarou mendoitarou 1048576000 Nov 22 22:18 segment_Minecraft_Rec_01_mp4_ab
-rwxrwxrwx 1 mendoitarou mendoitarou 1048576000 Nov 22 22:19 segment_Minecraft_Rec_01_mp4_ac
-rwxrwxrwx 1 mendoitarou mendoitarou 1048576000 Nov 22 22:19 segment_Minecraft_Rec_01_mp4_ad
-rwxrwxrwx 1 mendoitarou mendoitarou 1048576000 Nov 22 22:19 segment_Minecraft_Rec_01_mp4_ae
-rwxrwxrwx 1 mendoitarou mendoitarou  835424474 Nov 22 22:19 segment_Minecraft_Rec_01_mp4_af

MD5ハッシュとファイルサイズからmanifestファイルを作成します。

ここでは、動画ファイル(mp4)をアップロードしているのでContent-Typevideo/mp4を指定しています。

curl -i -X PUT \
-H "Accept: application/json" \
-H "X-Auth-Token: $token" \
-H "Content-Type: video/mp4" \
-d '[{"path" : "Movies_segments/segment_Minecraft_Rec_01_mp4_aa", "etag": "e14aa0586ab60d8fb25d7cc3c6386db7", "size_bytes": 1048576000},
{"path" : "Movies_segments/segment_Minecraft_Rec_01_mp4_ab", "etag": "dd66a8de8864ff0376323d46b096a1d5", "size_bytes": 1048576000},
{"path" : "Movies_segments/segment_Minecraft_Rec_01_mp4_ac", "etag": "2f180136f5a134237ad4384e64f8bfce", "size_bytes": 1048576000},
{"path" : "Movies_segments/segment_Minecraft_Rec_01_mp4_ad", "etag": "82994d560638a3b3bdd6fa3eb9feb63c", "size_bytes": 1048576000},
{"path" : "Movies_segments/segment_Minecraft_Rec_01_mp4_ae", "etag": "bc3bf40b860a6e0cc57692ebab700591", "size_bytes": 1048576000},
{"path" : "Movies_segments/segment_Minecraft_Rec_01_mp4_af", "etag": "8ecbb3648528fbcc728bbfe811a21298", "size_bytes": 835424474}]' \
$object_storage_service_endpoint/Movies/Minecraft_Rec_01.mp4?multipart-manifest=put

これで、アップロード完了です。

(DLOの方はMD5ハッシュ値を検証しないようなので、信頼性が落ちるということだと思われます。)

コンテナ一覧取得を使うと以下のようにレスポンスが返ってきました。

[{"name":"Movies","count":1,"bytes":786},{"name":"Movies_segments","count":6,"bytes":6078304474}]

ちゃんとアップロードできてそうです。

Webに公開して、ブラウザで確認してみます。

image.png

ちゃんとできました!

ここで注意点。

このようにして公開したファイルをWebで公開する際にはMovies(manifestファイル)とMovies_segments(セグメントファイル)を入れてある2つのコンテナを公開する必要があります。

Moviesだけ公開してもダメです。皆さんも気を付けましょう。(1敗)

オブジェクトストレージの解約

解約は最初の契約の手順で、容量を0GBにすることで解約可能です。

注意点ですが、オブジェクトストレージを解約するときはオブジェクトとコンテナをすべて削除しておく必要があります。

残ってると削除に失敗します。(一敗)

おわりに

オブジェクトストレージ、めっちゃ楽しい。

オブジェクトストレージは大体、写真とか動画とかを置いておくところとして使われることが多いらしいです。

拡張が簡単、容量に対して安価など、多くのメリットがあります。

お金があれば、即契約したいですね。

お金があれば.....!!!(お金貯めて契約予定です。)

皆さんも、一度使ってみてはいかがでしょうか!

詳細は、ConoHaさんのホームページに丸投げしておきます()

オブジェクトストレージ|レンタルサーバーならConoHa

それでは、皆さん!よいConoHaライフを!

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?