GMO ConoHaのオブジェクトストレージを利用したサービスを開発中です
ConoHaはOpenStackで環境が構築されているとのことなので、OpenStack(のオブジェクト管理コンポーネントであるSwift)のテスト環境をローカルマシンに準備することにしました
本番環境をテストでも使ってしまうと、必ず事故は起きてしまいますから・・・
Docker Composeの準備
こんな感じのdocker-composeファイルを作成しました
services:
swift:
image: openstackswift/saio:py3
container_name: swift
ports:
- "8080:8080" # Swift API を公開
environment:
SWIFT_USER: "test:tester"
SWIFT_KEY: "testing"
SWIFT_AUTH_URL: "http://localhost:8080/auth/v1.0"
restart: unless-stopped
上記内容でdocker-compose.ymlを作成し、docker composeコマンドで実行すれば環境作成は完了です
docker compose up -d
Tokenを取得
Swiftにアクセスするためのトークンを取得します
以下のコマンドを実行してみてください
curl -i -H "X-Auth-User: admin:admin" -H "X-Auth-Key: admin" http://localhost:8080/auth/v1.0
以下のレスポンスが返却されます
HTTP/1.1 200 OK
Content-Type: text/html; charset=UTF-8
X-Auth-Token: AUTH_tk37d434e83e6d4a8d94c9b5079ef96aa6
X-Storage-Token: AUTH_tk37d434e83e6d4a8d94c9b5079ef96aa6
X-Auth-Token-Expires: 86399
X-Storage-Url: http://localhost:8080/v1/AUTH_admin
Content-Length: 0
X-Trans-Id: txf47d5c5ccaa34211bd616-0067f0f8af
X-Openstack-Request-Id: txf47d5c5ccaa34211bd616-0067f0f8af
Date: Sat, 05 Apr 2025 09:32:31 GMT
この中の「X-Auth-Token」控えておきます(このあとのAPI操作に利用します)
Storageの基本的な操作
コンテナ一覧表示
※コンテナはファイルを保存するための入れ物のような概念
curl -H "X-Auth-Token: AUTH_tk37d434e83e6d4a8d94c9b5079ef96aa6" \
http://localhost:8080/v1/AUTH_admin
コンテナ作成
curl -X PUT \
-H "X-Auth-Token: AUTH_tk37d434e83e6d4a8d94c9b5079ef96aa6" \
http://localhost:8080/v1/AUTH_admin/test_container
コンテナ作成コマンドを実行したあとにコンテナ一覧のコマンドを実行すると、作成したコンテナが表示されると思います
コンテナ公開設定
公開設定を行うことで、誰でもファイルを閲覧できるようになります
curl -i -X POST \
-H "X-Auth-Token: AUTH_tk37d434e83e6d4a8d94c9b5079ef96aa6" \
-H "X-Container-Read: .r:*,.rlistings" \
http://localhost:8080/v1/AUTH_admin/test_container
コンテナ内のファイル一覧表示
curl -H "X-Auth-Token: AUTH_tk37d434e83e6d4a8d94c9b5079ef96aa6" \
http://localhost:8080/v1/AUTH_admin/test_container
コンテナ内のファイル削除
コンテナ内のファイル削除
curl -X DELETE \
-H "X-Auth-Token: AUTH_tk37d434e83e6d4a8d94c9b5079ef96aa6" \
http://localhost:8080/v1/AUTH_admin/test_container/file.txt
コンテナ削除
curl -X DELETE \
-H "X-Auth-Token: AUTH_tk37d434e83e6d4a8d94c9b5079ef96aa6" \
http://localhost:8080/v1/AUTH_admin/test_container
gophercloudでの利用例
Swiftの操作にgohpercloudを利用しています
gophercloudではtokenを利用した認証には対応していない?(未調査)ようなので、操作に利用するクライアントは手動でtokenを取得して設定します
トークンの取得
gophercloudで利用するためのトークンを取得します
先ほど紹介した取得方法と相違ありません
curl -i -H "X-Auth-User: admin:admin" -H "X-Auth-Key: admin" http://localhost:8080/auth/v1.0
レスポンスヘッダの「X-Auth-Token」「X-Storage-Url」を控えておきます
gophercloudのクライアント作成
token := "AUTH_tk37d434e83e6d4a8d94c9b5079ef96aa6" // 取得したX-Auth-Tokenの値
storageURL := "http://localhost:8080/v1/AUTH_admin" // 取得したX-Storage-Urlの値
// ProviderClient を手動で作成
provider = &gophercloud.ProviderClient{
TokenID: token,
}
// EndpointLocatorを上書きして、常に取得したストレージURLを返すようにする
provider.EndpointLocator = func(opts gophercloud.EndpointOpts) (string, error) {
return storageURL, nil
}
client, err := openstack.NewObjectStorageV1(provider, gophercloud.EndpointOpts{})
if err != nil {
panic(err)
}
これでclientが作成され、以降ストレージを操作するときはclientを利用して操作します
ファイルの作成
ファイルを開いて、アップロードする処理を抜粋しています
file, err := os.Open(fileName)
opt := objects.CreateOpts{
Content: file,
}
result := objects.Create(client, containerName, fileName, opt)
objects.Createを利用してファイルをストレージに保存します
簡単ですが、以上がgophercloudを利用したファイル操作方法です
公開設定が行われている場合、以下のURLでファイルを閲覧することができます
http://localhost:8080/v1/AUTH_admin/container_name/file_name.jpg
以上
簡単ですが、Dockerを利用したSwift環境の構築と、基本的な操作方法を紹介しました
ローカルにSwift環境が作成できれば、GMO ConoHaと環境を合わせることができるので、開発やテストの面で環境差異を減らすことができます