You are currently viewing DockerでOpenStack Swiftのローカルテスト環境を作成する

DockerでOpenStack Swiftのローカルテスト環境を作成する

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と環境を合わせることができるので、開発やテストの面で環境差異を減らすことができます

コメントを残す