Red Hat Training

A Red Hat training course is available for Red Hat Ceph Storage

開発者ガイド

Red Hat Ceph Storage 3

Red Hat Ceph Storage の各種アプリケーションプログラミングインターフェイスの使用

概要

本ガイドでは、AMD64 および Intel 64 のアーキテクチャーで実行している Red Hat Ceph Storage のさまざまなアプリケーションプログラミングインターフェイスを使用する方法を説明します。

第1章 Object Gateway Administration Application Programming Interface (API)

Ceph Object Gateway は、RESTful API の radosgw-admin コマンドラインインターフェイスの機能も公開します。Red Hat は、Ceph Object Gateway の設定時にコマンドラインインターフェイスを使用することを推奨します。ユーザー、データ、クォータ、および使用状況を管理する際に、Ceph Object Gateway の管理 API は、他の管理プラットフォームと統合できる RESTful インターフェイスを提供します。管理 API は以下の機能を提供します。

1.1. リクエストの認証

Amazon の S3 サービスは、アクセスキーと要求ヘッダーのハッシュと秘密鍵を使用して要求を認証します。この要求には、SSL オーバーヘッドなしで認証された要求(特に大きなアップロード)を提供する利点があります。

S3 API のほとんどのユースケースには、Java や Python Boto 用の Amazon SDK の AmazonS3Client などのオープンソースの S3 クライアントを使用します。これらのライブラリーは、Ceph Object Gateway 管理 API をサポートしません。これらのライブラリーをサブクラス化および拡張して、Ceph Admin API をサポートすることができます。一意のゲートウェイクライアントを作成できます。

本セクションの CephAdminAPI のサンプルクラスでは、要求パラメーターの取得、リクエストの認証、Ceph 管理 API を呼び出してレスポンスを受け取ることができる execute() メソッドの作成方法を説明します。CephAdminAPI クラスの例は、商用としてはサポートされず、そのように意図されてもいません。これは説明のみを目的としています。クライアントコード には、CRUD 操作を示すために Ceph Object Gateway への 5 つの呼び出しが含まれます。

  • ユーザーの作成
  • ユーザーの取得
  • ユーザーの変更
  • サブユーザーの作成
  • ユーザーを削除します。

この例を使用するには、httpcomponents-client-4.5.3 Apache HTTP コンポーネントを取得します。http://www.eu.apache.org/dist/httpcomponents/httpclient/binary/ などをダウンロードできます。その後、tar ファイルを展開して lib ディレクトリーに移動し、JAVA_HOME ディレクトリーの /jre/lib/ext ディレクトリーまたはカスタムクラスパスにコピーします。

CephAdminAPI クラスの例を検査する際に、execute() メソッドは HTTP メソッド、リクエストパス、オプションのサブリソース、未指定の場合は null、およびパラメーターのマップを取得することに注意してください。サブリソース (例: subuserkey など) で実行するには、サブリソースを execute() メソッドの引数として指定する必要があります。

方法の例を以下に示します。

  1. URI をビルドします。
  2. HTTP ヘッダー文字列をビルドします。
  3. HTTP リクエストをインスタンス化します (例: PUTPOSTGETDELETE)。
  4. Date ヘッダーを HTTP ヘッダー文字列および要求ヘッダーに追加します。
  5. Authorization ヘッダーを HTTP リクエストヘッダーに追加します。
  6. HTTP クライアントをインスタンス化し、インスタンス化された HTTP リクエストを渡します。
  7. 要求を行います。
  8. レスポンスを返します。

ヘッダー文字列のビルドは、Amazon の S3 認証手順を伴うプロセスの一部です。特に、サンプルメソッドは以下を行います。

  1. PUTPOSTGETDELETE などのリスエストタイプを追加します。
  2. 日付を追加します。
  3. requestPath を追加します。

リクエストタイプは、先頭または最後の空白のない大文字である必要があります。空白を削除しないと、認証は失敗します。日付は GMT で表現される必要があります。さもないと、認証に失敗します。

例示的な方法には、他のヘッダーはありません。Amazon S3 認証手順は、x-amz ヘッダーの辞書式に並べ替えられます。したがって、x-amz ヘッダーを追加する場合は、必ず辞書式で追加する必要があります。詳細は、本ガイドの S3 認証 を参照してください。Amazon S3 認証手順の詳細は、Amazon Simple Storage Service ドキュメントの Signing and Authenticating REST Requests セクションを参照してください。

ヘッダー文字列をビルドしたら、次の手順は HTTP リクエストをインスタンス化し、URI を渡すことです。典型的なメソッドは、PUT を使用してユーザーおよびサブユーザーを作成し、GET を使用してユーザーを取得し、POST を使用してユーザーを変更し、DELETE を使用してユーザーを削除します。

リクエストをインスタンス化したら、Date ヘッダーに続けて Authorization ヘッダーを追加します。Amazon の S3 認証は標準の Authorization ヘッダーを使用し、以下の構造を持ちます。

Authorization: AWS <access_key>:<hash_of_header_and_secret>

CephAdminAPI のサンプルクラスには base64Sha1Hmac() メソッドがあります。これはヘッダー文字列と admin ユーザーの秘密鍵を取得し、SHA1 HMAC を base-64 でエンコードされた文字列として返します。それぞれの execute() 呼び出しは、同じコード行を呼び出して Authorization ヘッダーをビルドします。

httpRequest.addHeader("Authorization", "AWS " + this.getAccessKey() + ":" + base64Sha1Hmac(headerString.toString(), this.getSecretKey()));

以下の CephAdminAPI のサンプルクラスでは、アクセスキー、シークレットキー、およびエンドポイントをコンストラクターに渡す必要があります。クラスは実行時に変更するためのアクセスメソッドを提供します。

import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.time.OffsetDateTime;
import java.time.format.DateTimeFormatter;
import java.time.ZoneId;

import org.apache.http.HttpEntity;
import org.apache.http.NameValuePair;
import org.apache.http.Header;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpRequestBase;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpPut;
import org.apache.http.client.methods.HttpDelete;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import org.apache.http.client.utils.URIBuilder;

import java.util.Base64;
import java.util.Base64.Encoder;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import javax.crypto.spec.SecretKeySpec;
import javax.crypto.Mac;

import java.util.Map;
import java.util.Iterator;
import java.util.Set;
import java.util.Map.Entry;

public class CephAdminAPI {

	/*
	 * Each call must specify an access key, secret key, endpoint and format.
	 */
	String accessKey;
	String secretKey;
	String endpoint;
	String scheme = "http"; //http only.
	int port = 80;

	/*
	 * A constructor that takes an access key, secret key, endpoint and format.
	 */
	public CephAdminAPI(String accessKey, String secretKey, String endpoint){
		this.accessKey = accessKey;
		this.secretKey = secretKey;
		this.endpoint = endpoint;
	}

	/*
	 * Accessor methods for access key, secret key, endpoint and format.
	 */
	public String getEndpoint(){
		return this.endpoint;
	}

	public void setEndpoint(String endpoint){
		this.endpoint = endpoint;
	}

	public String getAccessKey(){
		return this.accessKey;
	}

	public void setAccessKey(String accessKey){
		this.accessKey = accessKey;
	}

	public String getSecretKey(){
		return this.secretKey;
	}

	public void setSecretKey(String secretKey){
		this.secretKey = secretKey;
	}

	/*
	 * Takes an HTTP Method, a resource and a map of arguments and
	 * returns a CloseableHTTPResponse.
	 */
	public CloseableHttpResponse execute(String HTTPMethod, String resource,
                                        String subresource, Map arguments) {

		String httpMethod = HTTPMethod;
		String requestPath = resource;
		StringBuffer request = new StringBuffer();
		StringBuffer headerString = new StringBuffer();
		HttpRequestBase httpRequest;
		CloseableHttpClient httpclient;
		URI uri;
		CloseableHttpResponse httpResponse = null;

		try {

			uri = new URIBuilder()
				.setScheme(this.scheme)
				.setHost(this.getEndpoint())
				.setPath(requestPath)
				.setPort(this.port)
				.build();


			if (subresource != null){
				uri = new URIBuilder(uri)
					.setCustomQuery(subresource)
					.build();
			}


			for (Iterator iter = arguments.entrySet().iterator();
			iter.hasNext();) {
				Entry entry = (Entry)iter.next();
				uri = new URIBuilder(uri)
					.setParameter(entry.getKey().toString(),
                                 entry.getValue().toString())
					.build();

			}

			request.append(uri);

			headerString.append(HTTPMethod.toUpperCase().trim() + "\n\n\n");

			OffsetDateTime dateTime = OffsetDateTime.now(ZoneId.of("GMT"));
			DateTimeFormatter formatter = DateTimeFormatter.RFC_1123_DATE_TIME;
			String date = dateTime.format(formatter);

			headerString.append(date + "\n");
			headerString.append(requestPath);

			if (HTTPMethod.equalsIgnoreCase("PUT")){
				httpRequest = new HttpPut(uri);
			} else if (HTTPMethod.equalsIgnoreCase("POST")){
				httpRequest = new HttpPost(uri);
			} else if (HTTPMethod.equalsIgnoreCase("GET")){
				httpRequest = new HttpGet(uri);
			} else if (HTTPMethod.equalsIgnoreCase("DELETE")){
				httpRequest = new HttpDelete(uri);
			} else {
				System.err.println("The HTTP Method must be PUT,
				POST, GET or DELETE.");
				throw new IOException();
			}

			httpRequest.addHeader("Date", date);
			httpRequest.addHeader("Authorization", "AWS " + this.getAccessKey()
			+ ":" + base64Sha1Hmac(headerString.toString(),
			this.getSecretKey()));

			httpclient = HttpClients.createDefault();
			httpResponse = httpclient.execute(httpRequest);

		} 	catch  (URISyntaxException e){
			System.err.println("The URI is not formatted properly.");
			e.printStackTrace();
		}  catch (IOException e){
			System.err.println("There was an error making the request.");
			e.printStackTrace();
		}
			return httpResponse;
	}

	/*
	 * Takes a uri and a secret key and returns a base64-encoded
	 * SHA-1 HMAC.
	 */
	public String base64Sha1Hmac(String uri, String secretKey) {
		try {

			byte[] keyBytes = secretKey.getBytes("UTF-8");
			SecretKeySpec signingKey = new SecretKeySpec(keyBytes, "HmacSHA1");

			Mac mac = Mac.getInstance("HmacSHA1");
			mac.init(signingKey);

			byte[] rawHmac = mac.doFinal(uri.getBytes("UTF-8"));

			Encoder base64 = Base64.getEncoder();
			return base64.encodeToString(rawHmac);

		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}

}

後続の CephAdminAPIClient の例は、CephAdminAPI クラスをインスタンス化する方法、リクエストパラメーターのマップをビルドし、execute() メソッドを使用してユーザーを作成、取得、更新、および削除する方法を示しています。

import java.io.IOException;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.HttpEntity;
import org.apache.http.util.EntityUtils;
import java.util.*;


public class CephAdminAPIClient {

	public static void main (String[] args){

		CephAdminAPI adminApi = new CephAdminAPI ("FFC6ZQ6EMIF64194158N",
		                            "Xac39eCAhlTGcCAUreuwe1ZuH5oVQFa51lbEMVoT",
		                            "ceph-client");

		/*
		 * Create a user
		 */
		Map requestArgs = new HashMap();
		requestArgs.put("access", "usage=read, write; users=read, write");
		requestArgs.put("display-name", "New User");
		requestArgs.put("email", "new-user@email.com");
		requestArgs.put("format", "json");
		requestArgs.put("uid", "new-user");

		CloseableHttpResponse response =
			adminApi.execute("PUT", "/admin/user", null, requestArgs);

		System.out.println(response.getStatusLine());
		HttpEntity entity = response.getEntity();

		try {
			System.out.println("\nResponse Content is: "
				+ EntityUtils.toString(entity, "UTF-8") + "\n");
			response.close();
		} catch (IOException e){
			System.err.println ("Encountered an I/O exception.");
			e.printStackTrace();
		}

		/*
		 * Get a user
		 */
		requestArgs = new HashMap();
		requestArgs.put("format", "json");
		requestArgs.put("uid", "new-user");

		response = adminApi.execute("GET", "/admin/user", null, requestArgs);

		System.out.println(response.getStatusLine());
		entity = response.getEntity();

		try {
			System.out.println("\nResponse Content is: "
				+ EntityUtils.toString(entity, "UTF-8") + "\n");
			response.close();
		} catch (IOException e){
			System.err.println ("Encountered an I/O exception.");
			e.printStackTrace();
		}

		/*
		 * Modify a user
		 */
		requestArgs = new HashMap();
		requestArgs.put("display-name", "John Doe");
		requestArgs.put("email", "johndoe@email.com");
		requestArgs.put("format", "json");
		requestArgs.put("uid", "new-user");
		requestArgs.put("max-buckets", "100");

		response = adminApi.execute("POST", "/admin/user", null, requestArgs);

		System.out.println(response.getStatusLine());
		entity = response.getEntity();

		try {
			System.out.println("\nResponse Content is: "
				+ EntityUtils.toString(entity, "UTF-8") + "\n");
			response.close();
		} catch (IOException e){
			System.err.println ("Encountered an I/O exception.");
			e.printStackTrace();
		}


		/*
		 * Create a subuser
		 */
		requestArgs = new HashMap();
		requestArgs.put("format", "json");
		requestArgs.put("uid", "new-user");
		requestArgs.put("subuser", "foobar");

		response = adminApi.execute("PUT", "/admin/user", "subuser", requestArgs);
		System.out.println(response.getStatusLine());
		entity = response.getEntity();

		try {
			System.out.println("\nResponse Content is: "
				+ EntityUtils.toString(entity, "UTF-8") + "\n");
			response.close();
		} catch (IOException e){
			System.err.println ("Encountered an I/O exception.");
			e.printStackTrace();
		}


		/*
		 * Delete a user
		 */
		requestArgs = new HashMap();
		requestArgs.put("format", "json");
		requestArgs.put("uid", "new-user");

		response = adminApi.execute("DELETE", "/admin/user", null, requestArgs);
		System.out.println(response.getStatusLine());
		entity = response.getEntity();

		try {
			System.out.println("\nResponse Content is: "
				+ EntityUtils.toString(entity, "UTF-8") + "\n");
			response.close();
		} catch (IOException e){
			System.err.println ("Encountered an I/O exception.");
			e.printStackTrace();
		}
	}
}

API 関数リストに戻ります。

1.2. 管理ユーザーの作成

重要

Ceph Object Gateway ノードから radosgw-admin コマンドを実行するには、ノードに admin キー(任意のモニターノードからコピーできる)があることを確認します。

Ceph Object Gateway 管理 API を使用するには、以下の手順に従います。

  1. Object Gateway ユーザーを作成します。

    構文

    radosgw-admin user create --uid="<user_name>" --display-name="<display_name>"

    radosgw-admin user create --uid="admin-api-user" --display-name="Admin API User"

    radosgw-admin コマンドラインインターフェイスはユーザーを返します。以下に例を示します。

    {
        "user_id": "admin-api-user",
        "display_name": "Admin API User",
        "email": "",
        "suspended": 0,
        "max_buckets": 1000,
        "auid": 0,
        "subusers": [],
        "keys": [
            {
                "user": "admin-api-user",
                "access_key": "NRWGT19TWMYOB1YDBV1Y",
                "secret_key": "gr1VEGIV7rxcP3xvXDFCo4UDwwl2YoNrmtRlIAty"
            }
        ],
        "swift_keys": [],
        "caps": [],
        "op_mask": "read, write, delete",
        "default_placement": "",
        "placement_tags": [],
        "bucket_quota": {
            "enabled": false,
            "max_size_kb": -1,
            "max_objects": -1
        },
        "user_quota": {
            "enabled": false,
            "max_size_kb": -1,
            "max_objects": -1
        },
        "temp_url_keys": []
    }
  2. 作成するユーザーに管理ケイパビリティーを割り当てます。

    構文

    radosgw-admin caps add --uid="<user_name>" --caps="users=*"

    radosgw-admin caps add --uid=admin-api-user --caps="users=*"

    radosgw-admin コマンドラインインターフェイスはユーザーを返します。"caps": には、ユーザーに割り当てられたケイパビリティーがあります。

    {
        "user_id": "admin-api-user",
        "display_name": "Admin API User",
        "email": "",
        "suspended": 0,
        "max_buckets": 1000,
        "auid": 0,
        "subusers": [],
        "keys": [
            {
                "user": "admin-api-user",
                "access_key": "NRWGT19TWMYOB1YDBV1Y",
                "secret_key": "gr1VEGIV7rxcP3xvXDFCo4UDwwl2YoNrmtRlIAty"
            }
        ],
        "swift_keys": [],
        "caps": [
            {
                "type": "users",
                "perm": "*"
            }
        ],
        "op_mask": "read, write, delete",
        "default_placement": "",
        "placement_tags": [],
        "bucket_quota": {
            "enabled": false,
            "max_size_kb": -1,
            "max_objects": -1
        },
        "user_quota": {
            "enabled": false,
            "max_size_kb": -1,
            "max_objects": -1
        },
        "temp_url_keys": []
    }

    これで、管理者権限を持つユーザーが作成されます。

API 関数リストに戻ります。

1.3. 管理操作

管理アプリケーションプログラミングインターフェイス (API) リクエストは、設定可能な管理者リソースエントリーポイントで開始する URI で実行されます。管理 API の認可は S3 認可メカニズムを複製します。一部の操作では、ユーザーが特別な管理機能を保持する必要があります。XML または JSON のいずれかのレスポンスエンティティータイプはリクエストの format オプションとして指定され、指定されていないとデフォルトは JSON に設定されます。

1.3.1. 使用方法の取得

帯域幅の使用情報の要求。

caps
usage=read

構文

GET /admin/usage?format=json HTTP/1.1
Host: <Fully_Qualified_Domain_Name>

表1.1 リクエストパラメーター

名前説明必須

uid

情報が要求されるユーザー。

文字列。

はい

start

要求されたデータの開始時間を指定する日付および (任意の) 時間。(例: 2012-09-25 16:00:00)

文字列

いいえ

end

要求されたデータの終了時間を指定する日付および (任意の) 時間。(例: 2012-09-25 16:00:00)

文字列

いいえ

show-entries

データエントリーを返すかどうかを指定します。

ブール値

いいえ

show-summary

データ要約を返すかどうかを指定します。

ブール値

No

表1.2 レスポンスエンティティー

名前説明

usage

使用方法に関する情報用のコンテナー。

コンテナー

entries

使用方法エントリー情報のコンテナー。

コンテナー

user

ユーザーデータ情報のコンテナー

コンテナー

owner

バケットを所有するユーザーの名前。

文字列

bucket

バケット名。

文字列

time

データが指定されている時間の下限 (最初の関連する時間の開始に丸められます)。

文字列

epoch

1/1/1970 からの経過時間 (秒単位)。

文字列

categories

統計情報カテゴリーのコンテナー。

コンテナー

entry

stats エントリーのコンテナー。

コンテナー

category

統計が提供される要求カテゴリーの名前。

文字列

bytes_sent

Ceph Object Gateway によって送信されるバイト数。

整数

bytes_received

Ceph Object Gateway が受け取るバイト数。

整数

ops

演算の数。

整数

successful_ops

成功した操作の数。

整数

summary

統計情報の概要のコンテナー。

コンテナー

total

統計情報の概要集計合計のコンテナー。

コンテナー

成功すると、レスポンスには要求された情報が含まれます。

API 関数リストに戻ります。

1.3.2. トリムの使用方法

使用方法に関する情報を削除します。日付を指定しないと、すべての使用情報が削除されます。

caps
usage=write

構文

DELETE /admin/usage?format=json HTTP/1.1
Host: <Fully_Qualified_Domain_Name>

表1.3 リクエストパラメーター

名前説明必須

uid

情報が要求されるユーザー。

文字列

foo_user

いいえ

start

要求されたデータの開始時間を指定する日付および (任意の) 時間。

文字列

2012-09-25 16:00:00

いいえ

end

要求されたデータの終了時間を指定する日付および 時間 (非包括的)。

文字列

2012-09-25 16:00:00

いいえ

remove-all

マルチユーザーデータの削除を確認するために uid が指定されていない場合に必須です。

ブール値

True [False]

いいえ

API 関数リストに戻ります。

1.3.3. ユーザー情報の取得

ユーザーの情報の取得

caps
users=read

構文

GET /admin/user?format=json HTTP/1.1
Host: <Fully_Qualified_Domain_Name>

表1.4 リクエストパラメーター

名前説明必須

uid

情報が要求されるユーザー。

文字列

foo_user

はい

表1.5 レスポンスエンティティー

名前説明タイプ

user

ユーザーデータ情報のコンテナー

コンテナー

該当なし

user_id

ユーザー ID。

文字列

user

display_name

ユーザーの表示名。

文字列

user

suspended

ユーザーが一時停止した場合は True。

ブール値

user

max_buckets

ユーザーが所有するバケットの最大数。

整数

user

subusers

このユーザーアカウントに関連付けられたサブユーザー。

コンテナー

user

keys

このユーザーアカウントに関連付けられた S3 キー。

コンテナー

user

swift_keys

このユーザーアカウントに関連付けられた Swift 鍵。

コンテナー

user

caps

ユーザーケイパビリティー。

コンテナー

user

成功すると、応答にはユーザー情報が含まれます。

特別なエラーレスポンス

なし。

API 関数リストに戻ります。

1.3.4. ユーザーの作成

新しいユーザーを作成します。デフォルトでは、S3 キーペアが自動的に作成され、レスポンスで返されます。access-key または secret-key のいずれかのみを指定すると、省略キーが自動的に生成されます。デフォルトでは、生成されたキーは、既存のキーペアを置き換えることなくキーリングに追加されます。access-key が指定され、ユーザーが所有する既存のキーを参照すると、そのキーは変更されます。

caps
users=write

構文

PUT /admin/user?format=json HTTP/1.1
Host: <Fully_Qualified_Domain_Name>

表1.6 リクエストパラメーター

名前説明必須

uid

作成されるユーザー ID。

文字列

foo_user

はい

display-name

作成するユーザーの表示名。

文字列

foo ユーザー

はい

email

ユーザーに関連付けられたメールアドレス。

文字列

foo@bar.com

いいえ

key-type

生成されるキータイプ。オプションは swift、s3 (デフォルト) です。

文字列

s3 [s3]

いいえ

access-key

アクセスキーを指定します。

文字列

ABCD0EF12GHIJ2K34LMN

いいえ

secret-key

シークレットキーを指定します。

文字列

0AbCDEFg1h2i34JklM5nop6QrSTUV+WxyzaBC7D8

いいえ

user-caps

ユーザーケイパビリティー。

文字列

usage=read, write; users=read

いいえ

generate-key

新しいキーペアを生成し、既存のキーリングに追加します。

ブール値

True [True]

いいえ

max-buckets

ユーザーが所有できるバケットの最大数を指定します。

整数

500 [1000]

いいえ

suspended

ユーザーが一時停止されるかどうかを指定します。

ブール値

False [False]

No

表1.7 レスポンスエンティティー

名前説明タイプ

user

ユーザーデータ情報のコンテナー

コンテナー

該当なし

user_id

ユーザー ID。

文字列

user

display_name

ユーザーの表示名。

文字列

user

suspended

ユーザーが一時停止した場合は True。

ブール値

user

max_buckets

ユーザーが所有するバケットの最大数。

整数

user

subusers

このユーザーアカウントに関連付けられたサブユーザー。

コンテナー

user

keys

このユーザーアカウントに関連付けられた S3 キー。

コンテナー

user

swift_keys

このユーザーアカウントに関連付けられた Swift 鍵。

コンテナー

user

caps

ユーザーケイパビリティー。

コンテナー

user

成功すると、応答にはユーザー情報が含まれます。

表1.8 特別なエラーレスポンス

名前説明コード

UserExists

既存のユーザーの作成を試行。

409 Conflict

InvalidAccessKey

無効なアクセスキーが指定されている。

400 Bad Request

InvalidKeyType

無効なキータイプが指定されている。

400 Bad Request

InvalidSecretKey

無効なシークレットキーが指定されている。

400 Bad Request

InvalidKeyType

無効なキータイプが指定されている。

400 Bad Request

KeyExists

提供されたアクセスキーが存在し、別のユーザーに属している。

409 Conflict

EmailExists

提供されるメールアドレスが存在する。

409 Conflict

InvalidCap

無効な管理者ケイパビリティーの付与を試行。

400 Bad Request

サブユーザーの作成については、「サブユーザーの作成」 を参照してください。

API 関数リストに戻ります。

1.3.5. ユーザーの変更

既存ユーザーの変更

caps
users=write

構文

POST /admin/user?format=json HTTP/1.1
Host: <Fully_Qualified_Domain_Name>

表1.9 リクエストパラメーター

名前説明必須

uid

変更するユーザー ID。

文字列

foo_user

はい

display-name

変更されるユーザーの表示名。

文字列

foo ユーザー

いいえ

email

ユーザーに関連付けるメールアドレス。

文字列

foo@bar.com

いいえ

generate-key

新しいキーペアを生成し、既存のキーリングに追加します。

ブール値

True [False]

いいえ

access-key

アクセスキーを指定します。

文字列

ABCD0EF12GHIJ2K34LMN

いいえ

secret-key

シークレットキーを指定します。

文字列

0AbCDEFg1h2i34JklM5nop6QrSTUV+WxyzaBC7D8

いいえ

key-type

生成されるキータイプ。オプションは swift、s3 (デフォルト) です。

文字列

s3

いいえ

user-caps

ユーザーケイパビリティー。

文字列

usage=read, write; users=read

いいえ

max-buckets

ユーザーが所有できるバケットの最大数を指定します。

整数

500 [1000]

いいえ

suspended

ユーザーが一時停止されるかどうかを指定します。

ブール値

False [False]

No

表1.10 レスポンスエンティティー

名前説明タイプ

user

ユーザーデータ情報のコンテナー

コンテナー

該当なし

user_id

ユーザー ID。

文字列

user

display_name

ユーザーの表示名。

文字列

user

suspended

ユーザーが一時停止した場合は True。

ブール値

user

max_buckets

ユーザーが所有するバケットの最大数。

整数

user

subusers

このユーザーアカウントに関連付けられたサブユーザー。

コンテナー

user

keys

このユーザーアカウントに関連付けられた S3 キー。

コンテナー

user

swift_keys

このユーザーアカウントに関連付けられた Swift 鍵。

コンテナー

user

caps

ユーザーケイパビリティー。

コンテナー

user

成功すると、応答にはユーザー情報が含まれます。

表1.11 特別なエラーレスポンス

名前説明コード

InvalidAccessKey

無効なアクセスキーが指定されている。

400 Bad Request

InvalidKeyType

無効なキータイプが指定されている。

400 Bad Request

InvalidSecretKey

無効なシークレットキーが指定されている。

400 Bad Request

KeyExists

提供されたアクセスキーが存在し、別のユーザーに属している。

409 Conflict

EmailExists

提供されるメールアドレスが存在する。

409 Conflict

InvalidCap

無効な管理者ケイパビリティーの付与を試行。

400 Bad Request

サブユーザーの変更については、「サブユーザーの変更」 を参照してください。

API 関数リストに戻ります。

1.3.6. ユーザーの削除

既存のユーザーを削除します。

caps
users=write

構文

DELETE /admin/user?format=json HTTP/1.1
Host: <Fully_Qualified_Domain_Name>

表1.12 リクエストパラメーター

名前説明必須

uid

削除するユーザー ID。

文字列

foo_user

はい。

purge-data

指定すると、ユーザーに属するバケットとオブジェクトも削除されます。

ブール値

True

No

レスポンスエンティティー

なし。

特別なエラーレスポンス

なし。

サブユーザーの削除については、「サブユーザーの削除」 を参照してください。

API 関数リストに戻ります。

1.3.7. サブユーザーの作成

Swift API を使用するクライアントに主に役立つ新しいサブユーザーを作成します。有効なリクエストには、gen-subuser または subuser のいずれかが必要であることに注意してください。また、通常、サブユーザーには access を指定してパーミッションを付与する必要があることに注意してください。ユーザー作成 (subusersecret なしで指定されている場合) と同様に、シークレットキーは自動的に生成されます。

caps
users=write

構文

PUT /admin/user?subuser&format=json HTTP/1.1
Host <Fully_Qualified_Domain_Name>

表1.13 リクエストパラメーター

名前説明必須

uid

サブユーザーを作成するユーザー ID。

文字列

foo_user

はい

subuser

作成するサブユーザー ID を指定します。

文字列

sub_foo

必須 (または gen-subuser)

gen-subuser

作成するサブユーザー ID を指定します。

文字列

sub_foo

はい (または subuser)

secret-key

シークレットキーを指定します。

文字列

0AbCDEFg1h2i34JklM5nop6QrSTUVWxyzaBC7D8

いいえ

key-type

生成されるキータイプ。オプションは swift (デフォルト)、s3 です。

文字列

swift [swift]

いいえ

access

サブユーザーのアクセスパーミッションを設定する場合は、read, write, readwrite, full のいずれかである必要があります。

文字列

read

いいえ

generate-secret

秘密鍵を生成します。

ブール値

True [False]

No

表1.14 レスポンスエンティティー

名前説明タイプ

subusers

ユーザーアカウントに関連付けられたサブユーザー

コンテナー

該当なし

id

サブユーザー ID。

文字列

subusers

permissions

ユーザーアカウントへのサブユーザーアクセス

文字列

subusers

成功すると、レスポンスにはサブユーザー情報が含まれます。

表1.15 特別なエラーレスポンス

名前説明コード

SubuserExists

指定したサブユーザーが存在する。

409 Conflict

InvalidKeyType

無効なキータイプが指定されている。

400 Bad Request

InvalidSecretKey

無効なシークレットキーが指定されている。

400 Bad Request

InvalidAccess

無効なサブユーザーアクセスが指定されている。

400 Bad Request

API 関数リストに戻ります。

1.3.8. サブユーザーの変更

既存のサブユーザーを変更します。

caps
users=write

構文

POST /admin/user?subuser&format=json HTTP/1.1
Host <Fully_Qualified_Domain_Name>

表1.16 リクエストパラメーター

名前説明必須

uid

サブユーザーを変更するユーザー ID。

文字列

foo_user

はい

subuser

変更するサブユーザー ID。

文字列

sub_foo

はい

generate-secret

サブユーザーの新しい秘密鍵を生成し、既存のキーを置き換えます。

ブール値

True [False]

いいえ

secret

シークレットキーを指定します。

文字列

0AbCDEFg1h2i34JklM5nop6QrSTUV+WxyzaBC7D8

いいえ

key-type

生成されるキータイプ。オプションは swift (デフォルト)、s3 です。

文字列

swift [swift]

いいえ

access

サブユーザーのアクセスパーミッションを設定する場合は、read, write, readwrite, full のいずれかである必要があります。

文字列

read

いいえ

表1.17 レスポンスエンティティー

名前説明タイプ

subusers

ユーザーアカウントに関連付けられたサブユーザー

コンテナー

該当なし

id

サブユーザー ID。

文字列

subusers

permissions

ユーザーアカウントへのサブユーザーアクセス

文字列

subusers

成功すると、レスポンスにはサブユーザー情報が含まれます。

表1.18 特別なエラーレスポンス

名前説明コード

InvalidKeyType

無効なキータイプが指定されている。

400 Bad Request

InvalidSecretKey

無効なシークレットキーが指定されている。

400 Bad Request

InvalidAccess

無効なサブユーザーアクセスが指定されている。

400 Bad Request

API 関数リストに戻ります。

1.3.9. サブユーザーの削除

既存のサブユーザーを削除します。

caps
users=write

構文

DELETE /admin/user?subuser&format=json HTTP/1.1
Host <Fully_Qualified_Domain_Name>

表1.19 リクエストパラメーター

名前説明必須

uid

サブユーザーを削除するユーザー ID。

文字列

foo_user

はい

subuser

削除されるサブユーザー ID。

文字列

sub_foo

はい

purge-keys

サブユーザーに属する鍵を削除します。

ブール値

True [True]

No

レスポンスエンティティー

なし。

特別なエラーレスポンス

なし。

API 関数リストに戻ります。

1.3.10. キーの作成

新規のキーを作成します。subuser を指定すると、デフォルトで作成されたキーは swift タイプになります。access-key または secret-key のいずれかのみが指定された場合、コミットされたキーは自動的に生成されます。secret-key のみが指定されている場合、access-key は自動的に生成されます。デフォルトでは、生成されたキーは、既存のキーペアを置き換えることなくキーリングに追加されます。access-key が指定され、ユーザーが所有する既存のキーを参照すると、そのキーは変更されます。レスポンスは、作成された鍵と同じタイプの鍵をすべて一覧表示するコンテナーです。swift キーの作成時には、access-key オプションを指定しても効果はありません。また、ユーザーまたはサブユーザーごとに 1 つの swift キーのみを保持することができます。

caps
users=write

構文

PUT /admin/user?key&format=json HTTP/1.1
Host <Fully_Qualified_Domain_Name>

表1.20 リクエストパラメーター

名前説明必須

uid

新しいキーを受け取るユーザー ID。

文字列

foo_user

はい

subuser

新しいキーを受け取るサブユーザー ID。

文字列

sub_foo

いいえ

key-type

生成されるキータイプ。オプションは swift、s3 (デフォルト) です。

文字列

s3 [s3]

いいえ

access-key

アクセスキーを指定します。

文字列

AB01C2D3EF45G6H7IJ8K

いいえ

secret-key

秘密鍵を指定します。

文字列

0ab/CdeFGhij1klmnopqRSTUv1WxyZabcDEFgHij

いいえ

generate-key

新しいキーペアを生成し、既存のキーリングに追加します。

ブール値

True [True]

いいえ

表1.21 レスポンスエンティティー

名前説明タイプ

keys

このユーザーアカウントに関連付けられたタイプのキー。

コンテナー

該当なし

user

キーに関連付けられたユーザーアカウント。

文字列

keys

access-key

アクセスキー。

文字列

keys

secret-key

シークレットキー

文字列

keys

表1.22 特別なエラーレスポンス

名前説明コード

InvalidAccessKey

無効なアクセスキーが指定されている。

400 Bad Request

InvalidKeyType

無効なキータイプが指定されている。

400 Bad Request

InvalidSecretKey

無効なシークレットキーが指定されている。

400 Bad Request

InvalidKeyType

無効なキータイプが指定されている。

400 Bad Request

KeyExists

提供されたアクセスキーが存在し、別のユーザーに属している。

409 Conflict

API 関数リストに戻ります。

1.3.11. キーの削除

既存のキーを削除します。

caps
users=write

構文

DELETE /admin/user?key&format=json HTTP/1.1
Host <Fully_Qualified_Domain_Name>

表1.23 リクエストパラメーター

名前説明必須

access-key

削除する S3 キーペアに属する S3 アクセスキー。

文字列

AB01C2D3EF45G6H7IJ8K

はい

uid

キーの削除元のユーザー。

文字列

foo_user

いいえ

subuser

キーの削除元のサブユーザー。

文字列

sub_foo

いいえ

key-type

削除するキータイプ。オプションは swift、s3 です。注記: swift キーを削除するために必要です。

文字列

swift

いいえ

特別なエラーレスポンス

なし。

レスポンスエンティティー

なし。

API 関数リストに戻ります。

1.3.12. バケット情報の取得

既存バケットのサブセットに関する情報を取得します。uidbucket なしで指定されると、そのユーザーに属するすべてのバケットが返されます。bucket のみが指定されている場合は、その特定のバケットの情報を取得します。

caps
buckets=read

構文

GET /admin/bucket?format=json HTTP/1.1
Host <Fully_Qualified_Domain_Name>

表1.24 リクエストパラメーター

名前説明必須

bucket

情報を返すバケット。

文字列

foo_bucket

いいえ

uid

バケット情報を取得するユーザー。

文字列

foo_user

いいえ

stats

バケットの統計を返します。

ブール値

True [False]

No

表1.25 レスポンスエンティティー

名前説明タイプ

stats

バケットごとの情報

コンテナー

該当なし

buckets

1 つ以上のバケットコンテナーの一覧が含まれます。

コンテナー

bucket

単一バケット情報用のコンテナー。

コンテナー

buckets

name

バケットの名前。

文字列

bucket

pool

バケットが保存されているプール。

文字列

bucket

id

一意のバケット ID。

文字列

bucket

marker

内部バケットタグ。

文字列

bucket

owner

バケット所有者のユーザー ID。

文字列

bucket

usage

ストレージの使用情報。

コンテナー

bucket

index

要求に成功すると、必要なバケット情報が含まれるバケットコンテナーが返されます。

表1.26 特別なエラーレスポンス

名前説明コード

IndexRepairFailed

バケットのインデックスが失敗しました。

409 Conflict

API 関数リストに戻ります。

1.3.13. バケットインデックスの確認

既存のバケットのインデックスを確認します。

注記

check-objects で複数パートオブジェクトアカウンティングを確認するには、fix を True に設定する必要があります。

caps
buckets=write

構文

GET /admin/bucket?index&format=json HTTP/1.1
Host <Fully_Qualified_Domain_Name>

表1.27 リクエストパラメーター

名前説明必須

bucket

情報を返すバケット。

文字列

foo_bucket

はい

check-objects

複数パートオブジェクトアカウンティングを確認します。

ブール値

True [False]

いいえ

fix

また、チェック時にバケットインデックスも修正します。

ブール値

False [False]

No

表1.28 レスポンスエンティティー

名前説明

index

バケットインデックスのステータス。

文字列

表1.29 特別なエラーレスポンス

名前説明コード

IndexRepairFailed

バケットのインデックスが失敗しました。

409 Conflict

API 関数リストに戻ります。

1.3.14. バケットの削除

既存のバケットを削除します。

caps
buckets=write

構文

DELETE /admin/bucket?format=json HTTP/1.1
Host <Fully_Qualified_Domain_Name>

表1.30 リクエストパラメーター

名前説明必須

bucket

削除するバケット。

文字列

foo_bucket

はい

purge-objects

削除前にバケットオブジェクトを削除します。

ブール値

True [False]

No

レスポンスエンティティー

なし。

表1.31 特別なエラーレスポンス

名前説明コード

BucketNotEmpty

空でないバケットの削除を試行しました。

409 Conflict

ObjectRemovalFailed

オブジェクトを削除できません。

409 Conflict

API 関数リストに戻ります。

1.3.17. オブジェクトの削除

既存のオブジェクトを削除します。

注記

所有者を一時停止せずに指定する必要はありません。

caps
buckets=write

構文

DELETE /admin/bucket?object&format=json HTTP/1.1
Host <Fully_Qualified_Domain_Name>

表1.37 リクエストパラメーター

名前説明必須

bucket

削除されるオブジェクトを含むバケット。

文字列

foo_bucket

はい

object

削除するオブジェクト。

文字列

foo.txt

はい

レスポンスエンティティー

なし。

表1.38 特別なエラーレスポンス

名前説明コード

NoSuchObject

指定されたオブジェクトは存在しません。

404 Not Found

ObjectRemovalFailed

オブジェクトを削除できません。

409 Conflict

API 関数リストに戻ります。

1.3.18. バケットまたはオブジェクトポリシーの取得

オブジェクトまたはバケットのポリシーを読み取ります。

caps
buckets=read

構文

GET /admin/bucket?policy&format=json HTTP/1.1
Host <Fully_Qualified_Domain_Name>

表1.39 リクエストパラメーター

名前説明必須

bucket

ポリシーを読み取るバケット。

文字列

foo_bucket

はい

object

ポリシーの読み取り元となるオブジェクト。

文字列

foo.txt

いいえ

表1.40 レスポンスエンティティー

名前説明タイプ

policy

アクセス制御ポリシー。

コンテナー

該当なし

成功した場合には、オブジェクトまたはバケットポリシーを返します。

表1.41 特別なエラーレスポンス

名前説明コード

IncompleteBody

バケットポリシー要求にバケットが指定されていないか、またはオブジェクトがオブジェクトポリシー要求に指定されていません。

400 Bad Request

API 関数リストに戻ります。

1.3.19. 既存ユーザーへの機能の追加

指定したユーザーに管理ケイパビリティーを追加します。

caps
users=write

構文

PUT /admin/user?caps&format=json HTTP/1.1
Host <Fully_Qualified_Domain_Name>

表1.42 リクエストパラメーター

名前説明必須

uid

管理機能を追加するユーザー ID。

文字列

foo_user

はい

user-caps

ユーザーに追加する管理キャパシティー。

文字列

usage=read, write

はい

表1.43 レスポンスエンティティー

名前説明タイプ

user

ユーザーデータ情報のコンテナー

コンテナー

該当なし

user_id

ユーザー ID。

文字列

user

caps

ユーザーケイパビリティー。

コンテナー

user

成功すると、レスポンスにはユーザーのケイパビリティーが含まれます。

表1.44 特別なエラーレスポンス

名前説明コード

InvalidCap

無効な管理者ケイパビリティーの付与を試行。

400 Bad Request

API 関数リストに戻ります。

1.3.19.1. 要求の例

PUT /admin/user?caps&format=json HTTP/1.1
Host: <Fully_Qualified_Domain_Name>
Content-Type: text/plain
Authorization: <Authorization_Token>

usage=read

1.3.20. 既存ユーザーからの機能の削除

指定したユーザーから管理ケイパビリティーを削除します。

caps
users=write

構文

DELETE /admin/user?caps&format=json HTTP/1.1
Host <Fully_Qualified_Domain_Name>

表1.45 リクエストパラメーター

名前説明必須

uid

管理ケイパビリティーを削除するユーザー ID。

文字列

foo_user

はい

user-caps

ユーザーから削除する管理ケイパビリティー。

文字列

usage=read, write

はい

表1.46 レスポンスエンティティー

名前説明タイプ

user

ユーザーデータ情報のコンテナー

コンテナー

該当なし

user_id

ユーザー ID。

文字列

user

caps

ユーザーケイパビリティー。

コンテナー

user

成功すると、レスポンスにはユーザーのケイパビリティーが含まれます。

表1.47 特別なエラーレスポンス

名前説明コード

InvalidCap

無効な管理ケイパビリティーの削除を試行します。

400 Bad Request

NoSuchCap

ユーザーは、指定されていないケイパビリティーです。

404 Not Found

API 関数リストに戻ります。

1.3.21. Quotas

管理操作 API を使用すると、ユーザーおよびユーザーが所有するバケットにクォータを設定できます。詳細は、クォータ管理 を参照してください。クォータには、バケットのオブジェクトの最大数と、メガバイト単位のストレージの最大サイズが含まれます。

クォータを表示するには、ユーザーに users=read ケイパビリティーが必要です。クォータを設定、変更、または無効にするには、ユーザーに users=write ケイパビリティーが必要です。詳細は、管理(CLI)を参照してください。

クォータの有効なパラメーターには以下が含まれます。

  • Bucket: bucket オプションでは、ユーザーが所有するバケットのクォータを指定できます。
  • Maximum Objects: max-objects 設定では、オブジェクトの最大数を指定できます。負の値を設定すると、この設定が無効になります。
  • Maximum Size: max-size オプションでは、バイトの最大数のクォータを指定できます。負の値を設定すると、この設定が無効になります。
  • Quota Scope: quota-scope オプションは、クォータのスコープを設定します。オプションは bucketuser です。

API 関数リストに戻ります。

1.3.21.1. ユーザークォータの取得

クォータを取得するには、read パーミッションを持つ users ケイパビリティーが設定されている必要があります。

構文

GET /admin/user?quota&uid=<uid>&quota-type=user

API 関数リストに戻ります。

1.3.21.2. ユーザークォータの設定

クォータを設定するには、ユーザーに write パーミッションを持つ users ケイパビリティーを設定する必要があります。

構文

PUT /admin/user?quota&uid=<uid>&quota-type=user

コンテンツには、対応する読み取り操作でエンコードされているクォータ設定の JSON 表現が含まれている必要があります。

API 関数リストに戻ります。

1.3.21.3. バケットクォータの取得

クォータを取得するには、read パーミッションを持つ users ケイパビリティーが設定されている必要があります。

構文

GET /admin/user?quota&uid=<uid>&quota-type=bucket

API 関数リストに戻ります。

1.3.21.4. バケットクォータの設定

クォータを設定するには、ユーザーに write パーミッションを持つ users ケイパビリティーを設定する必要があります。

構文

PUT /admin/user?quota&uid=<uid>&quota-type=bucket

コンテンツには、対応する読み取り操作でエンコードされているクォータ設定の JSON 表現が含まれている必要があります。

API 関数リストに戻ります。

1.3.22. 標準エラーレスポンス

名前説明コード

AccessDenied

アクセスが拒否されました。

403 forbidden

InternalError

内部サーバーエラー。

500 Internal Server Error

NoSuchUser

ユーザーが存在しない。

404 Not Found

NoSuchBucket

バケットが存在しません。

404 Not Found

NoSuchKey

そのようなアクセスキーはありません。

404 Not Found

第2章 Object Gateway S3 アプリケーションプログラミングインターフェイス(API)

Red Hat Ceph Object Gateway は、Amazon S3 API の基本的なデータアクセスモデルと互換性のある RESTful API をサポートします。

以下の表は、現在の Amazon S3 機能機能のサポートステータスについて説明しています。

表2.1 機能

機能状態備考

バケットの一覧表示

サポート対象

 

バケットの作成

サポート対象

固定 ACL のさまざまなセット

Put Bucket Lifecycle

一部サポート対象

ExpirationNoncurrentVersionExpiration および AbortIncompleteMultipartUpload がサポートされます。

バケットの取得

サポート対象

 

バケットライフサイクルの取得

一部サポート対象

ExpirationNoncurrentVersionExpiration および AbortIncompleteMultipartUpload がサポートされます。

バケットの場所の取得

サポート対象

 

バケットバージョン管理の取得

サポート対象

 

バケットの削除

サポート対象

 

バケットライフサイクルの削除

サポート対象

 

バケット ACL (Get)

サポート対象

固定 ACL のさまざまなセット

バケット CORS (Get)

サポート対象

 

バケットオブジェクトのバージョン

サポート対象

 

HEAD バケット

サポート対象

 

バケットマルチパートアップロードの一覧表示

サポート対象

 

バケットライフサイクル

一部サポート対象

ExpirationNoncurrentVersionExpiration および AbortIncompleteMultipartUpload がサポートされます。

ポリシー(Buckets)

一部サポート対象

 

バケット Web サイト

サポート対象

 

バケット要求の支払い(Get)

サポート対象

 

Put Object

サポート対象

 

オブジェクトの削除

サポート対象

 

オブジェクトの取得

サポート対象

 

オブジェクト ACL (Get)

サポート対象

 

オブジェクト情報の取得(HEAD)

サポート対象

 

オブジェクトのコピー

サポート対象

 

Post Object

サポート対象

 

Options Object

サポート対象

 

複数オブジェクトの削除

サポート対象

 

Initiate Multipart Upload

サポート対象

 

Initiate Multipart Upload Part

サポート対象

 

List Multipart Upload Parts

サポート対象

 

complete Multipart Upload

サポート対象

 

Abort Multipart Upload

サポート対象

 

Copy Multipart Upload

サポート対象

 

マルチテナンシー

サポート対象

 

以下の表は、サポートされていない一般的なリクエストヘッダーフィールドの一覧です。

表2.2 サポートされないヘッダーフィールド

名前

x-amz-security-token

リクエスト

Server

レスポンス

x-amz-delete-marker

レスポンス

x-amz-id-2

レスポンス

x-amz-request-id

レスポンス

x-amz-version-id

応答

2.1. S3 API サーバー側の暗号化

Ceph Object Gateway は、S3 API のアップロードされたオブジェクトのサーバー側の暗号化をサポートしています。サーバー側の暗号化とは、S3 クライアントが暗号化されていない形式で HTTP 経由でデータを送信し、Ceph Object Gateway はそのデータを暗号化した形式で Ceph Storage Cluster に保存することを意味します。

注記

Red Hat は、SLO(Static Large Object) または DLO(Dynamic Large Object) の S3 オブジェクト暗号化をサポートしません。

重要

暗号化を使用するには、クライアントリクエストは、SSL 接続上でリクエストを送信する 必要があります。Red Hat は、Ceph Object Gateway が SSL を使用しない限り、クライアントからの S3 暗号化をサポートしません。ただし、テスト目的で、管理者は、ランタイム時に rgw_crypt_require_ssl 設定を false に設定し、Ceph 設定ファイルで false に設定して、Ansible 設定ファイルで false に設定し、Ceph Object Gateway の Ansible Playbook を再生して、テスト中に SSL を無効にすることができます。

暗号化キーの管理には、以下の 2 つのオプションがあります。

お客様提供のキー

お客様が提供する鍵を使用する場合、S3 クライアントは暗号鍵を各リクエストと共に渡して、暗号化されたデータの読み取りまたは書き込みを行います。これらのキーを管理するのは、お客様の責任です。各オブジェクトの暗号化に使用する Ceph Object Gateway の鍵を覚えておく必要があります。

Ceph Object Gateway は、Amazon SSE-C 仕様に従って、S3 API で顧客提供のキー動作を実装します。

お客様がキー管理を処理し、S3 クライアントはキーを Ceph Object Gateway に渡すため、Ceph Object Gateway ではこの暗号化モードをサポートするための特別な設定は必要ありません。

キー管理サービス

キー管理サービスを使用する場合、セキュアなキー管理サービスはキーを格納し、Ceph Object Gateway はデータの暗号化または復号の要求に対応するためにキーをオンデマンドで取得します。

Ceph Object Gateway は、Amazon SSE-KMS 仕様に従って S3 API にキー管理サービスの動作を実装します。

重要

現在、テスト済みの唯一のキー管理実装は OpenStack Barbican を使用します。ただし、OpenStack Barbican はテクノロジープレビューであるため、実稼働システムでの使用はサポートされません。

2.2. バケットポリシー

Ceph Object Gateway は、バケットに適用される Amazon S3 ポリシー言語のサブセットをサポートします。

作成および削除

Ceph Object Gateway は、CLI ツール radosgw-admin を使用するのではなく、標準の S3 操作を使用して S3 バケットポリシーを管理します。

管理者は、s3cmd コマンドを使用してポリシーを設定または削除できます。以下に例を示します。

$ cat > examplepol
{
  "Version": "2012-10-17",
  "Statement": [{
    "Effect": "Allow",
    "Principal": {"AWS": ["arn:aws:iam::usfolks:user/fred"]},
    "Action": "s3:PutObjectAcl",
    "Resource": [
      "arn:aws:s3:::happybucket/*"
    ]
  }]
}

$ s3cmd setpolicy examplepol s3://happybucket
$ s3cmd delpolicy s3://happybucket

制限事項

Ceph Object Gateway がサポートするのは以下の S3 アクションだけです。

  • s3:AbortMultipartUpload
  • s3:CreateBucket
  • s3:DeleteBucketPolicy
  • s3:DeleteBucket
  • s3:DeleteBucketWebsite
  • s3:DeleteObject
  • s3:DeleteObjectVersion
  • s3:GetBucketAcl
  • s3:GetBucketCORS
  • s3:GetBucketLocation
  • s3:GetBucketPolicy
  • s3:GetBucketRequestPayment
  • s3:GetBucketVersioning
  • s3:GetBucketWebsite
  • s3:GetLifecycleConfiguration
  • s3:GetObjectAcl
  • s3:GetObject
  • s3:GetObjectTorrent
  • s3:GetObjectVersionAcl
  • s3:GetObjectVersion
  • s3:GetObjectVersionTorrent
  • s3:ListAllMyBuckets
  • s3:ListBucketMultiPartUploads
  • s3:ListBucket
  • s3:ListBucketVersions
  • s3:ListMultipartUploadParts
  • s3:PutBucketAcl
  • s3:PutBucketCORS
  • s3:PutBucketPolicy
  • s3:PutBucketRequestPayment
  • s3:PutBucketVersioning
  • s3:PutBucketWebsite
  • s3:PutLifecycleConfiguration
  • s3:PutObjectAcl
  • s3:PutObject
  • s3:PutObjectVersionAcl
注記

Ceph Object Gateway は、ユーザー、グループ、またはロールへのポリシー設定をサポートしません。

Ceph Object Gateway は、Amazon の 12 桁のアカウント ID の代わりに RGW の tenant 識別子を使用します。Amazon Web Service (AWS) S3 と Ceph Object Gateway S3 との間でポリシーを使用する場合、Ceph Object Gateway は、ユーザーの作成時に Amazon アカウント ID をテナント ID として使用する必要があります。

AWS S3 では、すべてのテナントが単一の名前空間を共有します。対照的に、Ceph Object Gateway はすべてのテナントにバケットの独自の名前空間を提供します。現在、別のテナントに属するバケットにアクセスしようとしている Ceph Object Gateway クライアントは、S3 リクエストの tenant:bucket としてそれを処理する必要があります。

AWS では、バケットポリシーは別のアカウントへのアクセスを許可し、そのアカウントの所有者はユーザーパーミッションを持つ個々のユーザーにアクセス権限を付与できます。Ceph Object Gateway はユーザー、ロール、およびグループのパーミッションをサポートしていません。そのため、アカウントの所有者は個々のユーザーに直接アクセスを付与する必要があります。

重要

アカウント全体のアクセスをバケットに付与すると、そのアカウントのすべてのユーザーにアクセス権限が付与されます。

バケットポリシーは文字列の補正を サポートしません

Ceph Object Gateway では、以下の条件キーがサポートされます。

  • aws:CurrentTime
  • aws:EpochTime
  • aws:PrincipalType
  • aws:Referer
  • aws:SecureTransport
  • aws:SourceIp
  • aws:UserAgent
  • aws:username

Ceph Object Gateway のみ は、ListBucket アクションの以下の条件キーをサポートします。

  • s3:prefix
  • s3:delimiter
  • s3:max-keys

Swift への影響

Ceph Object Gateway は、Swift API にバケットポリシーを設定する機能はありません。ただし、S3 API で設定されているバケットポリシーは Swift と S3 のいずれの操作も管理します。

Ceph Object Gateway は、ポリシーで指定されたプリンシパルに対して Swift の認証情報と一致します。

2.3. 認証およびアクセス制御リスト

Ceph Object Gateway への要求は、認証または認証解除のいずれかになります。Ceph Object Gateway は、認証されていないリクエストが匿名ユーザーによって送信されることを前提としています。Ceph Object Gateway は、固定 ACL をサポートしています。

2.3.1. 認証

ほとんどのユースケースでは、クライアントは Java 用の Amazon SDK の AmazonS3Client などの既存のオープンソースライブラリーを使用し、Python Boto ではアクセスキーとシークレットキーを渡すだけで、ライブラリーは要求ヘッダーと認証署名をビルドします。ただし、リクエストを作成して署名することもできます。

リクエストの認証には、Ceph Object Gateway サーバーに送信される前に、アクセスキーとベース 64 でエンコードされた Hash-based Message Authentication Code (HMAC)をリクエストに含める必要があります。Ceph Object Gateway は S3 互換の認証を使用します。

HTTP/1.1
PUT /buckets/bucket/object.mpeg
Host: cname.domain.com
Date: Mon, 2 Jan 2012 00:01:01 +0000
Content-Encoding: mpeg
Content-Length: 9999999

Authorization: AWS <access_key>:<hash_of_header_and_secret>

前述の例では、< access_key> を アクセスキー ID の値に置き換え、その後にコロン()を追加 します。&lt ;hash_of_header_and_secret > を、正規化されたヘッダー文字列のハッシュおよびアクセスキー ID に対応するシークレットに置き換えます。

ヘッダー文字列およびシークレットのハッシュを生成するには、以下を行う必要があります。

  1. ヘッダー文字列の値を取得します。
  2. 要求ヘッダー文字列を正規形式に正規化します。
  3. SHA-1 ハッシュアルゴリズムを使用して HMAC を生成します。
  4. hmac の結果を base-64 としてエンコードします。

ヘッダーを正規の形式に正規化するには、以下を行います。

  1. すべての content- ヘッダーを取得します。
  2. content-type および content-md5 以外の content- ヘッダーをすべて削除します。
  3. content- ヘッダー名が小文字であることを確認します。
  4. content- ヘッダーの辞書式で並べ替えます。
  5. Date ヘッダー AND があることを確認します。指定した日付が、オフセットではなく GMT を使用していることを確認してください。
  6. x-amz- で始まるヘッダーをすべて取得します。
  7. x-amz- ヘッダーがすべて小文字であることを確認します。
  8. x-amz- ヘッダーの辞書式で並べ替えます。
  9. 同じフィールド名の複数のインスタンスを単一のフィールドに組み合わせ、フィールド値をコンマで区切ります。
  10. ヘッダー値の空白文字および改行文字を、単一スペースに置き換えます。
  11. コロンの前後に空白を削除します。
  12. 各ヘッダーの後に新しい行を追加します。
  13. ヘッダーを要求ヘッダーにマージします。

< hash_of_header_and_secret > を base-64 でエンコードされた HMAC 文字列に置き換えます。

詳細は、Amazon Simple Storage Service ドキュメントの Signing and Authenticating REST Requests セクションを参照してください。

2.3.2. アクセス制御リスト(ACL)

Ceph Object Gateway は S3 互換の ACL 機能をサポートします。ACL は、ユーザーがバケットまたはオブジェクトで実行できる操作を指定するアクセス権限の一覧です。それぞれの付与は、バケットに適用するか、またはオブジェクトに適用される場合の異なる意味を持ちます。

表2.3 ユーザー操作

パーミッションバケットObject

READ

パーミッションを得たユーザーは、バケットのオブジェクトを一覧表示できます。

パーミッションを得たユーザーは、オブジェクトを読み取りできます。

WRITE

パーミッションを得たユーザーは、バケットのオブジェクトを書き込みまたは削除できます。

該当なし

READ_ACP

パーミッションを得たユーザーは、バケット ACL を読み取ることができます。

パーミッションを得たユーザーは、オブジェクト ACL を読み取ることができます。

WRITE_ACP

パーミッションを得たユーザーは、バケット ACL を書き込めます。

パーミッションを得たユーザーは、オブジェクト ACL に書き込めます。

FULL_CONTROL

Grantee にはバケットのオブジェクトに対する完全なパーミッションがあります。

パーミッションを得たユーザーは、オブジェクト ACL に読み取りまたは書き込みできます。

2.3.3. STS Lite API を使用した認証(テクノロジープレビュー)

Ceph Object Gateway は、Amazon Secure Token Service (STS) REST API のサブセットのサポートを提供します。STS Lite は、アイデンティティーおよびアクセス管理の一時的な認証情報のセットへのアクセスを提供します。

STS Lite 認証メカニズムは、Ceph Object Gateway の Keystone と統合されます。Amazon Web Services (AWS)の認証情報のセットを Keystone で認証した後に、一時的なセキュリティー認証情報のセットが返されます。STS エンジンは、後続の S3 呼び出しによって行われるこれらの一時的なセキュリティー認証情報を認証し、Keystone サーバーへの負荷が少なくなります。

Ceph Object Gateway は、以下の STS Lite REST API を実装します。

GetSessionToken

AWS 認証情報のセットの一時的なセキュリティー認証情報のセットを返します。Keystone での初期認証にはこの API を使用し、返された一時的な認証情報を使用して後続の S3 呼び出しを実行できます。一時的な認証情報には、AWS 認証情報と同じパーミッションがあります。

パラメーター:

DurationSeconds (整数/オプション)
認証情報が有効でなければならない期間(秒単位)。デフォルト値は 3600 秒です。最大値は 43200 秒です。この値は、Ceph 設定ファイルの rgw_sts_max_session オプションを使用して設定できます(デフォルトでは /etc/ceph/ceph.conf ファイル)。
serialNumber (文字列/オプション)
GetSessionToken 呼び出しを行うユーザーに関連付けられた Multi-Factor Authentication (MFA)デバイスの ID 番号。
TokenCode (文字列/オプション)
MFA デバイスが提供する値(MFA が必要な場合)。
AssumeRole

アカウント間のアクセスに使用できる一時的な認証情報のセットを返します。一時的な認証情報には、Role に割り当てられたパーミッションと AssumeRole API で割り当てられたポリシーとポリシーの両方が許可されるパーミッションがあります。

パラメーター:

RoleArn (文字列/必須)
アサートするロールの Amazon Resource Name (ARN)。
RoleSessionName (文字列/必須)

想定されるロールセッションの識別子。

Policy (文字列/オプション):
JSON 形式の IAM ポリシー。
DurationSeconds (整数/オプション)
セッションの期間(秒単位)。デフォルト値は 3600 です。
externalID (文字列/オプション)
ロールが別のアカウントで仮定される際に使用される一意の ID。
serialNumber (文字列/オプション)
AssumeRole 呼び出しを行うユーザーに関連付けられた MFA デバイスの識別子番号。
TokenCode (文字列/オプション)
MFA デバイスによって提供される値(想定されているロールの信頼ポリシーに MFA が必要な場合)。

関連情報

2.4. ゲートウェイへのアクセス

さまざまなプログラミング言語を使用してゲートウェイサーバーとの接続を作成し、バケット管理タスクを実行できます。ゲートウェイでの認証に使用されるこれらのプログラミング言語には、さまざまなオープンソースライブラリーを利用できます。

以下のセクションでは、一般的なプログラミング言語の手順を説明します。

2.4.1. 前提条件

ゲートウェイサーバーにアクセスする前に、Ceph Object Gateway ノードの前提条件に従う必要があります。前提条件は以下のとおりです。

  1. オペレーティングシステムに基づく指示に従って、ゲートウェイサーバーを適切に設定します。

    1. Red Hat Enterprise Linux の場合は、Red hat Enterprise Linux Installation Guide の Ceph Object Gateway Installation の 章を参照してください。
    2. Ubuntu の場合は、Installation Guide for Ubuntu の Ceph Object Gateway Installation の章を参照してください。
  2. Ceph 設定ファイルを変更してポート 80 を使用するようにし、Civetweb がデフォルトの Ansible に設定されたポートである 8080 を使用することは変更 しないでください
  3. root で、ファイアウォールのポート 8080 を開きます。

    # firewall-cmd --zone=public --add-port=8080/tcp --permanent
    # firewall-cmd --reload
  4. オブジェクトゲートウェイガイド で説明されているように、ゲートウェイに使用する DNS サーバーにワイルドカードを追加します。

    ローカル DNS キャッシュ用のゲートウェイノードを設定することもできます。これを実行するには、以下の手順を実行します。

    1. rootdnsmasq をインストールおよび設定します。

      # yum install dnsmasq
      # echo "address=/.<FQDN_of_gateway_node>/<IP_of_gateway_node>" | tee --append /etc/dnsmasq.conf
      # systemctl start dnsmasq
      # systemctl enable dnsmasq

      &lt ;IP_of_gateway_node > および < FQDN_of_gateway_node > をゲートウェイノードの IP アドレスと FQDN に置き換えます。

    2. root で NetworkManager を停止します。

      # systemctl stop NetworkManager
      # systemctl disable NetworkManager
    3. root として、ゲートウェイサーバーの IP を名前空間として設定します。

      # echo "DNS1=<IP_of_gateway_node>" | tee --append /etc/sysconfig/network-scripts/ifcfg-eth0
      # echo "<IP_of_gateway_node> <FQDN_of_gateway_node>" | tee --append /etc/hosts
      # systemctl restart network
      # systemctl enable network
      # systemctl restart dnsmasq

      &lt ;IP_of_gateway_node > および < FQDN_of_gateway_node > をゲートウェイノードの IP アドレスと FQDN に置き換えます。

    4. サブドメイン要求を確認します。

      $ ping mybucket.<FQDN_of_gateway_node>

      &lt ;FQDN_of_gateway_node> をゲートウェイノードの FQDN に置き換えます。

      警告

      ローカルの DNS キャッシュ用にゲートウェイサーバーを設定することは、テスト目的のみを目的としています。これを行った後は、外部ネットワークにはアクセスできなくなります。Ceph クラスターおよびゲートウェイノードに適切な DNS サーバーを使用することを強く推奨します。

  5. UbuntuObject Gateway Guide for Red Hat Enterprise Linux または Object Gateway Guide に記載のとおり、S3 アクセスの radosgw ユーザーを慎重に作成し、生成された access_key および secret_key をコピーします。S3 アクセス、およびそれ以降のバケット管理タスクには、これらのキーが必要です。

2.4.2. Ruby AWS::S3 Examples (aws-s3 gem)

Ruby プログラミング言語は、S3 アクセスに aws-s3 gem と共に使用できます。Ruby AWS::S3 で Ceph Object Gateway サーバーにアクセスするために使用されるノードで以下の手順を実行します。

Ruby の設定

以下の手順を実行して Ruby を設定します。

  1. root として ruby をインストールします。

    # yum install ruby
    注記

    上記のコマンドは ruby と、rubygemsruby-libs などの基本的な依存関係もインストールします。コマンドによってすべての依存関係がインストールされない場合は、個別にインストールします。

  2. root として、aws-s3 をインストールします。

    # gem install aws-s3

コネクションの作成

  1. プロジェクトディレクトリーを作成します。

    $ mkdir ruby_aws_s3
    $ cd ruby_aws_s3
  2. コネクションファイルを作成します。

    $ vim conn.rb
  3. conn.rb ファイルに以下のコンテンツを貼り付けます。

    #!/usr/bin/env ruby
    
    require 'aws/s3'
    require 'resolv-replace'
    
    AWS::S3::Base.establish_connection!(
            :server            => '<FQDN_of_gateway_node>',
            :port           => '8080',
            :access_key_id     => 'my-access-key',
            :secret_access_key => 'my-secret-key'
    )

    &lt ;FQDN_of_gateway_node> をゲートウェイノードの FQDN に置き換えます。Red Hat Enterprise Linux のオブジェクトゲートウェイガイド または Ubuntu のオブジェクトゲートウェイガイド で説明されているように、my-access-key および my-secret-key は、S3 アクセスの radosgw が作成されたときに生成された access_key および secret_key に置き換えます。

    コネクションファイルの例を以下に示します。

    #!/usr/bin/env ruby
    
    require 'aws/s3'
    
    require 'resolv-replace'
    
    AWS::S3::Base.establish_connection!(
            :server            => 'testclient.englab.pnq.redhat.com',
            :port           => '8080',
            :access_key_id     => '98J4R9P22P5CDL65HKP8',
            :secret_access_key => '6C+jcaP0dp0+FZfrRNgyGA9EzRy25pURldwje049'
    )

    ファイルを保存して、エディターを終了します。

  4. ファイルを実行可能にします。

    $ chmod +x conn.rb
  5. コマンドを実行します。

    $ ./conn.rb | echo $?

    ファイルに正しく値を指定した場合は、コマンドの出力は 0 になります。

バケットの作成

  1. 新しいファイルを作成します。

    $ vim create_bucket.rb

    以下のコンテンツをファイルに貼り付けます。

    #!/usr/bin/env ruby
    
    load 'conn.rb'
    
    AWS::S3::Bucket.create('my-new-bucket1')

    ファイルを保存して、エディターを終了します。

  2. ファイルを実行可能にします。

    $ chmod +x create_bucket.rb
  3. コマンドを実行します。

    $ ./create_bucket.rb

    コマンドの出力が true の場合は、バケット my-new-bucket1 が正常に作成されたことを意味します。

所有するバケットの一覧表示

  1. 新しいファイルを作成します。

    $ vim list_owned_buckets.rb

    以下のコンテンツをファイルに貼り付けます。

    #!/usr/bin/env ruby
    
    load 'conn.rb'
    
    AWS::S3::Service.buckets.each do |bucket|
            puts "#{bucket.name}\t#{bucket.creation_date}"
    end

    ファイルを保存して、エディターを終了します。

  2. ファイルを実行可能にします。

    $ chmod +x list_owned_buckets.rb
  3. コマンドを実行します。

    $ ./list_owned_buckets.rb

    出力は以下のようになります。

    my-new-bucket1 2016-01-21 10:33:19 UTC

オブジェクトの作成

  1. 新しいファイルを作成します。

    $ vim create_object.rb

    以下のコンテンツをファイルに貼り付けます。

    #!/usr/bin/env ruby
    
    load 'conn.rb'
    
    AWS::S3::S3Object.store(
            'hello.txt',
            'Hello World!',
            'my-new-bucket1',
            :content_type => 'text/plain'
    )

    ファイルを保存して、エディターを終了します。

  2. ファイルを実行可能にします。

    $ chmod +x create_object.rb
  3. コマンドを実行します。

    $ ./create_object.rb

    これで、文字列 Hello World!hello.txt が作成されます。

バケットの内容の一覧表示

  1. 新しいファイルを作成します。

    $ vim list_bucket_content.rb

    以下のコンテンツをファイルに貼り付けます。

    #!/usr/bin/env ruby
    
    load 'conn.rb'
    
    new_bucket = AWS::S3::Bucket.find('my-new-bucket1')
    new_bucket.each do |object|
            puts "#{object.key}\t#{object.about['content-length']}\t#{object.about['last-modified']}"
    end

    ファイルを保存して、エディターを終了します。

  2. ファイルを実行可能にします。

    $ chmod +x list_bucket_content.rb
  3. コマンドを実行します。

    $ ./list_bucket_content.rb

    出力は以下のようになります。

    hello.txt    12    Fri, 22 Jan 2016 15:54:52 GMT

空のバケットの削除

  1. 新しいファイルを作成します。

    $ vim del_empty_bucket.rb

    以下のコンテンツをファイルに貼り付けます。

    #!/usr/bin/env ruby
    
    load 'conn.rb'
    
    AWS::S3::Bucket.delete('my-new-bucket1')

    ファイルを保存して、エディターを終了します。

  2. ファイルを実行可能にします。

    $ chmod +x del_empty_bucket.rb
  3. コマンドを実行します。

    $ ./del_empty_bucket.rb | echo $?

    バケットが正常に削除されると、コマンドは 0 を出力として返します。

    注記

    create_bucket.rb ファイルを編集して、my-new-bucket9my-new-bucket10 などの空のバケットを作成し、空のバケットの削除を試みる前に上記の del_empty_bucket.rb ファイルを適宜編集してください。

空でないバケットの削除(強制的に実行)

  1. 新しいファイルを作成します。

    $ vim del_non_empty_bucket.rb

    以下のコンテンツをファイルに貼り付けます。

    #!/usr/bin/env ruby
    
    load 'conn.rb'
    
    AWS::S3::Bucket.delete('my-new-bucket1', :force => true)

    ファイルを保存して、エディターを終了します。

  2. ファイルを実行可能にします。

    $ chmod +x del_non_empty_bucket.rb
  3. コマンドを実行します。

    $ ./del_non_empty_bucket.rb | echo $?

    バケットが正常に削除されると、コマンドは 0 を出力として返します。

オブジェクトの削除

  1. 新しいファイルを作成します。

    $ vim delete_object.rb

    以下のコンテンツをファイルに貼り付けます。

    #!/usr/bin/env ruby
    
    load 'conn.rb'
    
    AWS::S3::S3Object.delete('hello.txt', 'my-new-bucket1')

    ファイルを保存して、エディターを終了します。

  2. ファイルを実行可能にします。

    $ chmod +x delete_object.rb
  3. コマンドを実行します。

    $ ./delete_object.rb

    これにより、オブジェクト hello.txt が削除されます。

2.4.3. Ruby AWS::SDK Examples (aws-sdk gem ~>2)

Ruby プログラミング言語は、S3 アクセスに aws-sdk gem と共に使用できます。Ruby AWS::SDK を使用して Ceph Object Gateway サーバーにアクセスするために使用されるノードで以下の手順を実行します。

Ruby の設定

以下の手順を実行して Ruby を設定します。

  1. root として ruby をインストールします。

    # yum install ruby
    注記

    上記のコマンドは ruby と、rubygems ruby -libs などの基本的な依存関係をインストールします。コマンドによってすべての依存関係がインストールされない場合は、個別にインストールします。

  2. root として、aws-sdk をインストールします。

    # gem install aws-sdk

コネクションの作成

  1. プロジェクトディレクトリーを作成します。

    $ mkdir ruby_aws_sdk
    $ cd ruby_aws_sdk
  2. コネクションファイルを作成します。

    $ vim conn.rb
  3. conn.rb ファイルに以下のコンテンツを貼り付けます。

    #!/usr/bin/env ruby
    
    require 'aws-sdk'
    require 'resolv-replace'
    
    Aws.config.update(
            endpoint: 'http://<FQDN_of_gateway_node>:8080',
            access_key_id: 'my-access-key',
            secret_access_key: 'my-secret-key',
            force_path_style: true,
            region: 'us-east-1'
    )

    &lt ;FQDN_of_gateway_node> をゲートウェイノードの FQDN に置き換えます。Red Hat Ceph Storage オブジェクトゲートウェイガイド で説明されているように、my-access-key および my-secret-key は、S3 アクセスの radosgw が作成されたときに生成された access_key および secret_key に置き換えます。

    コネクションファイルの例を以下に示します。

    #!/usr/bin/env ruby
    
    require 'aws-sdk'
    require 'resolv-replace'
    
    Aws.config.update(
            endpoint: 'http://testclient.englab.pnq.redhat.com:8080',
            access_key_id: '98J4R9P22P5CDL65HKP8',
            secret_access_key: '6C+jcaP0dp0+FZfrRNgyGA9EzRy25pURldwje049',
            force_path_style: true,
            region: 'us-east-1'
    )

    ファイルを保存して、エディターを終了します。

  4. ファイルを実行可能にします。

    chmod +x conn.rb
  5. コマンドを実行します。

    ./conn.rb | echo $?

    ファイルに正しく値を指定した場合は、コマンドの出力は 0 になります。

バケットの作成

  1. 新しいファイルを作成します。

    vim create_bucket.rb

    以下のコンテンツをファイルに貼り付けます。

    #!/usr/bin/env ruby
    
    load 'conn.rb'
    
    s3_client = Aws::S3::Client.new
    s3_client.create_bucket(bucket: 'my-new-bucket2')

    ファイルを保存して、エディターを終了します。

  2. ファイルを実行可能にします。

    chmod +x create_bucket.rb
  3. コマンドを実行します。

    ./create_bucket.rb

    コマンドの出力が true の場合は、バケット my-new-bucket2 が正常に作成されていることを意味します。

所有するバケットの一覧表示

  1. 新しいファイルを作成します。

    vim list_owned_buckets.rb

    以下のコンテンツをファイルに貼り付けます。

    #!/usr/bin/env ruby
    
    load 'conn.rb'
    
    s3_client = Aws::S3::Client.new
    s3_client.list_buckets.buckets.each do |bucket|
            puts "#{bucket.name}\t#{bucket.creation_date}"
    end

    ファイルを保存して、エディターを終了します。

  2. ファイルを実行可能にします。

    chmod +x list_owned_buckets.rb
  3. コマンドを実行します。

    ./list_owned_buckets.rb

    出力は以下のようになります。

    my-new-bucket2 2016-01-21 10:33:19 UTC

オブジェクトの作成

  1. 新しいファイルを作成します。

    vim create_object.rb

    以下のコンテンツをファイルに貼り付けます。

    #!/usr/bin/env ruby
    
    load 'conn.rb'
    
    s3_client = Aws::S3::Client.new
    s3_client.put_object(
            key: 'hello.txt',
            body: 'Hello World!',
            bucket: 'my-new-bucket2',
            content_type: 'text/plain'
    )

    ファイルを保存して、エディターを終了します。

  2. ファイルを実行可能にします。

    chmod +x create_object.rb
  3. コマンドを実行します。

    ./create_object.rb

    これで、文字列 Hello World!hello.txt が作成されます。

バケットの内容の一覧表示

  1. 新しいファイルを作成します。

    vim list_bucket_content.rb

    以下のコンテンツをファイルに貼り付けます。

    #!/usr/bin/env ruby
    
    load 'conn.rb'
    
    s3_client = Aws::S3::Client.new
    s3_client.list_objects(bucket: 'my-new-bucket2').contents.each do |object|
            puts "#{object.key}\t#{object.size}"
    end

    ファイルを保存して、エディターを終了します。

  2. ファイルを実行可能にします。

    chmod +x list_bucket_content.rb
  3. コマンドを実行します。

    ./list_bucket_content.rb

    出力は以下のようになります。

    hello.txt    12    Fri, 22 Jan 2016 15:54:52 GMT

空のバケットの削除

  1. 新しいファイルを作成します。

    vim del_empty_bucket.rb

    以下のコンテンツをファイルに貼り付けます。

    #!/usr/bin/env ruby
    
    load 'conn.rb'
    
    s3_client = Aws::S3::Client.new
    s3_client.delete_bucket(bucket: 'my-new-bucket2')

    ファイルを保存して、エディターを終了します。

  2. ファイルを実行可能にします。

    chmod +x del_empty_bucket.rb
  3. コマンドを実行します。

    ./del_empty_bucket.rb | echo $?

    バケットが正常に削除されると、コマンドは 0 を出力として返します。

    注記

    create_bucket.rb ファイルを編集し、my-new-bucket6my-new-bucket7 などの空のバケットを作成し、空のバケットの削除を試みる前に上記の del_empty_bucket.rb ファイルを適宜編集してください。

空でないバケットの削除(強制的に実行)

  1. 新しいファイルを作成します。

    vim del_non_empty_bucket.rb

    以下のコンテンツをファイルに貼り付けます。

    #!/usr/bin/env ruby
    
    load 'conn.rb'
    
    s3_client = Aws::S3::Client.new
    Aws::S3::Bucket.new('my-new-bucket2', client: s3_client).clear!
    s3_client.delete_bucket(bucket: 'my-new-bucket2')

    ファイルを保存して、エディターを終了します。

  2. ファイルを実行可能にします。

    chmod +x del_non_empty_bucket.rb
  3. コマンドを実行します。

    ./del_non_empty_bucket.rb | echo $?

    バケットが正常に削除されると、コマンドは 0 を出力として返します。

オブジェクトの削除

  1. 新しいファイルを作成します。

    vim delete_object.rb

    以下のコンテンツをファイルに貼り付けます。

    #!/usr/bin/env ruby
    
    load 'conn.rb'
    
    s3_client = Aws::S3::Client.new
    s3_client.delete_object(key: 'hello.txt', bucket: 'my-new-bucket2')

    ファイルを保存して、エディターを終了します。

  2. ファイルを実行可能にします。

    chmod +x delete_object.rb
  3. コマンドを実行します。

    ./delete_object.rb

    これにより、オブジェクト hello.txt が削除されます。

2.4.4. PHP S3 の例

S3 アクセスには PHP スクリプトを使用することもできます。PHP を使用して Ceph Object Gateway サーバーにアクセスするために使用されるノードで以下の手順を実行します。

重要

以下は、php v5.4.16 および aws-sdk v2.8.24 に対してテストされています。php >= 5.5+ が必要なため、php には aws-sdk の最新バージョンを使用し ない でください。PHP 5.5 は、RHEL 7 のデフォルトリポジトリーでは利用できません。php 5.5 を使用する場合は、epel およびその他のサードパーティーのリポジトリーを有効にする必要があります。また、php 5.5 および最新バージョンの aws-sdk の設定オプションも異なります。

PHP/AWS SDK の設定

PHP を設定するには、以下の手順を実行します。

  1. root として、php をインストールします。

    # yum install php
  2. php の aws-sdk をインストールします。

    php 用に aws-sdk の zip アーカイブを ダウンロード し、展開します。

コネクションの作成

  1. プロジェクトディレクトリーを作成します。

    $ mkdir php_s3
    $ cd php_s3
  2. 展開した aws ディレクトリーをプロジェクトのディレクトリーにコピーします。以下に例を示します。

    $ cp -r ~/Downloads/aws/ ~/php_s3/
  3. コネクションファイルを作成します。

    $ vim conn.php
  4. conn.php ファイルに以下のコンテンツを貼り付けます。

    <?php
    define('AWS_KEY', 'my_access_key');
    define('AWS_SECRET_KEY', 'my_secret_key');
    define('HOST', '<FQDN_of_gateway_node>');
    define('PORT', '8080');
    
    // require the AWS SDK for php library
    require '/path_to_aws/aws-autoloader.php';
    
    use Aws\S3\S3Client;
    
    // Establish connection with host using S3 Client
    $client = S3Client::factory(array(
        'base_url' => HOST,
        'port' => PORT,
        'key'      => AWS_KEY,
        'secret'   => AWS_SECRET_KEY
    ));
    ?>

    &lt ;FQDN_of_gateway_node> をゲートウェイノードの FQDN に置き換えます。Red Hat Ceph Storage オブジェクトゲートウェイガイド で説明されているように、my-access-key および my-secret-key は、S3 アクセスの radosgw が作成されたときに生成された access_key および secret_key に置き換えます。また、path_to_aws を、php プロジェクトディレクトリーにコピーした展開した aws ディレクトリーへの絶対パスに置き換えます。

    接続ファイルの例を以下に示します。

    <?php
    define('AWS_KEY', '{key}');
    define('AWS_SECRET_KEY', '{secret}');
    define('HOST', 'http://{hostname}');
    
    // require the AWS SDK for php library
    require '/home/ceph/php_s3/aws/aws-autoloader.php';
    
    use Aws\S3\S3Client;
    
    // Establish connection with host using S3 Client
    $client = S3Client::factory(array(
        'base_url' => HOST,
        'port' => PORT,
        'key'      => AWS_KEY,
        'secret'   => AWS_SECRET_KEY
    ));
    ?>

    ファイルを保存して、エディターを終了します。

  5. コマンドを実行します。

    $ php -f conn.php | echo $?

    ファイルに正しく値を指定した場合は、コマンドの出力は 0 になります。

バケットの作成

  1. 新しいファイルを作成します。

    vim create_bucket.php

    以下のコンテンツをファイルに貼り付けます。

    <?php
    
    include 'conn.php';
    
    $client->createBucket(array('Bucket' => 'my-new-bucket3'));
    
    ?>

    ファイルを保存して、エディターを終了します。

  2. コマンドを実行します。

    php -f create_bucket.php

所有するバケットの一覧表示

  1. 新しいファイルを作成します。

    vim list_owned_buckets.php

    以下のコンテンツをファイルに貼り付けます。

    <?php
    
    include 'conn.php';
    
    $blist = $client->listBuckets();
    echo "   Buckets belonging to " . $blist['Owner']['ID'] . ":\n";
    foreach ($blist['Buckets'] as $b) {
        echo "{$b['Name']}\t{$b['CreationDate']}\n";
    }
    
    ?>

    ファイルを保存して、エディターを終了します。

  2. コマンドを実行します。

    php -f list_owned_buckets.php

    出力は以下のようになります。

    my-new-bucket3 2016-01-21 10:33:19 UTC

オブジェクトの作成

  1. ソースファイル hello.txt を作成します。

    echo "Hello World!" > hello.txt
  2. 新しい php ファイルを作成します。

    vim create_object.php

    以下のコンテンツをファイルに貼り付けます。

    <?php
    
    include 'conn.php';
    
    $key         = 'hello.txt';
    $source_file = './hello.txt';
    $acl         = 'private';
    $bucket      = 'my-new-bucket3';
    $client->upload($bucket, $key, fopen($source_file, 'r'), $acl);
    
    ?>

    ファイルを保存して、エディターを終了します。

  3. コマンドを実行します。

    php -f create_object.php

    これにより、バケット my-new-bucket3 でオブジェクト hello.txt が作成されます。

バケットの内容の一覧表示

  1. 新しいファイルを作成します。

    vim list_bucket_content.php

    以下のコンテンツをファイルに貼り付けます。

    <?php
    
    include 'conn.php';
    
    $o_iter = $client->getIterator('ListObjects', array(
        'Bucket' => 'my-new-bucket3'
    ));
    foreach ($o_iter as $o) {
        echo "{$o['Key']}\t{$o['Size']}\t{$o['LastModified']}\n";
    }
    ?>

    ファイルを保存して、エディターを終了します。

  2. コマンドを実行します。

    php -f list_bucket_content.php

    出力は以下のようになります。

    hello.txt    12    Fri, 22 Jan 2016 15:54:52 GMT

空のバケットの削除

  1. 新しいファイルを作成します。

    vim del_empty_bucket.php

    以下のコンテンツをファイルに貼り付けます。

    <?php
    
    include 'conn.php';
    
    $client->deleteBucket(array('Bucket' => 'my-new-bucket3'));
    ?>

    ファイルを保存して、エディターを終了します。

  2. コマンドを実行します。

    php -f del_empty_bucket.php | echo $?

    バケットが正常に削除されると、コマンドは 0 を出力として返します。

    注記

    create_bucket.php ファイルを編集し、my-new-bucket4my-new-bucket5 などの空のバケットを作成し、空のバケットの削除を試みる前に、del_empty_bucket.php ファイルを適宜編集します。

空でないバケットの削除(強制的に実行)

現在、空でないバケットの削除は、php 2 以降のバージョンの aws-sdk ではサポートされていません。

オブジェクトの削除

  1. 新しいファイルを作成します。

    vim delete_object.php

    以下のコンテンツをファイルに貼り付けます。

    <?php
    
    include 'conn.php';
    
    $client->deleteObject(array(
        'Bucket' => 'my-new-bucket3',
        'Key'    => 'hello.txt',
    ));
    ?>

    ファイルを保存して、エディターを終了します。

  2. コマンドを実行します。

    php -f delete_object.php

    これにより、オブジェクト hello.txt が削除されます。

2.4.5. Keystone での STS Lite の設定および使用 (テクノロジープレビュー)

Amazon Secure Token Service (STS) と S3 API は、同じ名前空間に共存します。STS オプションは、Keystone オプションと組み合わせて設定できます。

注記

S3 と STS の API の両方に、Ceph Object Gateway の同じエンドポイントを使用してアクセスできます。

前提条件

  • Red Hat Ceph Storage 3.2 以降
  • 実行中の Ceph Object Gateway。
  • Boto Python モジュールのバージョン 3 以降のインストール

手順

  1. group_vars/rgws.yml ファイルを以下のオプションで開き、編集します。

    rgw_sts_key = $STS_KEY_FOR_ENCRYPTING_SESSION_TOKEN
    rgw_s3_auth_use_sts = true
  2. Ansible Playbook を再実行します。

    [user@admin ceph-ansible]$ ansible-playbook site.yml --limit rgws
  3. EC2 認証情報を生成します。

    $ openstack ec2 credentials create
    +------------+--------------------------------------------------------+
    | Field      | Value                                                  |
    +------------+--------------------------------------------------------+
    | access     | b924dfc87d454d15896691182fdeb0ef                       |
    | links      | {u'self': u'http://192.168.0.15/identity/v3/users/     |
    |            | 40a7140e424f493d8165abc652dc731c/credentials/          |
    |            | OS-EC2/b924dfc87d454d15896691182fdeb0ef'}              |
    | project_id | c703801dccaf4a0aaa39bec8c481e25a                       |
    | secret     | 6a2142613c504c42a94ba2b82147dc28                       |
    | trust_id   | None                                                   |
    | user_id    | 40a7140e424f493d8165abc652dc731c                       |
    +------------+--------------------------------------------------------+

  4. 生成された認証情報を使用して、GetSessionToken API を使用して一時的なセキュリティー認証情報のセットを取得します。

    import boto3
    
    access_key = b924dfc87d454d15896691182fdeb0ef
    secret_key = 6a2142613c504c42a94ba2b82147dc28
    
    client = boto3.client('sts',
    aws_access_key_id=access_key,
    aws_secret_access_key=secret_key,
    endpoint_url=https://www.example.com/rgw,
    region_name='',
    )
    
    response = client.get_session_token(
        DurationSeconds=43200
    )

  5. 一時認証情報の取得は、S3 呼び出しの作成に使用できます。

        s3client = boto3.client('s3',
          aws_access_key_id = response['Credentials']['AccessKeyId'],
          aws_secret_access_key = response['Credentials']['SecretAccessKey'],
          aws_session_token = response['Credentials']['SessionToken'],
          endpoint_url=https://www.example.com/s3,
          region_name='')
    
        bucket = s3client.create_bucket(Bucket='my-new-shiny-bucket')
        response = s3client.list_buckets()
        for bucket in response["Buckets"]:
            print "{name}\t{created}".format(
                        name = bucket['Name'],
                        created = bucket['CreationDate'],
        )

  6. 新しい S3Access ロールを作成し、ポリシーを設定します。

    1. 管理 CAPS でユーザーを割り当てます。

      radosgw-admin caps add --uid="$USER" --caps="roles=*"

      [user@client]$ radosgw-admin caps add --uid="gwadmin" --caps="roles=*"

    2. S3Access ロールを作成します。

      radosgw-admin role create --role-name=$ROLE_NAME --path=$PATH --assume-role-policy-doc=$TRUST_POLICY_DOC

      [user@client]$ radosgw-admin role create --role-name=S3Access --path=/application_abc/component_xyz/ --assume-role-policy-doc=\{\"Version\":\"2012-10-17\",\"Statement\":\[\{\"Effect\":\"Allow\",\"Principal\":\{\"AWS\":\[\"arn:aws:iam:::user/TESTER\"\]\},\"Action\":\[\"sts:AssumeRole\"\]\}\]\}

    3. S3Access ロールにパーミッションポリシーを割り当てます。

      radosgw-admin role-policy put --role-name=$ROLE_NAME --policy-name=$POLICY_NAME --policy-doc=$PERMISSION_POLICY_DOC

      [user@client]$ radosgw-admin role-policy put --role-name=S3Access --policy-name=Policy --policy-doc=\{\"Version\":\"2012-10-17\",\"Statement\":\[\{\"Effect\":\"Allow\",\"Action\":\[\"s3:*\"\],\"Resource\":\"arn:aws:s3:::example_bucket\"\}\]\}

    4. 別のユーザーが gwadmin ユーザーのロールを想定できるようになりました。たとえば、gwuser ユーザーは、gwadmin ユーザーのパーミッションを想定できます。
    5. 仮定ユーザーの access_key および secret_key の値を書き留めておきます。

      [user@client]$ radosgw-admin user info --uid=gwuser | grep -A1 access_key

  7. AssumeRole API 呼び出しを使用し、仮定のユーザーから access_key および secret_key の値を提供します。

    import boto3
    
    access_key = 11BS02LGFB6AL6H1ADMW
    secret_key = vzCEkuryfn060dfee4fgQPqFrncKEIkh3ZcdOANY
    
    client = boto3.client('sts',
    aws_access_key_id=access_key,
    aws_secret_access_key=secret_key,
    endpoint_url=https://www.example.com/rgw,
    region_name='',
    )
    
    response = client.assume_role(
    RoleArn='arn:aws:iam:::role/application_abc/component_xyz/S3Access',
    RoleSessionName='Bob',
    DurationSeconds=3600
    )

    重要

    AssumeRole API には S3Access ロールが必要です。

関連情報

  • Boto Python モジュールのインストールに関する詳細は、Red Hat Ceph Storage Object Gateway ガイドS3 アクセスのテスト セクションを参照してください。
  • 詳細は、Red Hat Ceph Storage Object Gateway ガイドユーザーの作成 セクションを参照してください。

2.4.6. Keystone で STS Lite を使用するための制限の回避 (テクノロジープレビュー)

Keystone の制限は、STS リクエストをサポートしないことです。もう 1 つの制限は、ペイロードハッシュがリクエストに含まれていないことです。この 2 つの制限を回避するには、Boto 認証コードを変更する必要があります。

前提条件

  • Red Hat Ceph Storage 3.2 以降
  • 実行中の Ceph Object Gateway。
  • Boto Python モジュールのバージョン 3 以降のインストール

手順

  1. Boto の auth.py ファイルを開いて編集します。

    1. 以下の 4 つの行をコードブロックに追加します。

      class SigV4Auth(BaseSigner):
        """
        Sign a request with Signature V4.
        """
        REQUIRES_REGION = True
      
        def __init__(self, credentials, service_name, region_name):
            self.credentials = credentials
            # We initialize these value here so the unit tests can have
            # valid values.  But these will get overriden in ``add_auth``
            # later for real requests.
            self._region_name = region_name
            if service_name == 'sts': 1
                self._service_name = 's3' 2
            else: 3
                self._service_name = service_name 4
    2. 以下の 2 つの行をコードブロックに追加します。

      def _modify_request_before_signing(self, request):
              if 'Authorization' in request.headers:
                  del request.headers['Authorization']
              self._set_necessary_date_headers(request)
              if self.credentials.token:
                  if 'X-Amz-Security-Token' in request.headers:
                      del request.headers['X-Amz-Security-Token']
                  request.headers['X-Amz-Security-Token'] = self.credentials.token
      
              if not request.context.get('payload_signing_enabled', True):
                  if 'X-Amz-Content-SHA256' in request.headers:
                      del request.headers['X-Amz-Content-SHA256']
                  request.headers['X-Amz-Content-SHA256'] = UNSIGNED_PAYLOAD 1
              else: 2
                  request.headers['X-Amz-Content-SHA256'] = self.payload(request)

関連情報

  • Boto Python モジュールのインストールに関する詳細は、Red Hat Ceph Storage Object Gateway ガイドS3 アクセスのテスト セクションを参照してください。

2.5. 一般的な操作

2.5.1. バケットおよびホスト名

バケットにアクセスするモードは 2 つあります。最初のメソッドは推奨されるメソッドで、バケットを URI の最上位ディレクトリーとして識別します。

GET /mybucket HTTP/1.1
Host: cname.domain.com

2 番目のメソッドは、仮想バケットのホスト名経由でバケットを識別します。

GET / HTTP/1.1
Host: mybucket.cname.domain.com

ヒント

2 番目の方法では高価なドメイン認定と DNS ワイルドカードが必要なため、Red Hat は最初の方法を推奨します。

2.5.2. 一般的なリクエストヘッダー

以下の表には、有効な一般的なリクエストヘッダーとその説明をまとめています。

表2.4 リクエストヘッダー

リクエストヘッダー詳細

CONTENT_LENGTH

リクエストボディーの長さ。

DATE

要求の日時と日付 (UTC 単位)。

HOST

ホストサーバーの名前。

AUTHORIZATION

承認トークン。

2.5.3. 一般的な応答ステータス

以下の表は、有効な一般的な HTTP レスポンスステータスと対応するコードを示しています。

表2.5 レスポンスのステータス

HTTP ステータスレスポンスコード

100

Continue

200

Success

201

Created

202

Accepted

204

NoContent

206

Partial content

304

NotModified

400

InvalidArgument

400

InvalidDigest

400

BadDigest

400

InvalidBucketName

400

InvalidObjectName

400

UnresolvableGrantByEmailAddress

400

InvalidPart

400

InvalidPartOrder

400

RequestTimeout

400

EntityTooLarge

403

AccessDenied

403

UserSuspended

403

RequestTimeTooSkewed

404

NoSuchKey

404

NoSuchBucket

404

NoSuchUpload

405

MethodNotAllowed

408

RequestTimeout

409

BucketAlreadyExists

409

BucketNotEmpty

411

MissingContentLength

412

PreconditionFailed

416

InvalidRange

422

UnprocessableEntity

500

InternalError

2.6. サービス操作

2.6.1. バケットの一覧表示

GET / は、ユーザーがリクエストを行うユーザーが作成するバケットの一覧を返します。GET / は、認証ユーザーが作成したバケットのみを返します。匿名のリクエストを行うことはできません。

構文

GET / HTTP/1.1
Host: cname.domain.com

Authorization: AWS <access_key>:<hash_of_header_and_secret>

表2.6 レスポンスエンティティー

名前詳細

Buckets

コンテナー

バケットの一覧用のコンテナー。

Bucket

コンテナー

バケット情報用のコンテナー

名前

文字列

バケット名。

CreationDate

Date

バケットが作成された時点の UTC 時間。

ListAllMyBucketsResult

コンテナー

結果のコンテナー。

Owner

コンテナー

バケット所有者の ID および DisplayName のコンテナー。

ID

文字列

バケット所有者の ID。

DisplayName

文字列

バケットの所有者の表示名。

features テーブルに戻ります。

2.7. バケット操作

2.7.1. マルチテナントによるバケット操作

クライアントアプリケーションがバケットにアクセスする場合は、常に特定ユーザーの認証情報で動作します。Red Hat Ceph Storage 3 では、すべてのユーザーがテナントに属します。詳細は 、マルチテナンシー を 参照してください。そのため、テナントが明示的に指定されていない場合は、すべてのバケット操作のコンテキストに暗黙的なテナントがあります。したがって、マルチテナンシーは、参照されるバケットと参照ユーザーが同じテナントに属する限り、以前のリリースと完全に後方互換性があります。

明示的なテナントの指定に使用される拡張機能は、使用されるプロトコルおよび認証システムによって異なります。

以下の例では、コロン文字はテナントとバケットを分離します。そのため、URL のサンプルは以下のようになります。

https://rgw.domain.com/tenant:bucket

一方、単純な Python の例は、バケットメソッド自体でテナントとバケットを分離します。

from boto.s3.connection import S3Connection, OrdinaryCallingFormat
  c = S3Connection(
    aws_access_key_id="TESTER",
    aws_secret_access_key="test123",
    host="rgw.domain.com",
    calling_format = OrdinaryCallingFormat()
  )
  bucket = c.get_bucket("tenant:bucket")
注記

ホスト名に、コロンや、バケット名では有効ではない他の区切り文字を含めることができないため、マルチテナンシーを使用して S3 形式のサブドメインを使用することはできません。期間を使用するとあいまいな構文が作成されます。そのため、bucket-in-URL-path 形式をマルチテナンシーと併用する必要があります。

2.7.2. バケットライフサイクル

バケットのライフサイクル設定を使用してオブジェクトを管理し、そのオブジェクトが有効期間中効果的に保存されるようにすることができます。Ceph Object Gateway の S3 API は、AWS バケットライフサイクルアクションのサブセットをサポートします。

  • Expiration: これはバケット内のオブジェクトの有効期間を定義します。オブジェクトが存続する日数または有効期限がかかり、その時点で Ceph Object Gateway がオブジェクトを削除します。バケットがバージョン管理を有効にしない場合、Ceph Object Gateway はオブジェクトを永続的に削除します。バケットがバージョン管理を有効化する場合、Ceph Object Gateway は現行バージョンの削除マーカーを作成し、現行バージョンを削除します。
  • NoncurrentVersionExpiration: これはバケット内の最新バージョン以外のオブジェクトバージョンのライフサイクルを定義します。この機能を使用するには、バケットがバージョン管理を有効にする必要があります。最新バージョン以外のオブジェクトが存続する日数を取ります。この時点では、Ceph Object Gateway が最新バージョン以外のオブジェクトを削除します。
  • AbortIncompleteMultipartUpload: これは、非完全なマルチパートアップロードが中止されるまでの日数を定義します。

ライフサイクル設定には、<Rule> 要素を使用した 1 つ以上のルールが含まれます。以下に例を示します。

<LifecycleConfiguration>
    <Rule>
      <Prefix/>
      <Status>Enabled</Status>
      <Expiration>
        <Days>10</Days>
      </Expiration>
    </Rule>
</LifecycleConfiguration>

ライフサイクルルールは、ライフサイクルルールに指定する <Filter> 要素に基づいてバケットの全オブジェクトまたはサブセットに適用できます。フィルターは複数の方法を指定できます。

  • キーの接頭辞
  • オブジェクトタグ
  • キー接頭辞と 1 つ以上のオブジェクトタグの両方

キーの接頭辞

ライフサイクルルールは、キー名の接頭辞に基づいてオブジェクトのサブセットに適用できます。たとえば、<keypre/> を指定すると、keypre/ で始まるオブジェクトに適用されます。

<LifecycleConfiguration>
    <Rule>
    <Status>Enabled</Status>
        <Filter>
           <Prefix>keypre/</Prefix>
        </Filter>
    </Rule>
</LifecycleConfiguration>

異なるキー接頭辞を持つオブジェクトに、異なるライフサイクルルールを適用することもできます。

<LifecycleConfiguration>
    <Rule>
    <Status>Enabled</Status>
        <Filter>
           <Prefix>keypre/</Prefix>
        </Filter>
    </Rule>
    <Rule>
        <Filter>
           <Prefix>mypre/</Prefix>
        </Filter>
    </Rule>
</LifecycleConfiguration>

オブジェクトタグ

ライフサイクルルールは、<Key> 要素および <Value> 要素を使用して、特定のタグを持つオブジェクトにのみ適用できます。

<LifecycleConfiguration>
    <Rule>
    <Status>Enabled</Status>
        <Filter>
           <Tag>
              <Key>key</Key>
              <Value>value</Value>
           </Tag>
        </Filter>
    </Rule>
</LifecycleConfiguration>

接頭辞および 1 つ以上のタグの両方

ライフサイクルルールでは、キーの接頭辞と 1 つ以上のタグの両方に基づいてフィルターを指定できます。これらは <And> 要素でラップする必要があります。フィルターには 1 つの接頭辞と、ゼロまたは複数のタグのみを使用できます。

<LifecycleConfiguration>
    <Rule>
    <Status>Enabled</Status>
        <Filter>
          <And>
             <Prefix>key-prefix</Prefix>
             <Tag>
                <Key>key1</Key>
                <Value>value1</Value>
             </Tag>
             <Tag>
                <Key>key2</Key>
                <Value>value2</Value>
             </Tag>
              ...
          </And>
        </Filter>
        <Status>Enabled</Status>
    </Rule>
</LifecycleConfiguration>

詳細は、以下を参照してください。

2.7.3. HEAD バケット

バケットで HEAD を呼び出して、存在する場合は、呼び出し元にアクセス権限があるかどうかを判断します。バケットが存在し、呼び出し元にパーミッションがある場合は 200 OK を返します。バケットが存在しない場合は 404 Not Found、バケットが存在しますが呼び出し元にはアクセスパーミッションがない場合は 403 Forbidden を返します。

構文

HEAD /<bucket> HTTP/1.1
Host: cname.domain.com
Date: date
Authorization: AWS <access_key>:<hash_of_header_and_secret>

2.7.4. PUT バケット

新規バケットを作成します。バケットを作成するには、要求を認証するためにユーザー ID および有効な AWS アクセスキー ID が必要です。バケットを匿名ユーザーとして作成することはできません。

制約

通常、バケット名はドメイン名の制約に従う必要があります。

  • バケット名は一意である必要があります。
  • バケット名は最初に指定し、小文字で終了する必要があります。
  • バケット名にはダッシュ (-) を含めることができます。

構文

PUT /<bucket> HTTP/1.1
Host: cname.domain.com
x-amz-acl: public-read-write

Authorization: AWS <access_key>:<hash_of_header_and_secret>

表2.7 パラメーター

名前説明有効な値必須

x-amz-acl

固定 ACL。

privatepublic-readpublic-read-writeauthenticated-read

いいえ

HTTP レスポンス

バケット名が一意で、制約内で未使用であると、操作は成功します。同じ名前のバケットがすでに存在し、ユーザーがバケット所有者である場合は、操作が成功します。バケット名が使用中の場合は、操作が失敗します。

HTTP ステータスステータスコード詳細

409

BucketAlreadyExists

バケットは、異なるユーザーの所有権に存在します。

features テーブルに戻ります。

2.7.5. Put Bucket Lifecycle

バケットライフサイクルを作成または置き換えるには、PUT を使用して宛先バケットとライフサイクル設定を指定します。Ceph Object Gateway は、S3 ライフサイクル機能のサブセットのみをサポートします。詳細は、S3 API バケットライフサイクル を参照してください。

構文

PUT /<bucket>?lifecycle HTTP/1.1
Host: cname.domain.com

Authorization: AWS <access_key>:<hash_of_header_and_secret>
<LifecycleConfiguration>
  <Rule>
    <Expiration>
      <Days>10</Days>
    </Expiration>
  </Rule>
    ...
  <Rule>
  </Rule>
</LifecycleConfiguration>

表2.8 リクエストヘッダー

名前説明有効な値必須

content-md5

メッセージの base64 でエンコードされた MD-5 ハッシュ

文字列。デフォルトや制約はありません。

いいえ

一般的なリクエストヘッダーも参照してください。

features テーブルに戻ります。

2.7.6. DELETE バケット

バケットを削除します。バケットの削除が正常に行われた後にバケット名を再利用できます。

構文

DELETE /<bucket> HTTP/1.1
Host: cname.domain.com

Authorization: AWS <access_key>:<hash_of_header_and_secret>

表2.9 HTTP レスポンス

HTTP ステータスステータスコード詳細

204

コンテンツなし

バケットが削除されました。

features テーブルに戻ります。

2.7.7. バケットライフサイクルの削除

バケットライフサイクルを削除するには、DELETE を使用し、宛先バケットを指定します。

構文

DELETE /<bucket>?lifecycle HTTP/1.1
Host: cname.domain.com

Authorization: AWS <access_key>:<hash_of_header_and_secret>

リクエストヘッダー

リクエストには特別な要素が含まれません。

一般的なリクエストヘッダーを参照してください。

応答

レスポンスは、一般的なレスポンスのステータスを返します。

詳細は、一般的な応答ステータス を参照してください。

features テーブルに戻ります。

2.7.8. GET バケット

バケットオブジェクトの一覧を返します。

構文

GET /<bucket>?max-keys=25 HTTP/1.1
Host: cname.domain.com

表2.10 パラメーター

名前詳細

prefix

文字列

指定された接頭辞が含まれるオブジェクトのみを返します。

delimiter

文字列

接頭辞と他のオブジェクト名の間に挿入される区切り文字。

marker

文字列

返されるオブジェクトリストの開始インデックス。

max-keys

整数

返すキーの最大数。デフォルトは 1000 です。

表2.11 HTTP レスポンス

HTTP ステータスステータスコード詳細

200

OK

取得されるバケット

GET /<bucket&gt; は、以下のフィールドを持つバケットのコンテナーを返します。

表2.12 バケットレスポンスエンティティー

名前詳細

ListBucketResult

エンティティー

オブジェクト一覧のコンテナー。

名前

文字列

コンテンツが返されるバケットの名前。

Prefix

文字列

オブジェクトキーの接頭辞。

Marker

文字列

返されるオブジェクトリストの開始インデックス。

MaxKeys

整数

返されるキーの最大数。

Delimiter

文字列

設定されている場合は、同じ接頭辞を持つオブジェクトが CommonPrefixes リストに表示されます。

IsTruncated

ブール値

true の場合、バケットの内容のサブセットのみが返されます。

CommonPrefixes

コンテナー

複数のオブジェクトに同じ接頭辞が含まれる場合は、この一覧に表示されます。

ListBucketResult にはオブジェクトが含まれ、各オブジェクトは Contents コンテナー内にあります。

表2.13 オブジェクトレスポンスエンティティー

名前詳細

内容

Object

オブジェクトのコンテナー。

Key

文字列

オブジェクトのキー。

LastModified

Date

オブジェクトの最後に変更した日時。

ETag

文字列

オブジェクトの MD-5 ハッシュ (entity タグ)

サイズ

整数

オブジェクトのサイズ。

StorageClass

文字列

常に STANDARD を返す必要があります。

features テーブルに戻ります。

2.7.9. バケットライフサイクルの取得

バケットのライフサイクルを取得するには、GET を使用して宛先バケットを指定します。

構文

GET /<bucket>?lifecycle HTTP/1.1
Host: cname.domain.com

Authorization: AWS <access_key>:<hash_of_header_and_secret>

リクエストヘッダー

一般的なリクエストヘッダーを参照してください。

応答

レスポンスには、バケットライフサイクルとその要素が含まれます。

features テーブルに戻ります。

2.7.10. バケットの場所の取得

バケットのゾーングループを取得します。これを呼び出すには、ユーザーはバケット所有者である必要があります。PUT 要求時に LocationConstraint を指定して、バケットをゾーングループに制限できます。

以下のように location サブリソースをバケットリソースに追加します。

構文

GET /<bucket>?location HTTP/1.1
Host: cname.domain.com

Authorization: AWS <access_key>:<hash_of_header_and_secret>

表2.14 レスポンスエンティティー

名前詳細

LocationConstraint

String

バケットが存在するゾーングループ(ゾーングループのための空の文字列)

features テーブルに戻ります。

2.7.11. バケットバージョン管理の取得

バケットのバージョン状態を取得します。これを呼び出すには、ユーザーはバケット所有者である必要があります。

以下のように、versioning サブリソースをバケットリソースに追加します。

構文

GET /<bucket>?versioning HTTP/1.1
Host: cname.domain.com

Authorization: AWS <access_key>:<hash_of_header_and_secret>

features テーブルに戻ります。

2.7.12. PUT バケットバージョン管理

このサブリソースは、既存のバケットのバージョン管理状態を設定します。バージョン管理状態を設定するには、バケット所有者である必要があります。バージョン管理状態がバケットに設定されていないと、バージョンは管理されていません。GET バージョン管理リクエストを実行しても、バージョン管理状態の値は返されません。

バケットによるバージョン管理の状態を設定します。

Enabled: バケットのオブジェクトのバージョン管理を有効にします。バケットに追加したすべてのオブジェクトは、一意のバージョン ID を受信します。Suspended: バケットのオブジェクトのバージョン管理を無効にします。バケットに追加したすべてのオブジェクトは、バージョン ID の Null を受け取ります。

構文

PUT /<bucket>?versioning HTTP/1.1

表2.15 バケット要求のエンティティー

名前詳細

VersioningConfiguration

コンテナー

要求のコンテナー。

状態

文字列

バケットのバージョン状態を設定します。有効な値: Suspended/Enabled

features テーブルに戻ります。

2.7.13. バケット ACL の取得

バケットのアクセス制御リストを取得します。ユーザーはバケットの所有者である必要があります。または、バケットで READ_ACP パーミッションが付与されている必要があります。

以下のように、acl サブリソースをバケット要求に追加します。

構文

GET /<bucket>?acl HTTP/1.1
Host: cname.domain.com

Authorization: AWS <access_key>:<hash_of_header_and_secret>

表2.16 レスポンスエンティティー

名前詳細

AccessControlPolicy

コンテナー

レスポンスのコンテナー。

AccessControlList

コンテナー

ACL 情報用のコンテナー

Owner

コンテナー

バケット所有者の ID および DisplayName のコンテナー。

ID

文字列

バケット所有者の ID。

DisplayName

文字列

バケットの所有者の表示名。

Grant

コンテナー

Grantee および Permission のコンテナー。

Grantee

コンテナー

パーミッションを付与されるユーザーの DisplayName および ID のコンテナー。

Permission

文字列

Grantee バケットに指定されるパーミッション。

features テーブルに戻ります。

2.7.14. PUT バケット ACL

既存のバケットへのアクセス制御を設定します。ユーザーはバケットの所有者である必要があります。または、バケットの WRITE_ACP パーミッションが付与されている必要があります。

以下のように、acl サブリソースをバケット要求に追加します。

構文

PUT /<bucket>?acl HTTP/1.1

表2.17 リクエストエンティティー

名前詳細

AccessControlPolicy

コンテナー

要求のコンテナー。

AccessControlList

コンテナー

ACL 情報用のコンテナー

Owner

コンテナー

バケット所有者の ID および DisplayName のコンテナー。

ID

文字列

バケット所有者の ID。

DisplayName

文字列

バケットの所有者の表示名。

Grant

コンテナー

Grantee および Permission のコンテナー。

Grantee

コンテナー

パーミッションを付与されるユーザーの DisplayName および ID のコンテナー。

Permission

文字列

Grantee バケットに指定されるパーミッション。

2.7.15. GET バケット CORS

バケットに設定された CORS 設定情報を取得します。ユーザーはバケットの所有者である必要があります。または、バケットで READ_ACP パーミッションが付与されている必要があります。

以下に示すように、cors サブリソースをバケット要求に追加します。

構文

GET /<bucket>?cors HTTP/1.1
Host: cname.domain.com

Authorization: AWS <access_key>:<hash_of_header_and_secret>

features テーブルに戻ります。

2.7.16. PUT バケット CORS

バケットの CORS 設定を設定します。ユーザーはバケットの所有者である必要があります。または、バケットで READ_ACP パーミッションが付与されている必要があります。

以下に示すように、cors サブリソースをバケット要求に追加します。

構文

PUT /<bucket>?cors HTTP/1.1
Host: cname.domain.com

Authorization: AWS <access_key>:<hash_of_header_and_secret>

2.7.17. DELETE バケット CORS

バケットに設定された CORS 設定情報を削除します。ユーザーはバケットの所有者である必要があります。または、バケットで READ_ACP パーミッションが付与されている必要があります。

以下に示すように、cors サブリソースをバケット要求に追加します。

構文

DELETE /<bucket>?cors HTTP/1.1
Host: cname.domain.com

Authorization: AWS <access_key>:<hash_of_header_and_secret>

2.7.18. バケットオブジェクトバージョンの一覧表示

バケット内のすべてのバージョンのオブジェクトに関するメタデータの一覧を返します。バケットへの READ アクセスが必要です。

以下のように versions サブリソースをバケット要求に追加します。

構文

GET /<bucket>?versions HTTP/1.1
Host: cname.domain.com

Authorization: AWS <access_key>:<hash_of_header_and_secret>

GET /<bucket>?versions のパラメーターを指定できますが、いずれも不要です。

表2.18 パラメーター

名前詳細

prefix

文字列

指定の接頭辞が含まれるキーが含まれる進行中のアップロードを返します。

delimiter

文字列

接頭辞と他のオブジェクト名の間に挿入される区切り文字。

key-marker

文字列

アップロード一覧の最初のマーカー。

max-keys

整数

進行中のアップロードの最大数。デフォルト値は 1000 です。

version-id-marker

文字列

リストを開始するオブジェクトバージョンを指定します。

表2.19 レスポンスエンティティー

名前詳細

KeyMarker

文字列

key-marker リクエストパラメーターによって指定されるキーマーカー (ある場合)。

NextKeyMarker

文字列

IsTruncatedtrue の場合に後続のリクエストで使用するキーマーカー。

NextUploadIdMarker

文字列

IsTruncatedtrue の場合に後続のリクエストで使用するアップロード ID マーカー。

IsTruncated

ブール値

true の場合は、バケットのアップロードコンテンツのサブセットのみが返されます。

サイズ

整数

アップロードした部分のサイズ。

DisplayName

文字列

所有者の表示名。

ID

文字列

所有者の ID。

Owner

コンテナー

オブジェクトを所有するユーザーの ID および DisplayName のコンテナー。

StorageClass

文字列

作成されるオブジェクトを保存するために使用されるメソッド。STANDARD または REDUCED_REDUNDANCY

バージョン

コンテナー

バージョン情報のコンテナー

versionId

文字列

オブジェクトのバージョン ID。

versionIdMarker

文字列

省略されたレスポンスのキーの最後のバージョン。

features テーブルに戻ります。

2.7.19. バケットマルチパートアップロードの一覧表示

GET /?uploads は、現在の進行中のマルチパートアップロードの一覧を返します。つまり、アプリケーションは複数パートごとのアップロードを開始しますが、サービスがすべてのアップロードを完了しているわけではありません。

構文

GET /<bucket>?uploads HTTP/1.1

GET /<bucket>?uploads のパラメーターを指定できますが、いずれも必要ありません。

表2.20 パラメーター

名前詳細

prefix

文字列

指定の接頭辞が含まれるキーが含まれる進行中のアップロードを返します。

delimiter

文字列

接頭辞と他のオブジェクト名の間に挿入される区切り文字。

key-marker

文字列

アップロード一覧の最初のマーカー。

max-keys

整数

進行中のアップロードの最大数。デフォルト値は 1000 です。

max-uploads

整数

マルチパートアップロードの最大数。1-1000 の範囲。デフォルト値は 1000 です。

version-id-marker

文字列

key-marker が指定されていない場合は無視されます。辞書式順序で、またはその ID 以降でリストする最初のアップロードの ID を指定します。

表2.21 レスポンスエンティティー

名前詳細

ListMultipartUploadsResult

コンテナー

結果のコンテナー

ListMultipartUploadsResult.Prefix

文字列

prefix 要求パラメーターで指定される接頭辞 (存在する場合)。

Bucket

文字列

バケットのコンテンツを受け取るバケット。

KeyMarker

文字列

key-marker リクエストパラメーターによって指定されるキーマーカー (ある場合)。

UploadIdMarker

文字列

upload-id-marker リクエストパラメーターによって指定されるマーカー (存在する場合)。

NextKeyMarker

文字列

IsTruncatedtrue の場合に後続のリクエストで使用するキーマーカー。

NextUploadIdMarker

文字列

IsTruncatedtrue の場合に後続のリクエストで使用するアップロード ID マーカー。

MaxUploads

整数

max-uploads リクエストパラメーターで指定される最大アップロード数。

Delimiter

文字列

設定されている場合は、同じ接頭辞を持つオブジェクトが CommonPrefixes リストに表示されます。

IsTruncated

ブール値

true の場合は、バケットのアップロードコンテンツのサブセットのみが返されます。

Upload

コンテナー

KeyUploadIdInitiatorOwnerStorageClass、および Initiated 要素のコンテナー。

Key

文字列

マルチパートアップロードが完了した後のオブジェクトのキー。

UploadId

文字列

マルチパートアップロードを識別する ID

Initiator

コンテナー

アップロードを開始したユーザーの IDDisplayName が含まれます。

DisplayName

文字列

イニシエーターの表示名。

ID

文字列

イニシエーターの ID。

Owner

コンテナー

アップロードしたオブジェクトを所有するユーザーの ID および DisplayName のコンテナー。

StorageClass

文字列

作成されるオブジェクトを保存するために使用されるメソッド。STANDARD または REDUCED_REDUNDANCY

Initiated

Date

ユーザーがアップロードを開始した日時。

CommonPrefixes

コンテナー

複数のオブジェクトに同じ接頭辞が含まれる場合は、この一覧に表示されます。

CommonPrefixes.Prefix

文字列

prefix リクエストパラメーターで定義されている接頭辞の後にキーのサブ文字列。

features テーブルに戻ります。

2.7.20. PUT バケット要求の支払い

requestPayment サブリソースを使用してバケットの要求支払い設定を設定します。デフォルトでは、バケットの所有者はバケットからのダウンロードに対して支払います。この設定パラメーターにより、バケットの所有者は、ダウンロードを要求するすべてのユーザーが要求に対して要求およびバケットからダウンロードに対して課金されることを指定できます。

以下のように requestPayment サブリソースをバケット要求に追加します。

構文

PUT /<bucket>?requestPayment HTTP/1.1
Host: cname.domain.com

表2.22 リクエストエンティティー

名前詳細

Payer

列挙

ダウンロードおよびリクエストの費用の課金を指定します。

RequestPaymentConfiguration

コンテナー

Payer のコンテナー。

features テーブルに戻ります。

2.7.21. GET バケットリクエストの支払い

requestPayment サブリソースを使用してバケットの要求支払い設定を返します。ユーザーはバケットの所有者である必要があります。または、バケットで READ_ACP パーミッションが付与されている必要があります。

以下のように requestPayment サブリソースをバケット要求に追加します。

構文

GET /<bucket>?requestPayment HTTP/1.1
Host: cname.domain.com

Authorization: AWS <access_key>:<hash_of_header_and_secret>

2.8. オブジェクト操作

2.8.1. PUT オブジェクト

オブジェクトをバケットに追加します。この操作を実行するには、バケットに書き込みパーミッションが必要です。

構文

PUT /<bucket>/<object> HTTP/1.1

表2.23 リクエストヘッダー

名前説明有効な値必須

content-md5

メッセージの base64 でエンコードされた MD-5 ハッシュ

文字列。デフォルトや制約はありません。

No

content-type

標準の MIME タイプ。

MIME タイプ。デフォルト: binary/octet-stream

いいえ

x-amz-meta-<…​>

ユーザーのメタデータ。オブジェクトとともに保存されます。

8kb までの文字列。デフォルトはありません。

No

x-amz-acl

固定 ACL。

privatepublic-readpublic-read-writeauthenticated-read

いいえ

表2.24 レスポンスヘッダー

名前説明

x-amz-version-id

バージョン ID または Null を返します。

features テーブルに戻ります。

2.8.2. オブジェクトのコピー

オブジェクトをコピーするには、PUT を使用して宛先バケットとオブジェクト名を指定します。

構文

PUT /<dest_bucket>/<dest_object> HTTP/1.1
x-amz-copy-source: <source_bucket>/<source_object>

表2.25 リクエストヘッダー

名前説明有効な値必須

x-amz-copy-source

ソースバケット名 + オブジェクト名。

<bucket>/<object>

Yes

x-amz-acl

固定 ACL。

privatepublic-readpublic-read-writeauthenticated-read

いいえ

x-amz-copy-if-modified-since

タイムスタンプ以降に変更された場合のみコピーします。

タイムスタンプ

No

x-amz-copy-if-unmodified-since

タイムスタンプ以降変更されていない場合にのみコピーします。

タイムスタンプ

No

x-amz-copy-if-match

オブジェクトの ETag が ETag と一致する場合に限りコピーします。

エンティティータグ

No

x-amz-copy-if-none-match

オブジェクトの ETag が一致しない場合にのみコピーします。

エンティティータグ

No

表2.26 レスポンスエンティティー

名前説明

CopyObjectResult

コンテナー

レスポンス要素のコンテナー。

LastModified

Date

ソースオブジェクトを最後に変更した日付。

Etag

文字列

新規オブジェクトの ETag。

features テーブルに戻ります。

2.8.3. POST オブジェクト

HTML フォームを使用してオブジェクトをバケットに追加します。この操作を実行するには、バケットに書き込みパーミッションが必要です。

構文

POST /<bucket>/<object> HTTP/1.1

features テーブルに戻ります。

2.8.4. OPTIONS オブジェクト

特定の送信元、HTTP メソッド、およびヘッダーを使用して実際のリクエストを送信できるかどうかを判断するための事前要求です。

構文

OPTIONS /<object> HTTP/1.1

features テーブルに戻ります。

2.8.5. 複数オブジェクトの削除

バケットから複数のオブジェクトを削除します。

構文

POST /<bucket>/<object>?delete HTTP/1.1

features テーブルに戻ります。

2.8.6. オブジェクトの削除

オブジェクトを削除します。含まれるバケットに WRITE パーミッションを設定する必要があります。

オブジェクトを削除します。オブジェクトのバージョン管理が有効なの場合、マーカーが作成されます。

構文

DELETE /<bucket>/<object> HTTP/1.1

バージョン管理が有効な場合にオブジェクトを削除するには、versionId サブリソースおよび削除するオブジェクトのバージョンを指定する必要があります。

DELETE /<bucket>/<object>?versionId=<versionID> HTTP/1.1

features テーブルに戻ります。

2.8.7. オブジェクトの取得

バケットからオブジェクトを取得します。

構文

GET /<bucket>/<object> HTTP/1.1

versionId サブリソースを追加して、オブジェクトの特定のバージョンを取得します。

構文

GET /<bucket>/<object>?versionId=<versionID> HTTP/1.1

表2.27 リクエストヘッダー

名前説明有効な値必須

範囲

取得するオブジェクトの範囲。

範囲: bytes=beginbyte-endbyte

No

if-modified-since

タイムスタンプ以降に変更した場合にのみ取得します。

タイムスタンプ

No

if-unmodified-since

タイムスタンプ以降変更されていない場合にのみ取得します。

タイムスタンプ

No

if-match

オブジェクトの ETag が ETag と一致する場合にのみ取得します。

エンティティータグ

No

if-none-match

オブジェクトの ETag が ETag と一致する場合にのみ取得します。

エンティティータグ

No

表2.28 レスポンスヘッダー

名前説明

Content-Range

データ範囲 (範囲ヘッダーフィールドがリクエストに指定された場合のみを返します)。

x-amz-version-id

バージョン ID または Null を返します。

features テーブルに戻ります。

2.8.8. オブジェクト情報の取得

オブジェクトに関する情報を返します。この要求は Get Object 要求と同じヘッダー情報を返しますが、オブジェクトデータペイロードではなくメタデータのみが含まれます。

オブジェクトの現行バージョンを取得します。

構文

HEAD /<bucket>/<object> HTTP/1.1

versionId サブリソースを追加して、特定バージョンの情報を取得します。

構文

HEAD /<bucket>/<object>?versionId=<versionID> HTTP/1.1

表2.29 リクエストヘッダー

名前説明有効な値必須

範囲

取得するオブジェクトの範囲。

範囲: bytes=beginbyte-endbyte

No

if-modified-since

タイムスタンプ以降に変更した場合にのみ取得します。

タイムスタンプ

No

if-unmodified-since

タイムスタンプ以降変更されていない場合にのみ取得します。

タイムスタンプ

No

if-match

オブジェクトの ETag が ETag と一致する場合にのみ取得します。

エンティティータグ

No

if-none-match

オブジェクトの ETag が ETag と一致する場合にのみ取得します。

エンティティータグ

No

表2.30 レスポンスヘッダー

名前説明

x-amz-version-id

バージョン ID または Null を返します。

features テーブルに戻ります。

2.8.9. Get Object ACL

オブジェクトの現行バージョンの ACL を返します。

構文

GET /<bucket>/<object>?acl HTTP/1.1

versionId サブリソースを追加して、特定バージョンの ACL を取得します。

構文

GET /<bucket>/<object>versionId=<versionID>&acl HTTP/1.1

表2.31 レスポンスヘッダー

名前説明

x-amz-version-id

バージョン ID または Null を返します。

表2.32 レスポンスエンティティー

名前詳細

AccessControlPolicy

コンテナー

レスポンスのコンテナー。

AccessControlList

コンテナー

ACL 情報用のコンテナー

Owner

コンテナー

オブジェクトの所有者の ID および DisplayName のコンテナー。

ID

文字列

オブジェクトの所有者の ID。

DisplayName

文字列

オブジェクトの所有者の表示名。

Grant

コンテナー

Grantee および Permission のコンテナー。

Grantee

コンテナー

パーミッションを付与されるユーザーの DisplayName および ID のコンテナー。

Permission

文字列

Grantee オブジェクトに指定されたパーミッション。

features テーブルに戻ります。

2.8.10. オブジェクト ACL の設定

オブジェクトの現行バージョンのオブジェクト ACL を設定します。

構文

PUT /<bucket>/<object>?acl

表2.33 リクエストエンティティー

名前詳細

AccessControlPolicy

コンテナー

レスポンスのコンテナー。

AccessControlList

コンテナー

ACL 情報用のコンテナー

Owner

コンテナー

オブジェクトの所有者の ID および DisplayName のコンテナー。

ID

文字列

オブジェクトの所有者の ID。

DisplayName

文字列

オブジェクトの所有者の表示名。

Grant

コンテナー

Grantee および Permission のコンテナー。

Grantee

コンテナー

パーミッションを付与されるユーザーの DisplayName および ID のコンテナー。

Permission

文字列

Grantee オブジェクトに指定されたパーミッション。

2.8.11. Initiate Multipart Upload

複数パートからなるアップロードプロセスを開始します。追加部分の追加、パーツの一覧表示、および複数パートアップロードの完了または破棄時に指定できる UploadId を返します。

構文

POST /<bucket>/<object>?uploads

表2.34 リクエストヘッダー

名前説明有効な値必須

content-md5

メッセージの base64 でエンコードされた MD-5 ハッシュ

文字列。デフォルトや制約はありません。

No

content-type

標準の MIME タイプ。

MIME タイプ。デフォルト: binary/octet-stream

いいえ

x-amz-meta-<…​>

ユーザーのメタデータ。オブジェクトとともに保存されます。

8kb までの文字列。デフォルトはありません。

No

x-amz-acl

固定 ACL。

privatepublic-readpublic-read-writeauthenticated-read

いいえ

表2.35 レスポンスエンティティー

名前詳細

InitiatedMultipartUploadsResult

コンテナー

結果のコンテナー

Bucket

文字列

オブジェクトの内容を受け取るバケット。

Key

文字列

key リクエストパラメーターで指定されるキー (存在する場合)。

UploadId

文字列

upload-id リクエストパラメーターで指定される ID で、マルチパートアップロードを特定します (存在する場合)。

features テーブルに戻ります。

2.8.12. マルチパートアップロードパート

マルチパートアップロードに部分を追加します。

複数パートのアップロードに部分を追加するために uploadId サブリソースとアップロード ID を指定します。

構文

PUT /<bucket>/<object>?partNumber=&uploadId=<upload_id> HTTP/1.1

以下の HTTP レスポンスが返されます。

表2.36 HTTP レスポンス

HTTP ステータスステータスコード詳細

404

NoSuchUpload

指定した upload-id がこのオブジェクトで開始されたアップロードと一致しません。

features テーブルに戻ります。

2.8.13. List Multipart Upload Parts

マルチパートアップロードの一部を一覧表示するために uploadId サブリソースとアップロード ID を指定します。

構文

GET /<bucket>/<object>?uploadId=<upload-id> HTTP/1.1

表2.37 レスポンスエンティティー

名前詳細

InitiatedMultipartUploadsResult

コンテナー

結果のコンテナー

Bucket

文字列

オブジェクトの内容を受け取るバケット。

Key

文字列

key リクエストパラメーターで指定されるキー (存在する場合)。

UploadId

文字列

upload-id リクエストパラメーターで指定される ID で、マルチパートアップロードを特定します (存在する場合)。

Initiator

コンテナー

アップロードを開始したユーザーの IDDisplayName が含まれます。

ID

文字列

イニシエーターの ID。

DisplayName

文字列

イニシエーターの表示名。

Owner

コンテナー

アップロードしたオブジェクトを所有するユーザーの ID および DisplayName のコンテナー。

StorageClass

文字列

作成されるオブジェクトを保存するために使用されるメソッド。STANDARD または REDUCED_REDUNDANCY

PartNumberMarker

文字列

IsTruncatedtrue の場合に後続のリクエストで使用する部分マーカー。一覧の先頭に指定します。

NextPartNumberMarker

文字列

IsTruncatedtrue の場合は、後続のリクエストで使用する次の部分マーカー。リストの末尾。

MaxParts

整数

max-parts リクエストパラメーターで指定されたレスポンスで許可される最大部分。

IsTruncated

ブール値

true の場合は、オブジェクトのアップロードコンテンツのサブセットのみが返されます。

Part

コンテナー

KeyPartInitiatorOwnerStorageClass、および Initiated 要素のコンテナー。

PartNumber

整数

部分の識別番号。

ETag

文字列

コンポーネントのエンティティータグです。

サイズ

整数

アップロードした部分のサイズ。

features テーブルに戻ります。

2.8.14. complete Multipart Upload

アップロードした部分を組み立て、新規オブジェクトを作成します。これにより、複数パートのアップロードが実行されます。

複数パートからなるアップロードを完了するには、uploadId サブリソースとアップロード ID を指定します。

構文

POST /<bucket>/<object>?uploadId= HTTP/1.1

表2.38 リクエストエンティティー

名前説明必須

CompleteMultipartUpload

コンテナー

1 つ以上の部分で設定されるコンテナー。

はい

Part

コンテナー

PartNumber および ETag のコンテナー。

はい

PartNumber

整数

部分の識別子。

はい

ETag

文字列

コンポーネントのエンティティータグです。

Yes

表2.39 レスポンスエンティティー

名前詳細

CompleteMultipartUploadResult

コンテナー

レスポンスのコンテナー。

場所

URI

新規オブジェクトのリソース識別子 (パス)。

Bucket

文字列

新規オブジェクトが含まれるバケットの名前。

Key

文字列

オブジェクトのキー。

ETag

文字列

新規オブジェクトのエンティティータグ。

features テーブルに戻ります。

2.8.15. Abort Multipart Upload

複数パートアップロードを中止します。

マルチパートによるアップロードを中止するために uploadId サブリソースとアップロード ID を指定します。

構文

DELETE /<bucket>/<object>?uploadId=<upload_id> HTTP/1.1

features テーブルに戻ります。

2.8.16. Copy Multipart Upload

既存のオブジェクトからデータをデータソースとしてコピーして、パーツをアップロードします。

複数パートからなるアップロードコピーを実行するには、uploadId サブリソースとアップロード ID を指定します。

構文

PUT /<bucket>/<object>?partNumber=PartNumber&uploadId=UploadId HTTP/1.1
Host: cname.domain.com

Authorization: AWS <access_key>:<hash_of_header_and_secret>

表2.40 リクエストヘッダー

名前説明有効な値必須

x-amz-copy-source

ソースバケット名およびオブジェクト名。

<bucket>/<object>

はい

x-amz-copy-source-range

ソースオブジェクトからコピーするバイトの範囲。

範囲: bytes=first-last (ここで、最初のおよび最後は、コピーするゼロベースのバイトオフセットです)たとえば、bytes=0-9 は、ソースの最初の 10 バイトをコピーすることを示しています。

いいえ

表2.41 レスポンスエンティティー

名前詳細

CopyPartResult

コンテナー

すべてのレスポンス要素のコンテナー。

ETag

文字列

新しい部分の ETag を返します。

LastModified

文字列

最後に変更した日付を返します。

この機能の詳細は、Amazon S3 のサイト を参照してください。

features テーブルに戻ります。

2.9. Hadoop S3A の相互運用性

HDFS (Hadoop Distributed File System) のアクセスを必要とするデータ解析アプリケーションは、Hadoop 用の Apache S3A コネクターを使用して Ceph Object Gateway にアクセスできます。S3A コネクターは、データが Ceph Object Gateway に保存される一方で、HDFS ファイルシステムがアプリケーションへのセマンティクスを読み取りおよび書き込みする S3 互換のオブジェクトストレージを HDFS ファイルシステムとして表示するオープンソースツールです。

Ceph Object Gateway は、Hadoop 2.7.3 に同梱される S3A コネクターと完全に互換性があります。

2.10. S3 の制限

重要

以下の制限事項を使用してください。お使いのハードウェアの選択には影響があるため、この要件を Red Hat アカウントチームと常に相談してください。

  • Amazon S3 を使用する場合の最大オブジェクトサイズ: 個別の Amazon S3 オブジェクトは、最小の 0B から最大 5TB のサイズに制限できます。1 つの PUT でアップロードできる最大オブジェクトは 5 GB です。100MB を超えるオブジェクトの場合は、Multipart Upload ケイパビリティーの使用を検討してください。
  • Amazon S3 を使用する場合の最大メタデータサイズ: オブジェクトに適用できるユーザーメタデータの合計サイズに定義された制限はありませんが、単一の HTTP リクエストは 16,000 に制限されます。
  • S3 オブジェクトおよびメタデータを保存するために Red Hat Ceph Storage が生成するデータオーバーヘッドの量: 推定値は 200-300 バイトとオブジェクト名の長さです。バージョン管理されたオブジェクトは、バージョン数に比例する領域を追加で使用します。また、マルチパートアップロードなどのトランザクション更新中に一時的なオーバーヘッドが発生しますが、これらのオーバーヘッドはガベージコレクション中にリカバリーされます。

第3章 Object Gateway Swift Application Programming Interface (API)

Ceph は、Swift API の基本データアクセスモデルと互換性のある RESTful API をサポートします。

以下の表は、現在の Swift 機能機能のサポート状況を示しています。

表3.1 機能

機能状態備考

認証

サポート対象

 

アカウントメタデータの取得

サポート対象

カスタムメタデータなし

Swift ACL

サポート対象

Swift ACL のサブセットに対応

コンテナーの一覧表示

サポート対象

 

コンテナーの削除

サポート対象

 

コンテナーの作成

サポート対象

 

コンテナーメタデータの取得

サポート対象

 

コンテナーメタデータの更新

サポート対象

 

コンテナーメタデータの削除

サポート対象

 

オブジェクトの一覧表示

サポート対象

 

静的な Web サイト

サポート対象外

 

マルチテナンシー

サポート対象

 

オブジェクトの作成/更新

サポート対象

 

大規模オブジェクトの作成

サポート対象

 

オブジェクトの削除

サポート対象

 

オブジェクトの取得

サポート対象

 

オブジェクトのコピー

サポート対象

 

オブジェクトメタデータの取得

サポート対象

 

オブジェクトメタデータの追加/更新

サポート対象

 

一時 URL 操作

サポート対象

 

オブジェクトの期限設定

サポート対象

 

オブジェクトのバージョン管理

サポート対象外

 

CORS

サポート対象外

 

3.1. 認証

認証を必要とする Swift API リクエストには、要求ヘッダーに X-Storage-Token 認証トークンが含まれている必要があります。トークンは、Ceph Object Gateway から別のオーセンティケーターから取得できます。Ceph Object Gateway からトークンを取得するには、ユーザーを作成する必要があります。

構文

# radosgw-admin user create --uid="<user_name>" --display-name="<display_name>"

# radosgw-admin user create --uid="swift1" --display-name="First Swift User"

features テーブルに戻ります。

3.1.1. authentication GET

ユーザーを認証するには、X-Auth-User および X-Auth-Key を含むリクエストを作成します。

構文

GET /auth HTTP/1.1
Host: swift.radosgwhost.com
X-Auth-User: johndoe
X-Auth-Key: R7UUOLFDI2ZI9PRCQ53K

表3.2 リクエストヘッダー

名前説明必須

X-Auth-User

認証するキーの Ceph Object Gateway のユーザー名。

文字列

はい

X-Auth-Key

Ceph Object Gateway のユーザー名に関連付けられたキー。

文字列

はい

サーバーからのレスポンスには、X-Auth-Token の値が含まれている必要があります。応答には、API ドキュメント全体で他の要求で指定した < api_version>/<account > 接頭辞を提供する X-Storage-Url が含まれる場合があります。

表3.3 レスポンスヘッダー

名前説明

X-Storage-Token

要求に指定された X-Auth-User の承認トークン。

文字列

X-Storage-Url

ユーザーの URL および <api_version>/<account > パス。

String

レスポンスの例

HTTP/1.1 204 No Content
Date: Mon, 16 Jul 2012 11:05:33 GMT
Server: swift
X-Storage-Url: https://swift.radosgwhost.com/v1/ACCT-12345
X-Storage-Token: UOlCCC8TahFKlWuv9DB09TWHF0nDjpPElha0kAa
Content-Length: 0
Content-Type: text/plain; charset=UTF-8

3.2. サービス操作

Swift 互換サービスに関するデータを取得するには、認証中に取得した X-Storage-Url 値を使用して GET 要求を実行できます。

3.2.1. コンテナーの一覧表示

API バージョンを指定し、アカウントは特定のユーザーアカウントのコンテナーの一覧を返す GET リクエスト。リクエストは特定のユーザーのコンテナーを返すため、リクエストには認証トークンが必要です。リクエストは匿名で行われません。

構文

GET /<api_version>/<account> HTTP/1.1
Host: <Fully_Qualified_Domain_Name>
X-Auth-Token: <auth_token>

表3.4 リクエストパラメーター

名前説明必須有効な値

limit

結果の数を指定の値に制限します。

整数

No

該当なし

format

結果の形式を定義します。

文字列

いいえ

json または xml

marker

マーカー値よりも大きな結果の一覧を返します。

文字列

No

該当なし

レスポンスにはコンテナーの一覧が含まれるか、または HTTP 204 レスポンスコードで返されます。

表3.5 レスポンスエンティティー

名前説明

account

アカウント情報の一覧。

コンテナー

container

コンテナーの一覧。

コンテナー

name

コンテナーの名前。

文字列

bytes

コンテナーのサイズ。

Integer

features テーブルに戻ります。

3.3. コンテナー操作

コンテナーは、データオブジェクトを格納するメカニズムです。アカウントには多くのコンテナーを持たせることができますが、コンテナー名は一意でなければなりません。この API により、クライアントはコンテナーの作成、アクセス制御およびメタデータの設定、コンテナーのコンテンツの取得、およびコンテナーの削除を行うことができます。この API は特定のユーザーのアカウントの情報に関連するリクエストを行うため、コンテナーのアクセス制御が意図的に公開されていない限り、つまり匿名のリクエストを許可しない限り、この API のすべてのリクエストを認証する必要があります。

注記

Amazon S3 API はバケットという用語を使用してデータコンテナーを記述します。Swift API 内のバケットを参照すると、バケットという用語はコンテナーという用語と同じものになります。

オブジェクトストレージの 1 つは、階層パスやディレクトリーをサポートしないことです。代わりに、各コンテナーにオブジェクトがある 1 つ以上のコンテナーで設定される 1 つのレベルをサポートします。RADOS Gateway の Swift 互換 API は、疑似階層コンテナーの概念をサポートします。これは、オブジェクトの命名を使用してコンテナーをエミュレートする手段で、ストレージシステムで実際には実装されません。たとえば、photos/buildings/empire-state.jpg のように、疑似階層名でオブジェクトに名前を付けることができますが、コンテナー名にスラッシュ (/) 文字を含めることはできません。

重要

バージョン付けされた Swift コンテナーに大規模なオブジェクトをアップロードする場合は、python-swiftclient ユーティリティーで --leave-segments オプションを使用します。--leave-segments を使用しないと、マニフェストファイルが上書きされます。したがって、既存のオブジェクトは上書きされ、データが失われることになります。

3.3.1. マルチテナントによるコンテナー操作

クライアントアプリケーションがコンテナーにアクセスする場合は、常に特定ユーザーの認証情報で動作します。Red Hat Ceph Storage 3 では、すべてのユーザーがテナントに属します。詳細は 、マルチテナンシー を 参照してください。そのため、テナントが明示的に指定されていない場合、すべてのコンテナー操作のコンテキストに暗黙的なテナントがあります。したがって、マルチテナンシーは、参照されるコンテナーと、参照しているユーザーが同じテナントに属する限り、以前のリリースと完全に後方互換性があります。

明示的なテナントの指定に使用される拡張機能は、使用されるプロトコルおよび認証システムによって異なります。

テナントとコンテナーはコロンで区切ります。したがって、URL は以下のようになります。

https://rgw.domain.com/tenant:container

一方、create_container() メソッドでは、コンテナーメソッド自体でテナントとコンテナーを分離します。

create_container("tenant:container")

3.3.2. コンテナーの作成

新規コンテナーを作成するには、API バージョン、アカウント、および新規コンテナーの名前で PUT 要求を行います。コンテナー名は一意である必要があります。スラッシュ ( /) を含めることはできず、256 バイト未満でなければなりません。リクエストには、アクセス制御ヘッダーおよびメタデータヘッダーを含めることができます。また、配置プールのセットのキーを識別するストレージポリシーを含めることもできます。たとえば、radosgw-admin zone get を実行して、placement_pools の下に利用可能なキーの一覧を表示することもできます。ストレージポリシーを使用すると、SSD ベースのストレージなど、コンテナーの特別なプールセットを指定できます。操作はべき等です。つまり、すでに存在するコンテナーを作成する要求を行うと、HTTP 202 の戻りコードが返されますが、別のコンテナーは作成されません。

構文

PUT /<api_version>/<account>/<tenant>:<container> HTTP/1.1
Host: <Fully_Qualified_Domain_Name>
X-Auth-Token: <auth_token>
X-Container-Read: <comma_separated_uids>
X-Container-Write: <comma_separated_uids>
X-Container-Meta-<key>: <value>
X-Storage-Policy: <placement_pools_key>

表3.6 Headers

名前説明必須

X-Container-Read

コンテナーの読み取りパーミッションを持つユーザー ID。

ユーザー ID のコンマ区切りの文字列値。

いいえ

X-Container-Write

コンテナーの書き込みパーミッションを持つユーザー ID。

ユーザー ID のコンマ区切りの文字列値。

いいえ

X-Container-Meta-{key}

任意の文字列の値を取得するユーザー定義のメタデータキー。

文字列

いいえ

X-Storage-Policy

Ceph Object Gateway の placement_pools 下にあるストレージポリシーを識別するキー。radosgw-admin zone get を実行し、利用可能なキーを取得します。

文字列

No

同じ名前のコンテナーがすでに存在し、ユーザーがコンテナー所有者である場合、操作は成功します。そうでないと、操作は失敗します。

表3.7 HTTP レスポンス

名前説明ステータスコード

409

コンテナーは、別のユーザーの所有権にすでに存在します。

BucketAlreadyExists

features テーブルに戻ります。

3.3.3. コンテナーのオブジェクトの一覧表示

コンテナー内のオブジェクトを一覧表示するには、API バージョン、アカウント、およびコンテナーの名前を使用して GET リクエストを行います。クエリーパラメーターを指定して完全なリストをフィルターリングしたり、パラメーターを除外してコンテナーに保存されている最初の 10,000 オブジェクト名の一覧を返すこともできます。

構文

GET /<api_version>/<tenant>:<container> HTTP/1.1
 Host: <Fully_Qualified_Domain_Name>
 X-Auth-Token: <auth_token>

表3.8 パラメーター

名前説明タイプ有効な値必須

format

結果の形式を定義します。

文字列

json または xml

いいえ

prefix

結果を、指定した接頭辞で始まるオブジェクトに制限します。

文字列

該当なし

いいえ

marker

マーカー値よりも大きな結果の一覧を返します。

文字列

該当なし

いいえ

limit

結果の数を指定の値に制限します。

整数

0 - 10,000

いいえ

delimiter

接頭辞と他のオブジェクト名の間に挿入される区切り文字。

文字列

該当なし

いいえ

path

オブジェクトの擬似階層パス。

文字列

該当なし

No

表3.9 レスポンスエンティティー

名前説明

container

コンテナー

コンテナー

object

コンテナー内のオブジェクト。

コンテナー

name

コンテナー内のオブジェクトの名前。

文字列

hash

オブジェクトのコンテンツのハッシュコード。

文字列

last_modified

オブジェクトの内容を最後に変更した時間。

Date

content_type

オブジェクト内のコンテンツのタイプ。

String

features テーブルに戻ります。

3.3.4. コンテナーのアクセス制御リスト(ACL)の更新

ユーザーがコンテナーを作成すると、ユーザーはデフォルトでコンテナーへの読み取り/書き込みアクセスを持ちます。その他のユーザーがコンテナーのコンテンツを読み取りしたり、コンテナーに書き込むことを許可するには、ユーザーを明示的に有効にする必要があります。X-Container-Read または X-Container-Write* を指定することもできます。これにより、すべてのユーザーがコンテナーから読み取るか、またはコンテナーへの書き込みが可能になります。* を設定すると、コンテナーが公開されます。これにより、匿名ユーザーがコンテナーから読み込むか、またはコンテナーに書き込むことができます。

構文

POST /<api_version>/<account>/<tenant>:<container> HTTP/1.1
Host: <Fully_Qualified_Domain_Name>
 X-Auth-Token: <auth_token>
 X-Container-Read: *
 X-Container-Write: <uid1>, <uid2>, <uid3>

表3.10 リクエストヘッダー

名前説明必須

X-Container-Read

コンテナーの読み取りパーミッションを持つユーザー ID。

ユーザー ID のコンマ区切りの文字列値。

いいえ

X-Container-Write

コンテナーの書き込みパーミッションを持つユーザー ID。

ユーザー ID のコンマ区切りの文字列値。

いいえ

features テーブルに戻ります。

3.3.5. コンテナーメタデータの追加/更新

コンテナーにメタデータを追加するには、API バージョン、アカウント、およびコンテナー名で POST 要求を行います。メタデータを追加または更新するには、コンテナーに対する書き込み権限が必要です。

構文

POST /<api_version>/<account>/<tenant>:<container> HTTP/1.1
Host: <Fully_Qualified_Domain_Name>
 X-Auth-Token: <auth_token>
 X-Container-Meta-Color: red
 X-Container-Meta-Taste: salty

表3.11 リクエストヘッダー

名前説明必須

X-Container-Meta-<key>

任意の文字列の値を取得するユーザー定義のメタデータキー。

文字列

いいえ

features テーブルに戻ります。

3.3.6. コンテナーを削除します。

コンテナーを削除するには、API バージョン、アカウント、およびコンテナーの名前を使用して DELETE 要求を行います。コンテナーは空である必要があります。コンテナーが空であるかを確認する場合は、コンテナーに対して HEAD リクエストを実行します。コンテナーが正常に削除されると、コンテナー名を再利用できます。

構文

DELETE /<api version>/<account>/<tenant>:<container> HTTP/1.1
Host: <Fully_Qualified_Domain_Name>
X-Auth-Token: <auth-token>

表3.12 HTTP レスポンス

名前説明ステータスコード

204

コンテナーが削除されました。

NoContent

features テーブルに戻ります。

3.4. オブジェクト操作

オブジェクトは、データおよびメタデータを保存するコンテナーです。コンテナーには多くのオブジェクトがありますが、オブジェクト名は一意である必要があります。この API により、クライアントはオブジェクトの作成、アクセス制御およびメタデータの設定、オブジェクトのデータおよびメタデータの取得、およびオブジェクトの削除を行うことができます。この API は特定のユーザーのアカウントの情報に関連するリクエストを行うため、コンテナーまたはオブジェクトのアクセス制御が意図的に公開されていない限り、この API のすべてのリクエストを認証する必要があります。つまり、匿名要求が許可されます。

3.4.1. オブジェクトの作成/更新

新規オブジェクトを作成するには、API バージョン、アカウント、コンテナー名、および新規オブジェクトの名前を使用して PUT 要求を行います。オブジェクトを作成または更新するには、コンテナーに書き込みパーミッションが必要です。オブジェクト名は、コンテナー内で一意である必要があります。PUT リクエストはべき等ではないため、一意の名前を使用しないと、リクエストによりオブジェクトが更新されます。ただし、オブジェクト名に疑似階層構文を使用して、別の疑似階層ディレクトリーにある場合は、同じ名前の別のオブジェクトと区別することができます。リクエストには、アクセス制御ヘッダーおよびメタデータヘッダーを含めることができます。

構文

PUT /<api_version>/<account>/<tenant>:<container>/<object> HTTP/1.1
 Host: <Fully_Qualified_Domain_Name>
 X-Auth-Token: <auth_token>

表3.13 リクエストヘッダー

名前説明必須有効な値

ETag

オブジェクトの内容の MD5 ハッシュ。推奨されます。

文字列

No

該当なし

Content-Type

オブジェクトに含まれるコンテンツのタイプ。

文字列

No

該当なし

Transfer-Encoding

オブジェクトが大規模な集約オブジェクトの一部であるかどうかを示します。

文字列

いいえ

chunked

features テーブルに戻ります。

3.4.2. オブジェクトのコピー

オブジェクトをコピーすると、オブジェクトのサーバー側のコピーを作成し、ダウンロードして別のコンテナー/名前でアップロードする必要はありません。あるオブジェクトのコンテンツを別のオブジェクトにコピーするには、API バージョン、アカウント、およびコンテナー名で PUT 要求または COPY 要求を行います。PUT 要求の場合は、要求で宛先コンテナーおよびオブジェクト名、および要求ヘッダーのソースコンテナーおよびオブジェクトを使用します。Copy リクエストには、要求でソースコンテナーおよびオブジェクト、および要求ヘッダーの宛先コンテナーおよびオブジェクトを使用します。オブジェクトをコピーするには、コンテナーに書き込みパーミッションが必要です。宛先オブジェクト名は、コンテナー内で一意である必要があります。リクエストはべき等ではないため、一意の名前を使用しないと、リクエストにより宛先オブジェクトが更新されます。ただし、オブジェクト名に疑似階層構文を使用して、宛先オブジェクトが別の擬似階層ディレクトリーにある場合は、同じ名前のソースオブジェクトと区別することができます。リクエストには、アクセス制御ヘッダーおよびメタデータヘッダーを含めることができます。

構文

PUT /<api_version>/<account>/<tenant>:<dest_container>/<dest_object> HTTP/1.1
X-Copy-From: <tenant>:<source_container>/<source_object>
Host: <Fully_Qualified_Domain_Name>
X-Auth-Token: <auth_token>

または、次のようになります。

構文

COPY /<api_version>/<account>/<tenant>:<source_container>/<source_object> HTTP/1.1
Destination: <tenant>:<dest_container>/<dest_object>

表3.14 リクエストヘッダー

名前説明必須

X-Copy-From

ソースコンテナー/オブジェクトパスを定義するために PUT リクエストで使用されます。

文字列

はい (PUT を使用している場合)

Destination

宛先コンテナー/オブジェクトパスを定義するために COPY 要求で使用されます。

文字列

はい (COPY を使用している場合)

If-Modified-Since

ソースオブジェクトの last_modified 属性の日時以降に変更された場合のみコピーします。

Date

いいえ

If-Unmodified-Since

ソースオブジェクトの last_modified 属性の日時以降に変更した場合のみコピーします。

Date

いいえ

Copy-If-Match

リクエストの ETag がソースオブジェクトの ETag と一致する場合にのみコピーします。

ETag.

いいえ

Copy-If-None-Match

リクエストの ETag がソースオブジェクトの ETag と一致しない場合にのみコピーします。

ETag.

いいえ

features テーブルに戻ります。

3.4.3. オブジェクトの削除

オブジェクトを削除するには、API バージョン、アカウント、コンテナー、およびオブジェクト名を使用して DELETE リクエストを行います。コンテナー内のオブジェクトを削除するには、コンテナーに対する書き込み権限が必要です。オブジェクトが正常に削除されると、オブジェクト名を再利用できます。

構文

DELETE /<api_version>/<account>/<tenant>:<container>/<object> HTTP/1.1
Host: <Fully_Qualified_Domain_Name>
X-Auth-Token: <auth_token>

features テーブルに戻ります。

3.4.4. オブジェクトの取得

オブジェクトを取得するには、API バージョン、アカウント、コンテナー、およびオブジェクト名を使用して GET リクエストを行います。コンテナー内のオブジェクトを取得するには、コンテナーの読み取り権限が必要です。

構文

GET /<api version>/<account>/<tenant>:<container>/<object> HTTP/1.1
Host: <Fully_Qualified_Domain_Name>
X-Auth-Token: <auth-token>

表3.15 リクエストヘッダー

名前説明必須

範囲

オブジェクトの内容のサブセットを取得するには、バイト範囲を指定します。

Date

いいえ

If-Modified-Since

ソースオブジェクトの last_modified 属性の日時以降に変更された場合のみコピーします。

Date

いいえ

If-Unmodified-Since

ソースオブジェクトの last_modified 属性の日時以降に変更した場合のみコピーします。

Date

いいえ

Copy-If-Match

リクエストの ETag がソースオブジェクトの ETag と一致する場合にのみコピーします。

ETag.

いいえ

Copy-If-None-Match

リクエストの ETag がソースオブジェクトの ETag と一致しない場合にのみコピーします。

ETag.

No

表3.16 レスポンスヘッダー

名前説明

Content-Range

オブジェクトコンテンツのサブセットの範囲。range ヘッダーフィールドがリクエストで指定されている場合にのみ返されます。

features テーブルに戻ります。

3.4.5. オブジェクトメタデータの取得

オブジェクトのメタデータを取得するには、API バージョン、アカウント、コンテナー、およびオブジェクト名を使用して HEAD リクエストを行います。コンテナー内のオブジェクトからメタデータを取得するには、コンテナーの読み取り権限が必要です。このリクエストは、オブジェクト自体の要求と同じヘッダー情報を返しますが、オブジェクトのデータを返しません。

構文

HEAD /<api_version>/<account>/<tenant>:<container>/<object> HTTP/1.1
Host: <Fully_Qualified_Domain_Name>
X-Auth-Token: <auth_token>

features テーブルに戻ります。

3.4.6. オブジェクトメタデータの追加/更新

オブジェクトにメタデータを追加するには、API バージョン、アカウント、コンテナー、およびオブジェクト名で POST リクエストを行います。メタデータを追加または更新するには、親コンテナーに対する書き込み権限が必要です。

構文

POST /<api_version>/<account>/<tenant>:<container>/<object> HTTP/1.1
Host: <Fully_Qualified_Domain_Name>
X-Auth-Token: <auth_token>

表3.17 リクエストヘッダー

名前説明必須

X-Object-Meta-<key>

任意の文字列の値を取得するユーザー定義のメタデータキー。

文字列

いいえ

features テーブルに戻ります。

3.5. 一時 URL 操作

GET リクエストなど、認証情報を共有せずにオブジェクトへの一時的なアクセスを許可するには、radosgw の swift エンドポイントにより temp url 機能がサポートされます。この機能には、最初に X-Account-Meta-Temp-URL-Key の値を設定し、必要に応じて X-Account-Meta-Temp-URL-Key-2 を設定する必要があります。Temp URL 機能は、これらの秘密鍵に対する HMAC-SHA1 署名に依存します。

3.5.1. POST Temp-URL キー

必要なキーを持つ swift アカウントへの POST リクエストは、一時 URL アクセスをアカウントに提供できるアカウントのシークレット一時 URL キーを設定します。最大 2 つのキーがサポートされ、存在する場合は両方のキーに対して署名がチェックされるため、一時 URL を無効にせずにキーをローテーションできます。

構文

POST /<api_version>/<account> HTTP/1.1
Host: <Fully_Qualified_Domain_Name>
X-Auth-Token: <auth_token>

表3.18 リクエストヘッダー

名前説明必須

X-Account-Meta-Temp-URL-Key

任意の文字列値を取るユーザー定義のキー。

文字列

はい

X-Account-Meta-Temp-URL-Key-2

任意の文字列値を取るユーザー定義のキー。

文字列

いいえ

3.5.2. GET Temp-URL オブジェクト

一時 URL は、以下の要素を含む暗号化 HMAC-SHA1 署名を使用します。

  • Request メソッドの値 (例:GET)
  • エポックからの経過時間 (秒単位)。つまり Unix 時間です。
  • v1 以降のリクエストパス

上記の項目は、それらの間に新しい行が追加されて正規化され、HMAC は前述の Temp URL キーのいずれかに対して SHA-1 ハッシュアルゴリズムを使用して生成されます。

上記を示すサンプルの Python スクリプトを以下に示します。

import hmac
from hashlib import sha1
from time import time

method = 'GET'
host = 'https://objectstore.example.com'
duration_in_seconds = 300  # Duration for which the url is valid
expires = int(time() + duration_in_seconds)
path = '/v1/your-bucket/your-object'
key = 'secret'
hmac_body = '%s\n%s\n%s' % (method, expires, path)
hmac_body = hmac.new(key, hmac_body, sha1).hexdigest()
sig = hmac.new(key, hmac_body, sha1).hexdigest()
rest_uri = "{host}{path}?temp_url_sig={sig}&temp_url_expires={expires}".format(
     host=host, path=path, sig=sig, expires=expires)
print rest_uri

出力例

https://objectstore.example.com/v1/your-bucket/your-object?temp_url_sig=ff4657876227fc6025f04fcf1e82818266d022c6&temp_url_expires=1423200992

3.6. Swift API の制限

重要

以下の制限事項を使用してください。お使いのハードウェアの選択には影響があるため、この要件を Red Hat アカウントチームと常に相談してください。

  • Swift API を使用する場合の最大オブジェクトサイズ: 5GB
  • Swift API を使用する場合のメタデータの最大サイズ: オブジェクトに適用できるユーザーメタデータの合計サイズに定義された制限はありませんが、単一の HTTP 要求は 16,000 に制限されます。