本ドキュメントはAI翻訳で提供されています。翻訳内容が原文と異なる場合は、韓国語の原文が優先されます。

Storage > Object Storage > APIガイド

このドキュメントでは、NHN Cloud オブジェクトストレージが提供する API を使用してストレージアカウント、コンテナ、オブジェクトを管理する方法について説明します。

オブジェクトストレージ API 共通情報

API エンドポイント

API を使用するには、API エンドポイントとトークンが必要です。 IaaS トークン を参照して、API の使用に必要な情報を準備します。 オブジェクトストレージ API は object-store タイプのエンドポイントを使用します。正確なエンドポイントは、トークン発行レスポンスの serviceCatalog を参照してください。

リージョン エンドポイント
한국(판교) 리전
한국(평촌) 리전
한국(광주) 리전
일본(도쿄) 리전
https://kr1-api-object-storage.nhncloudservice.com/v1/AUTH_*****
https://kr2-api-object-storage.nhncloudservice.com/v1/AUTH_*****
https://kr3-api-object-storage.nhncloudservice.com/v1/AUTH_*****
https://jp1-api-object-storage.nhncloudservice.com/v1/AUTH_*****

認証および権限

Object Storage は、API 呼び出し時の認証/認可に IaaS トークンを使用します。IaaS トークンは、NHN Cloud の OpenStack ベースのインフラサービス(IaaS)で使用する認証トークンです。 IaaS トークンの発行および使用方法については、IaaS トークンを参照してください。

注意

オブジェクトストレージは、基本インフラサービスとは異なるテナント ID を持っています。 オブジェクトストレージのテナント ID は、オブジェクトストレージサービスページの [API エンドポイント設定] ボタンをクリックして確認できます。

ヒント

API パスワードは、オブジェクトストレージサービスページの [API エンドポイント設定] ボタンをクリックして設定することもできます。

トークン発行コードの例

cURL
$ curl -X POST -H 'Content-Type: application/json' \
https://api-identity-infrastructure.nhncloudservice.com/v2.0/tokens \
-d '{"auth": {"tenantId": "6dbc368b94894416bec4cdfc65b5e067", "passwordCredentials": {"username": "*****", "password": "*****"}}}'

{
  "access": {
    "token": {
      "expires": "2018-01-15T08:05:05Z",
      "id": "b587ae461278419da6ecd21a2344c8aa",
      "tenant": {
        "description": "",
        "enabled": true,
        "id": "*****",
        "name": "*****",
        "groupId": "*****",
        "project_domain": "NORMAL",
        "swift": true
      },
      "issued_at": "2018-01-15T07:05:05.719672"
    },
    "serviceCatalog": [
      {
        "endpoints": [
          {
            "region": "KR1",
            "publicURL": "https://kr1-api-object-storage.nhncloudservice.com/v1/AUTH_6dbc368b94894416bec4cdfc65b5e067"
          }
        ],
        "type": "object-store",
        "name": "swift",
        "endpoints_links": []
      }
    ]
  }
}
Java
// AuthService.java
package com.nhn.cloud.auth;

// .. import list

@Data
public class AuthService {

    // リクエストボディ用の内部クラス
    @Data
    public class TokenRequest {

        private Auth auth = new Auth();

        @Data
        public class Auth {
            private String tenantId;
            private PasswordCredentials passwordCredentials = new PasswordCredentials();
        }

        @Data
        public class PasswordCredentials {
            private String username;
            private String password;
        }
    }

    private String authUrl;
    private TokenRequest tokenRequest;
    private RestTemplate restTemplate;

    public AuthService(String authUrl, String tenantId, String username, String password) {
        this.authUrl = authUrl;

        // リクエストボディの作成
        this.tokenRequest = new TokenRequest();
        this.tokenRequest.getAuth().setTenantId(tenantId);
        this.tokenRequest.getAuth().getPasswordCredentials().setUsername(username);
        this.tokenRequest.getAuth().getPasswordCredentials().setPassword(password);

        this.restTemplate = new RestTemplate();
    }

    public String requestToken() {
        String identityUrl = this.authUrl + "/tokens";

        // ヘッダーの作成
        HttpHeaders headers = new HttpHeaders();
        headers.add("Content-Type", "application/json");

        HttpEntity<TokenRequest> httpEntity
            = new HttpEntity<TokenRequest>(this.tokenRequest, headers);

        // トークンのリクエスト
        ResponseEntity<String> response
            = this.restTemplate.exchange(identityUrl, HttpMethod.POST, httpEntity, String.class);

        return response.getBody();
    }

    public static void main(String[] args) {
        final String authUrl = "https://api-identity-infrastructure.nhncloudservice.com/v2.0";
        final String tenantId = "{Tenant ID}";
        final String username = "{NHN Cloud Account}";
        final String password = "{API Password}";

        AuthService authService = new AuthService(authUrl, tenantId, username, password);
        String token = authService.requestToken();

        System.out.println(token);
    }
}
Python
# auth.py
import json
import requests


def get_token(auth_url, tenant_id, username, password):
    token_url = auth_url + '/tokens'
    req_header = {'Content-Type': 'application/json'}
    req_body = {
        'auth': {
            'tenantId': tenant_id,
            'passwordCredentials': {
                'username': username,
                'password': password
            }
        }
    }

    response = requests.post(token_url, headers=req_header, json=req_body)
    return response.json()


if __name__ == '__main__':
    AUTH_URL = 'https://api-identity-infrastructure.nhncloudservice.com/v2.0'
    TENANT_ID = '{Tenant ID}'
    USERNAME = '{NHN Cloud Account}'
    PASSWORD = '{API Password}'

    token = get_token(AUTH_URL, TENANT_ID, USERNAME, PASSWORD)
    print(json.dumps(token, indent=4))
PHP
// auth.php
<?php
function get_token($auth_url, $tenant_id, $username, $password) {
  $url = "$auth_url/tokens";
  $req_body = array(
    'auth' => array(
      'tenantId' => $tenant_id,
      'passwordCredentials' => array(
        'username' => $username,
        'password' => $password
      )
    )
  );  // リクエスト本文の生成
  $req_header = array(
    'Content-Type: application/json'
  );  // リクエストヘッダーの生成

  $curl  = curl_init($url); // curl の初期化
  curl_setopt_array($curl, array(
    CURLOPT_POST => TRUE,
    CURLOPT_RETURNTRANSFER => TRUE,
    CURLOPT_HTTPHEADER => $req_header,
    CURLOPT_POSTFIELDS => json_encode($req_body)
  )); // パラメータの設定
  $response = curl_exec($curl); // API の呼び出し
  curl_close($curl);

  return $response;
}

$AUTH_URL = 'https://api-identity-infrastructure.nhncloudservice.com/v2.0';
$TENANT_ID = '{Tenant ID}';
$USERNAME = '{NHN Cloud Account}';
$PASSWORD = '{API Password}';

$token = get_token($AUTH_URL, $TENANT_ID, $USERNAME, $PASSWORD);
printf("%s\n", $token);
?>

ストレージアカウント

ストレージアカウント (account) は AUTH_***** 形式の文字列です。object-store API エンドポイントに含まれています。

ストレージアカウントの照会

ストレージアカウントの使用状況を照会します。

HEAD /v1/{Account}
X-Auth-Token: {token-id}

リクエスト

リクエスト本文は必要ありません。

名前 種類 形式 必須 説明
X-Auth-Token Header String Y トークン ID
Account URL String Y ストレージアカウント。API エンドポイント設定ダイアログボックスで確認

レスポンス

このリクエストはレスポンス本文を返しません。使用状況はヘッダーに含まれています。リクエストが正しい場合、ステータスコード 200 を返します。

名前 種類 形式 説明
X-Account-Container-Count Header String コンテナ数
X-Account-Object-Count Header String 保存されているオブジェクト数
X-Account-Bytes-Used Header String 保存されているデータ容量 (バイト)

コード例

cURL
$ curl -I -H 'X-Auth-Token: b587ae461278419da6ecd21a2344c8aa' \
https://kr1-api-object-storage.nhncloudservice.com/v1/AUTH_6dbc368b94894416bec4cdfc65b5e067
Java
// AccountService.java
package com.nhn.cloud.obs;
// .. import list

@Data
public class AccountService {
    private String tokenId;
    private String storageUrl;
    private RestTemplate restTemplate;

    public AccountService(String storageUrl, String tokenId) {
        this.setStorageUrl(storageUrl);
        this.setTokenId(tokenId);
        this.restTemplate = new RestTemplate();
    }

    public HashMap<String, String> getStatus() {
        String url = this.getStorageUrl();

        // ヘッダーの作成
        HttpHeaders headers = new HttpHeaders();
        headers.add("X-Auth-Token", tokenId);

        HttpEntity<String> requestHttpEntity = new HttpEntity<String>(null, headers);

        // API 呼び出し
        HashMap<String, String> status = new HashMap<String, String>();
        ResponseEntity<String> response
            = this.restTemplate.exchange(url, HttpMethod.HEAD, requestHttpEntity, String.class);
        if (response.getStatusCode() == HttpStatus.OK) {
            HttpHeaders responseHeaders = response.getHeaders();
            status.put("ContainerCount", responseHeaders.getFirst("X-Account-Container-Count"));
            status.put("ObjectCount", responseHeaders.getFirst("X-Account-Object-Count"));
            status.put("BytesUsed", responseHeaders.getFirst("X-Account-Bytes-Used"));
        }
        return status;
    }

    public static void main(String[] args) {
        final String storageUrl = "https://kr1-api-object-storage.nhncloudservice.com/v1/AUTH_6dbc368b94894416bec4cdfc65b5e067";
        final String tokenId = "b587ae461278419da6ecd21a2344c8aa";

        AccountService accountService = new AccountService(storageUrl, tokenId);
        try {
            HashMap<String, String> status = accountService.getStatus();
            System.out.println(status.toString());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
Python
# account.py
import json
import requests


class AccountService:
    def __init__(self, storage_url, token_id):
        self.storage_url = storage_url
        self.token_id = token_id

    def _get_url(self, container):
        return self.storage_url

    def _get_request_header(self):
        return {'X-Auth-Token': self.token_id}

    def get_stat(self):
        req_header = self._get_request_header()
        resp = requests.head(self.storage_url, headers=req_header)
        return resp.headers


if __name__ == '__main__':
    STORAGE_URL = 'https://kr1-api-object-storage.nhncloudservice.com/v1/AUTH_6dbc368b94894416bec4cdfc65b5e067'
    TOKEN_ID = 'b587ae461278419da6ecd21a2344c8aa'

    acc_service = AccountService(STORAGE_URL, TOKEN_ID)

    # Get the account status
    stat = acc_service.get_stat()
    print(json.dumps(dict(stat), indent=4))
PHP
// account.php
<?php
class Account {
  private $storage_url;
  private $token_id;

  function __construct($storage_url,  $token_id) {
   $this->storage_url = $storage_url;
   $this->token_id = $token_id;
  }

  function get_request_header() {
    return array(
      'X-Auth-Token: ' . $this->token_id
    );
  }

  function get_status() {
    $req_header = $this->get_request_header();

    $curl = curl_init($this->storage_url); // initialize curl
    curl_setopt_array($curl, array(
      CURLOPT_RETURNTRANSFER => TRUE,
      CURLOPT_HTTPHEADER => $req_header,
      CURLOPT_HEADER => TRUE,
    )); // set parameters of curl
    $response = curl_exec($curl); // call api
    curl_close($curl);  // close curl
    $data = explode("\n", $response);

    // parse response headers
    $headers = [];
    foreach($data as $part) {
      $middle = explode(":", $part, 2);
      $headers[trim($middle[0])] = trim($middle[1]);
    }
    return $headers;
  }
}

// main
$STORAGE_URL = 'https://kr1-api-object-storage.nhncloudservice.com/v1/AUTH_6dbc368b94894416bec4cdfc65b5e067';
$TOKEN_ID = 'b587ae461278419da6ecd21a2344c8aa';

$account = new Account($STORAGE_URL, $TOKEN_ID);
$status = $account->get_status();

printf("Container-Count: %d\n", $status["X-Account-Container-Count"]);
printf("Object-Count: %d\n", $status["X-Account-Object-Count"]);
printf("Bytes-Used: %d\n", $status["X-Account-Bytes-Used"]);
?>


コンテナリストの照会

ストレージアカウントのコンテナリストを照会します。

GET /v1/{Account}
X-Auth-Token: {token-id}

リクエスト

リクエスト本文は必要ありません。

名前 種類 形式 必須 説明
X-Auth-Token Header String Y トークン ID
Account URL String Y ストレージアカウント。API エンドポイント設定ダイアログボックスで確認

レスポンス

[ストレージアカウントに属するコンテナのリスト]

コード例

cURL
$ curl -X GET -H 'X-Auth-Token: b587ae461278419da6ecd21a2344c8aa' \
https://kr1-api-object-storage.nhncloudservice.com/v1/AUTH_6dbc368b94894416bec4cdfc65b5e067
Java
// AccountService.java
package com.nhn.cloud.obs;
// .. import list

@Data
public class AccountService {
    // AccountService クラス ...
    public List<String> getContainerList() {
        // ヘッダー作成
        HttpHeaders headers = new HttpHeaders();
        headers.add("X-Auth-Token", tokenId);

        HttpEntity<String> requestHttpEntity = new HttpEntity<String>(null, headers);

        // API 呼び出し
        ResponseEntity<String> response
            = this.restTemplate.exchange(this.getStorageUrl(), HttpMethod.GET, requestHttpEntity, String.class);

        List<String> containerList = null;
        if (response.getStatusCode() == HttpStatus.OK) {
            // String で受け取ったリストを配列に変換
            containerList = Arrays.asList(response.getBody().split("\\r?\\n"));
        }

        // 配列を List に変換して返す
        return new ArrayList<String>(containerList);
    }

    public static void main(String[] args) {
        final String storageUrl = "https://kr1-api-object-storage.nhncloudservice.com/v1/AUTH_6dbc368b94894416bec4cdfc65b5e067";
        final String tokenId = "b587ae461278419da6ecd21a2344c8aa";
        AccountService accountService = new AccountService(storageUrl, tokenId);
        try {
            List<String> containerList = accountService.getContainerList();
            if (containerList != null) {
                for (String object: containerList) {
                    System.out.println(object);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
Python
# account.py
class AccountService:
    # ...
    def get_container_list(self):
      req_header = self._get_request_header()
      resp = requests.get(self.storage_url, headers=req_header)
      return resp.text.split('\n')


if __name__ == '__main__':
    STORAGE_URL = 'https://kr1-api-object-storage.nhncloudservice.com/v1/AUTH_6dbc368b94894416bec4cdfc65b5e067'
    TOKEN_ID = 'b587ae461278419da6ecd21a2344c8aa'
    acc_service = AccountService(STORAGE_URL, TOKEN_ID)

    # Get the container list
    container_list = acc_service.get_container_list()
    for container in container_list:
        print(container)
PHP
// account.php
<?php
class Account {
  // ...
  function get_container_list() {
    $req_header = $this->get_request_header();

    $curl  = curl_init($this->storage_url); // initialize curl
    curl_setopt_array($curl, array(
      CURLOPT_RETURNTRANSFER => TRUE,
      CURLOPT_HTTPHEADER => $req_header,
    )); // set parameters of curl
    $response = curl_exec($curl); // call api
    curl_close($curl);  // close curl

    $container_list = explode("\n", $response);
    return $container_list;
  }
}

// main
$STORAGE_URL = 'https://kr1-api-object-storage.nhncloudservice.com/v1/AUTH_6dbc368b94894416bec4cdfc65b5e067';
$TOKEN_ID = 'b587ae461278419da6ecd21a2344c8aa';

$account = new Account($STORAGE_URL, $TOKEN_ID);
$container_list = $account->get_container_list();
foreach($container_list as $container) {
  printf("%s\n", $container);
}
?>


コンテナ

コンテナの作成

コンテナを作成します。Object Storage にファイルをアップロードするには、必ずコンテナを作成する必要があります。

ヒント

コンテナ名に特殊文字 ' " ` < > ; および空白、相対パス文字 (. ..) は使用できません。

IP アドレス形式の名前は使用できません。

コンテナまたはオブジェクト名に特殊文字 ! * ' ( ) ; : @ & = + $ , / ? # [ ] が含まれている場合、API を使用する際は必ず URL エンコード(パーセントエンコード)を行う必要があります。これらの文字は URL で重要な役割を持つ予約文字です。これらの文字を含むパスを URL エンコードせずに API リクエストを送信した場合、期待どおりのレスポンスを受け取ることはできません。

コンテナを作成する際に X-Storage-Policy ヘッダーを使用して、コンテナのストレージクラスを指定できます。頻繁にアクセスするデータ向けの Standard クラスと、アクセス頻度が低いデータを低コストで長期保管できる Economy クラスを選択できます。ストレージクラスを指定しない場合は、Standard クラスが適用されます。

ヒント

コンテナ名に特殊文字 ' " ` < > ; および空白、相対パス文字 (. ..) は使用できません。 IP アドレス形式の名前は使用できません。 コンテナまたはオブジェクト名に特殊文字 ! * ' ( ) ; : @ & = + $ , / ? # [ ] が含まれている場合、API を使用する際は必ず URL エンコード(パーセントエンコーディング)を行う必要があります。これらの文字は URL において重要な役割を持つ予約文字です。これらの文字が含まれるパスを URL エンコードせずに API リクエストを送信すると、意図したレスポンスを受け取れない場合があります。

コンテナを作成する際、X-Storage-Policy ヘッダーを使用してコンテナのストレージクラスを指定できます。頻繁にアクセスするデータ向けの Standard クラスと、アクセス頻度の低いデータを低コストで長期保管できる Economy クラスを選択できます。ストレージクラスを指定しない場合は、Standard クラスが適用されます。

ヒント

作成済みコンテナのストレージクラスは変更できません。 Economy クラスコンテナにアップロードされたオブジェクトには、最低保管期間 30 日が適用されます。30 日以前に削除されたオブジェクトに対しても、残余保管期間分の料金が課金されます。 Economy クラスコンテナは API リクエスト 1,000 件ごとに料金が適用されます(HEAD/DELETE リクエストを除く)。

コンテナを作成する際に X-Container-Worm-Retention-Day ヘッダーを使用してオブジェクトロック周期を設定すると、オブジェクトロックコンテナを作成できます。オブジェクトロックコンテナにアップロードしたオブジェクトは、WORM (Write-Once-Read-Many) モデルを使用して保存されます。オブジェクトロックコンテナにアップロードしたオブジェクトには、ロック有効期限が設定されます。各オブジェクトに設定されたロック有効期限より前は、オブジェクトを上書きまたは削除することはできません。


PUT /v1/{Account}/{Container}
X-Auth-Token: {token-id}

リクエスト

リクエスト本文は必要ありません。

名前 種類 形式 必須 説明
X-Auth-Token Header String Y トークン ID
Account URL String Y ストレージアカウント。API エンドポイント設定ダイアログボックスで確認
Container URL String Y 作成するコンテナ名
X-Storage-Policy Header String N コンテナのストレージクラス
Standard: 頻繁にアクセスするデータのためのデフォルトクラス
Economy: アクセス頻度が低いデータを長期保管するのに適したクラス
X-Container-Worm-Retention-Day Header Integer N コンテナのデフォルトオブジェクトロック期間を日単位で設定

レスポンス

レスポンス本文は返しません。コンテナが作成された場合、ステータスコード 201 を返します。

コード例

cURL
$ curl -X PUT -H 'X-Auth-Token: b587ae461278419da6ecd21a2344c8aa' \
https://kr1-api-object-storage.nhncloudservice.com/v1/AUTH_6dbc368b94894416bec4cdfc65b5e067/curl_example
Java
// ContainerService.java
package com.nhn.cloud.obs;

// .. import list

@Data
public class ContainerService {

    private String tokenId;
    private String storageUrl;
    private RestTemplate restTemplate;

    public ContainerService(String storageUrl, String tokenId) {
        this.setStorageUrl(storageUrl);
        this.setTokenId(tokenId);

        this.restTemplate = new RestTemplate();
    }

    private String getUrl(@NonNull String containerName) {
        return this.getStorageUrl() + "/" + containerName;
    }

    public void createContainer(String containerName) {
        String url = this.getUrl(containerName);

        // ヘッダーの作成
        HttpHeaders headers = new HttpHeaders();
        headers.add("X-Auth-Token", tokenId);

        HttpEntity<String> requestHttpEntity = new HttpEntity<String>(null, headers);

        // API の呼び出し
        this.restTemplate.exchange(url, HttpMethod.PUT, requestHttpEntity, String.class);
    }

    public static void main(String[] args) {
        final String storageUrl = "https://kr1-api-object-storage.nhncloudservice.com/v1/AUTH_6dbc368b94894416bec4cdfc65b5e067";
        final String tokenId = "b587ae461278419da6ecd21a2344c8aa";
        final String containerName = "test";

        ContainerService containerService = new ContainerService(storageUrl, tokenId);

        try {
            containerService.createContainer(containerName);
            System.out.println("Container " + containerName + " created");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
Python
# container.py
import requests


class ContainerService:
    def __init__(self, storage_url, token_id):
        self.storage_url = storage_url
        self.token_id = token_id

    def _get_url(self, container):
        return self.storage_url + '/' + container

    def _get_request_header(self):
        return {'X-Auth-Token': self.token_id}

    def create(self, container):
        req_url = self._get_url(container)
        req_header = self._get_request_header()
        return requests.put(req_url, headers=req_header)


if __name__ == '__main__':
    STORAGE_URL = 'https://kr1-api-object-storage.nhncloudservice.com/v1/AUTH_6dbc368b94894416bec4cdfc65b5e067'
    TOKEN_ID = 'b587ae461278419da6ecd21a2344c8aa'

    con_service = ContainerService(STORAGE_URL, TOKEN_ID)

    # Create the container
    new_container = 'test'
    con_service.create(new_container)
PHP
// container.php
<?php
class Container {
  private $storage_url;
  private $token_id;

  function __construct($storage_url,  $token_id) {
   $this->storage_url = $storage_url;
   $this->token_id = $token_id;
  }

  function get_url($container = null) {
    $url = $this->storage_url;
    if ($container != null) {
      $url .= '/' . $container;
    }
    return $url;
  }

  function get_request_header() {
    return array(
      'X-Auth-Token: ' . $this->token_id
    );
  }

  function create($container) {
    $req_url = $this->get_url($container);
    $req_header = $this->get_request_header();

    $curl  = curl_init($req_url);
    curl_setopt_array($curl, array(
      CURLOPT_PUT => TRUE,
      CURLOPT_RETURNTRANSFER => TRUE,
      CURLOPT_HTTPHEADER => $req_header
    ));
    $response = curl_exec($curl);
    curl_close($curl);
  }
}

// main
$STORAGE_URL = 'https://kr1-api-object-storage.nhncloudservice.com/v1/AUTH_6dbc368b94894416bec4cdfc65b5e067';
$TOKEN_ID = 'b587ae461278419da6ecd21a2344c8aa';
$CONTAINER_NAME = 'test';

$container = new Container($STORAGE_URL, $TOKEN_ID);

$container->create($CONTAINER_NAME);
?>


コンテナの照会

指定したコンテナの情報と、その中に保存されているオブジェクトのリストを照会します。コンテナの情報は応答ヘッダーで確認できます。

GET /v1/{Account}/{Container}
X-Auth-Token: {token-id}

リクエスト

リクエスト本文は必要ありません。

名前 種類 形式 必須 説明
X-Auth-Token Header String Y トークンID
Account URL String Y ストレージアカウント。API エンドポイント設定ダイアログボックスで確認
Container URL String Y 照会するコンテナ名
marker Query String N 基準オブジェクト名
prefix Query String N 検索する接頭辞
limit Query Integer N リストに表示するオブジェクト数
format Query String N 応答形式。json または xml

注記

コンテナ照会 API はいくつかのクエリを提供します。すべてのクエリは & で連結して組み合わせることができます。

1万件以上のオブジェクトリストの照会

コンテナ照会 API で照会できるリストのオブジェクト数は 1 万件に制限されています。1 万件以上のオブジェクトリストを照会するには、marker クエリを使用する必要があります。marker クエリは、指定したオブジェクトの次のオブジェクトから最大 1 万件のリストを返します。


接頭辞で始まるオブジェクトリストの照会

prefix クエリを使用すると、指定した接頭辞で始まるオブジェクトのリストを返します。prefix クエリを使用して、サブフォルダーのオブジェクトリストを照会できます。


リストの最大オブジェクト数の指定

limit クエリを使用すると、返すオブジェクトリストの最大オブジェクト数を指定できます。


応答形式の指定

format クエリを使用して、json または xml の応答形式を指定できます。応答形式を指定すると、応答本文に各オブジェクトのメタデータ(サイズ、コンテンツタイプ、最終更新日時、ETag)が含まれます。


レスポンス

[コンテナのオブジェクトリスト]

コード例

cURL
$ curl -X GET -H 'X-Auth-Token: b587ae461278419da6ecd21a2344c8aa' \
https://kr1-api-object-storage.nhncloudservice.com/v1/AUTH_6dbc368b94894416bec4cdfc65b5e067/curl_example
ba6610.jpg
20d33f.jpg
31466f.jpg
Java
// ContainerService.java
package com.nhn.cloud.obs;

// .. import list

public class ContainerService {

    // ContainerService Class ...

    public List<String> getObjectList(String containerName) {
        return this.getList(this.getUrl(containerName));
    }

    public List<String> getList(String url) {
        // ヘッダーを作成
        HttpHeaders headers = new HttpHeaders();
        headers.add("X-Auth-Token", tokenId);

        HttpEntity<String> requestHttpEntity = new HttpEntity<String>(null, headers);

        // API 呼び出し
        ResponseEntity<String> response
            = this.restTemplate.exchange(url, HttpMethod.GET, requestHttpEntity, String.class);

        if (response.getStatusCode() == HttpStatus.OK) {
            // String で受け取ったリストを配列に変換
            return Arrays.asList(response.getBody().split("\\r?\\n"));
        }

        return Collections.emptyList();
    }

    public static void main(String[] args) {
        final String storageUrl = "https://kr1-api-object-storage.nhncloudservice.com/v1/AUTH_6dbc368b94894416bec4cdfc65b5e067";
        final String tokenId = "b587ae461278419da6ecd21a2344c8aa";
        final String containerName = "test";

        ContainerService containerService = new ContainerService(storageUrl, tokenId);

        List<String> objectList = containerService.getObjectList(containerName);

        if (objectList != null) {
            for (String object: objectList) {
                System.out.println(object);
            }
        }
    }
}
Python
# container.py
class ContainerService:
    # ...

    def _get_list(self, req_url):
        req_header = self._get_request_header()
        response = requests.get(req_url, headers=req_header)
        return response.text.split('\n')

    def get_object_list(self, container):
        req_url = self._get_url(container)
        return self._get_list(req_url)


if __name__ == '__main__':
    STORAGE_URL = 'https://kr1-api-object-storage.nhncloudservice.com/v1/AUTH_6dbc368b94894416bec4cdfc65b5e067'
    TOKEN_ID = 'b587ae461278419da6ecd21a2344c8aa'
    CONTAINER_NAME = 'test'

    con_service = ContainerService(STORAGE_URL, TOKEN_ID)

    object_list = con_service.get_object_list(CONTAINER_NAME)
    for object in object_list:
        print(object)
PHP
// container.php
<?php
class Container {
  // ...
  function get_list($req_url) {
    $req_header = $this->get_request_header();

    $curl  = curl_init($req_url); // initialize curl
    curl_setopt_array($curl, array(
      CURLOPT_RETURNTRANSFER => TRUE,
      CURLOPT_HTTPHEADER => $req_header,
    )); // set parameters of curl
    $response = curl_exec($curl); // call api
    curl_close($curl);  // close curl
    $object_list = explode("\n", $response);
    return $object_list;
  }

  function get_object_list($container, $last_object = null) {
    $req_url = $this->get_url($container);
    return $this->get_list($req_url);
  }
}

// main
$STORAGE_URL = 'https://kr1-api-object-storage.nhncloudservice.com/v1/AUTH_6dbc368b94894416bec4cdfc65b5e067';
$TOKEN_ID = 'b587ae461278419da6ecd21a2344c8aa';
$CONTAINER_NAME = 'test';

$container = new Container($STORAGE_URL, $TOKEN_ID);

$object_list = $container->get_object_list($CONTAINER_NAME);
foreach ($object_list as $obj) {
  printf("%s\n", $obj);
}
?>


コンテナ設定の変更

コンテナの設定を変更します。コンテナの設定は、コンテナ照会時の応答ヘッダーで確認できます。

POST /v1/{Account}/{Container}
X-Auth-Token: {token-id}
X-Container-Read: {コンテナ読み取りに対するロールベースのアクセスルール}
X-Container-Write: {コンテナ書き込みに対するロールベースのアクセスルール}
X-Container-View: {コンテナ照会に対するロールベースのアクセスルール}
X-Container-Ip-Acl-Allowed-List: {コンテナアクセスに対するIPベースのアクセスルール}
X-Container-Ip-Acl-Denied-List: {コンテナアクセスに対するIPベースのアクセスルール}
X-Container-Ip-Acl-Service-Gateway-Control: {サービスゲートウェイを経由するリクエストのアクセス権限}
X-Container-Object-Lifecycle: {コンテナのオブジェクトライフサイクル}
X-Container-Object-Transfer-To: {オブジェクトのライフサイクルが期限切れになったときに移動先となるコンテナ}
X-History-Location: {オブジェクトの旧バージョンを保存するコンテナ}
X-Versions-Retention: {オブジェクトの旧バージョンのライフサイクル}
X-Container-Meta-Web-Index: {静的ウェブサイトのインデックスドキュメントオブジェクト}
X-Container-Meta-Web-Error: {静的ウェブサイトのエラードキュメントオブジェクトのサフィックス}
X-Container-Meta-Access-Control-Allow-Origin: {クロスオリジンリソース共有の許可リスト}
X-Container-Rfc-Compliant-Etags: {RFC準拠のETag形式を使用するかどうか}
X-Container-Worm-Retention-Day: {コンテナのオブジェクトロック周期}
X-Container-Object-Deny-Extension-Policy: {オブジェクトアップロードポリシーの拡張子ブラックリスト}
X-Container-Object-Deny-Keyword-Policy: {オブジェクトアップロードポリシーのファイル名ブラックリスト}
X-Container-Object-Allow-Extension-Policy: {オブジェクトアップロードポリシーの拡張子ホワイトリスト}
X-Container-Object-Allow-Keyword-Policy: {オブジェクトアップロードポリシーのファイル名ホワイトリスト}

リクエスト

リクエスト本文は必要ありません。

名前 種類 形式 必須 説明
X-Auth-Token Header String Y トークン ID
X-Container-Read Header String N コンテナ読み取りに対するロールベースのアクセスルール設定
X-Container-Write Header String N コンテナ書き込みに対するロールベースのアクセスルール設定
X-Container-View Header String N コンテナ照会に対するロールベースのアクセスルール設定
X-Container-Ip-Acl-Allowed-List Header String N コンテナアクセスに対するIPベースのアクセスルール設定
X-Container-Ip-Acl-Denied-List Header String N コンテナアクセスに対するIPベースのアクセスルール設定
X-Container-Ip-Acl-Service-Gateway-Control Header String N サービスゲートウェイリクエストのアクセス権限設定、readwriterwdeny
X-Container-Object-Lifecycle Header Integer N コンテナのデフォルトオブジェクトライフサイクルを日単位で設定
X-Container-Object-Transfer-To Header String N オブジェクトのライフサイクルが期限切れになったときに移動先となるコンテナ
X-History-Location Header String N オブジェクトの旧バージョンを保管するコンテナを設定
X-Versions-Retention Header Integer N オブジェクトの旧バージョンのライフサイクルを日単位で設定
X-Container-Meta-Web-Index Header String N 静的ウェブサイトのインデックスドキュメントオブジェクトを設定
英字、数字、一部の特殊文字(-, _, ., /)のみ使用可
X-Container-Meta-Web-Error Header String N 静的ウェブサイトのエラードキュメントオブジェクトのサフィックスを設定
英字、数字、一部の特殊文字(-, _, ., /)のみ使用可
X-Container-Meta-Access-Control-Allow-Origin Header String N CORS許可オリジンリスト。スペース区切りで入力するか、* ですべてのオリジンを許可
X-Container-Rfc-Compliant-Etags Header String N RFCに準拠したETag形式を使用するかどうかを設定。true または false
X-Container-Worm-Retention-Day Header Integer N コンテナのデフォルトオブジェクトロック期間を日単位で設定
オブジェクトロックコンテナでのみ変更可能
X-Container-Object-Deny-Extension-Policy Header String N オブジェクトアップロードポリシーの拡張子ブラックリスト
X-Container-Object-Deny-Keyword-Policy Header String N オブジェクトアップロードポリシーのファイル名ブラックリスト
X-Container-Object-Allow-Extension-Policy Header String N オブジェクトアップロードポリシーの拡張子ホワイトリスト
X-Container-Object-Allow-Keyword-Policy Header String N オブジェクトアップロードポリシーのファイル名ホワイトリスト
Account URL String Y ストレージアカウント。API エンドポイント設定ダイアログボックスで確認
Container URL String Y 変更するコンテナ名


アクセスポリシー設定

X-Container-ReadX-Container-WriteX-Container-ViewX-Container-Ip-Acl-Allowed-ListX-Container-Ip-Acl-Denied-ListX-Container-Ip-Acl-Service-Gateway-Control ヘッダーを使用して、コンテナのアクセスポリシーを設定できます。詳細については、アクセスポリシー設定ガイドを参照してください。


オブジェクトライフサイクル設定

X-Container-Object-Lifecycle ヘッダーを使用すると、コンテナに保存されるオブジェクトのライフサイクルを日単位で設定できます。設定後にアップロードしたオブジェクトにのみ適用されます。 X-Container-Object-Transfer-To ヘッダーを使用すると、ライフサイクルが期限切れになったオブジェクトを指定したコンテナに移動して保管できます。コンテナが指定されていない場合、期限切れのオブジェクトは削除されます。

ヒント

コンテナポリシーを通じて、きめ細かいライフサイクルルールを設定できます。 詳細については、コンテナポリシー設定ガイドを参照してください。

ヒント

Standard クラスのコンテナに保存されたオブジェクトを、ライフサイクルに従って Economy クラスのコンテナに移動することで、長期保管にかかるコストを削減できます。


バージョン管理ポリシー設定

オブジェクト内容の修正 に記載されているとおり、オブジェクトをアップロードする際に同じ名前のオブジェクトがすでに存在する場合、オブジェクトが更新されます。既存のオブジェクトの内容を保管したい場合は、X-History-Location ヘッダーを使用して、以前のバージョンを保管するアーカイブコンテナを指定できます。

旧バージョンのオブジェクトはアーカイブコンテナに次の形式で保管されます。

{3桁の16進数で表されたオブジェクト名の長さ}{オブジェクト名}/{以前のバージョンのオブジェクトが保管されたUnix時間}
例えば、picture.jpg というオブジェクトを更新すると、アーカイブコンテナに 00bpicture.jpg/1610606551.82539 というオブジェクトが作成されます。

バージョン管理ポリシーが設定されたコンテナでオブジェクトを削除すると、アーカイブコンテナに削除されたオブジェクトが保管され、削除マーカーオブジェクトが作成されます。アーカイブコンテナに保管された旧バージョンのオブジェクトにはいつでもアクセスできます。

X-Versions-Retention ヘッダーを併用すると、旧バージョンのオブジェクトのライフサイクルを日単位で設定できます。1 を設定した場合、保管されたオブジェクトは 1 日後に自動的に削除されます。設定しない場合、旧バージョンのオブジェクトはユーザーが削除するまで保管されます。設定後に保管された旧バージョンのオブジェクトにのみ適用されます。

注意

アーカイブコンテナを元のコンテナより先に削除すると、元のコンテナのオブジェクトの更新または削除時にエラーが発生します。すでに削除した場合は、アーカイブコンテナを新たに作成するか、元のコンテナのバージョン管理ポリシーを解除することで解決できます。

アーカイブコンテナとして使用するコンテナ名にはUnicode文字を使用しないことをお勧めします。アーカイブコンテナとして指定するコンテナ名にUnicode文字が含まれている場合は、必ずURLエンコード後にリクエストヘッダーに入力する必要があります。

暗号化コンテナをアーカイブコンテナとして指定した後、暗号化コンテナの対称キーを Secure Key Manager サービスから削除すると、元のコンテナへのオブジェクトのアップロードと削除が失敗します。


静的ウェブサイト設定

コンテナの読み取りアクセス権限をすべてのユーザーに許可した後、X-Container-Meta-Web-IndexX-Container-Meta-Web-Error ヘッダーを使用して静的ウェブサイトのインデックスドキュメントとエラードキュメントを設定すると、コンテナURLを使用して静的ウェブサイトをホスティングできます。

静的ウェブサイトのインデックスドキュメントおよびエラードキュメントとして使用するオブジェクトは、1文字以上の英字、数字、または一部の特殊文字(-, _, ., /)で構成された名前である必要があり、ファイル拡張子が .html のハイパーテキスト形式でなければなりません。条件を満たさない場合、設定できないか、静的ウェブサイトが正常に動作しない場合があります。 静的ウェブサイトのエラードキュメント名は {レスポンスコード}{サフィックス} の形式です。例えば、エラードキュメントを error.html と設定した場合、404エラーが発生したときに表示されるエラードキュメントの名前は 404error.html になります。各エラー状況に合わせてエラードキュメントをアップロードして使用できます。エラードキュメントを定義しない場合、またはレスポンスコードに対応するエラードキュメントオブジェクトが存在しない場合は、ウェブブラウザのデフォルトエラードキュメントが表示されます。

Cross-Origin Resource Sharing (CORS)

ブラウザから Object Storage API を直接呼び出すには、Cross-Origin Resource Sharing (CORS) の設定が必要です。X-Container-Meta-Access-Control-Allow-Origin ヘッダーを使用して、許可するオリジンのリストを設定します。スペース()区切りで1つ以上のオリジンを入力するか、* を入力してすべてのオリジンを許可できます。

ヒント

X-Container-Meta-Access-Control-Allow-Originに設定できる許可オリジンは最大100件です。この制限はコンテナポリシーで設定する場合も同様に適用されます。

CORS 設定例 コンテナに CORS 設定を追加します。
$ curl -X POST \
-H 'X-Auth-Token: b587ae461278419da6ecd21a2344c8aa' \
-H 'X-Container-Meta-Access-Control-Allow-Origin: https://example.com' \
https://kr1-api-object-storage.nhncloudservice.com/v1/AUTH_6dbc368b94894416bec4cdfc65b5e067/container

ブラウザで CORS を許可したサイトに移動し、次のスクリプトを実行します。スクリプトはブラウザが提供する開発者ツールのコンソールで実行できます。
例: `https://example.com/`
var token = "****";
var url = "https://kr1-api-object-storage.nhncloudservice.com/v1/AUTH_6dbc368b94894416bec4cdfc65b5e067/container/object";
var request = new XMLHttpRequest();
request.onreadystatechange = function (oEvent) {
  if (request.readyState == 4) {
      result = 'Status: ' + request.status;
      result = result + '\n' + request.getAllResponseHeaders();
      console.log(result)
  }
}
request.open('GET', url);
request.setRequestHeader('X-Auth-Token', token);
request.send(null);

CORS 設定に問題がなければ、コンソールで次のような成功レスポンスを確認できます。
Status: 200
content-length: 1
content-type: application/octet-stream
etag: bad093d7f49dc495751cb3f7f8b2530c
last-modified: Mon, 30 May 2022 15:16:43 GMT
x-openstack-request-id: tx0b1637089d1841d6833d2-0062a60940
x-timestamp: 1653923802.28970
x-trans-id: tx0b1637089d1841d6833d2-0062a60940

CORS 設定を行っていない場合、または許可されていないサイトから API を呼び出した場合は、次のようなエラーレスポンスが返されます。
Access to XMLHttpRequest at 'https://kr1-api-object-storage.nhncloudservice.com/v1/AUTH_6dbc368b94894416bec4cdfc65b5e067/container/object' from origin 'https://example.com' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.

Status: 0


RFCに準拠したETag形式の使用設定

一部のアプリケーションでは、RFC7232 の仕様に従い、ダブルクォートで囲まれたETag値を要求します。X-Container-Rfc-Compliant-Etags ヘッダーを使用すると、コンテナに保存されたオブジェクトを照会する際にダブルクォートで囲まれたETag値を返すように設定できます。


オブジェクトロック期間の変更

X-Container-Worm-Retention-Day ヘッダーを使用して、オブジェクトロックコンテナのオブジェクトロック期間を変更します。ロック期間は日単位で入力でき、解除することはできません。変更されたロック期間は、変更後にアップロードするオブジェクトに適用されます。オブジェクトロック期間はオブジェクトロックコンテナでのみ変更できます。

ヒント

通常のコンテナをオブジェクトロックコンテナに変更したり、オブジェクトロックコンテナを通常のコンテナに変更したりすることはできません。

オブジェクトロックコンテナは、アーカイブコンテナ またはレプリケーション対象コンテナとして指定することはできません。


アップロードポリシー設定の変更

X-Container-Object-Deny-Extension-PolicyX-Container-Object-Deny-Keyword-PolicyX-Container-Object-Allow-Extension-PolicyX-Container-Object-Allow-Keyword-Policy ヘッダーを使用して、コンテナにオブジェクト名ベースのアップロードポリシーを設定できます。アップロードポリシー設定を活用すると、名前に特定の拡張子やキーワードが含まれるオブジェクトのみをアップロードする、またはアップロードできないように制限できます。

アップロードポリシーは、ポリシーが設定された以降にアップロードされるオブジェクトに適用されます。パスが含まれるオブジェクトは、パスを除いたオブジェクト名にポリシーが適用されます。 すべてのアップロードポリシーヘッダーは , 区切り文字を使用して複数のルールを入力でき、区切り文字 , を除く各ルールはURLエンコード(パーセントエンコーディング)する必要があります。 拡張子ルールはファイルの拡張子を、ファイル名ルールはオブジェクト名への含有を検査します。拡張子ルールは . を除いて入力する必要があります。例えば、txt拡張子を入力する場合は .txt ではなく txt のみ入力します。

アップロードポリシーはホワイトリストとブラックリストを同時に使用できません。両方の属性を設定するようリクエストした場合、失敗レスポンスが返されます。

ホワイトリスト設定例を確認 コンテナにホワイトリストのアップロードポリシー設定を追加します。
$ curl -X POST \
-H 'X-Auth-Token: b587ae461278419da6ecd21a2344c8aa' \
-H 'X-Container-Object-Allow-Extension-Policy: exe, jpg' \
https://kr1-api-object-storage.nhncloudservice.com/v1/AUTH_6dbc368b94894416bec4cdfc65b5e067/container

$ curl -X PUT \
-H 'X-Auth-Token: b587ae461278419da6ecd21a2344c8aa' \
https://kr1-api-object-storage.nhncloudservice.com/v1/AUTH_6dbc368b94894416bec4cdfc65b5e067/container/test.jpg -i

HTTP/1.1 409 Conflict
Content-Length: 72
Content-Type: text/html; charset=UTF-8
X-Trans-Id: txddeb34d60f7f4b43a8b2a-0065b8b134
X-Openstack-Request-Id: txddeb34d60f7f4b43a8b2a-0065b8b134
Date: Tue, 30 Jan 2024 08:20:04 GMT

Only the objects with the following extensions can be uploaded: exe, jpg
$ curl -X POST \
-H 'X-Auth-Token: b587ae461278419da6ecd21a2344c8aa' \
-H 'X-Container-Object-Allow-Keyword-Policy: example' \
https://kr1-api-object-storage.nhncloudservice.com/v1/AUTH_6dbc368b94894416bec4cdfc65b5e067/container

$ curl -X PUT \
-H 'X-Auth-Token: b587ae461278419da6ecd21a2344c8aa' \
https://kr1-api-object-storage.nhncloudservice.com/v1/AUTH_6dbc368b94894416bec4cdfc65b5e067/container/upload.txt -i

HTTP/1.1 409 Conflict
Content-Length: 60
Content-Type: text/html; charset=UTF-8
X-Trans-Id: tx24209f2af02b4de0a4921-0065b8b192
X-Openstack-Request-Id: tx24209f2af02b4de0a4921-0065b8b192
Date: Tue, 30 Jan 2024 08:21:38 GMT

The object name must contain the following keywords: example
ブラックリスト設定例を確認 コンテナにブラックリストのアップロードポリシー設定を追加します。
$ curl -X POST \
-H 'X-Auth-Token: b587ae461278419da6ecd21a2344c8aa' \
-H 'X-Container-Object-Deny-Extension-Policy: exe, jpg' \
https://kr1-api-object-storage.nhncloudservice.com/v1/AUTH_6dbc368b94894416bec4cdfc65b5e067/container

$ curl -X PUT \
-H 'X-Auth-Token: b587ae461278419da6ecd21a2344c8aa' \
https://kr1-api-object-storage.nhncloudservice.com/v1/AUTH_6dbc368b94894416bec4cdfc65b5e067/container/test.jpg -i

HTTP/1.1 409 Conflict
Content-Length: 70
Content-Type: text/html; charset=UTF-8
X-Trans-Id: tx4a0f746118e9453ca8688-0065b8b038
X-Openstack-Request-Id: tx4a0f746118e9453ca8688-0065b8b038
Date: Tue, 30 Jan 2024 08:15:52 GMT

The objects with the following extensions cannot be uploaded: exe, jpg
$ curl -X POST \
-H 'X-Auth-Token: b587ae461278419da6ecd21a2344c8aa' \
-H 'X-Container-Object-Deny-Keyword-Policy: example' \
https://kr1-api-object-storage.nhncloudservice.com/v1/AUTH_6dbc368b94894416bec4cdfc65b5e067/container

$ curl -X PUT \
-H 'X-Auth-Token: b587ae461278419da6ecd21a2344c8aa' \
https://kr1-api-object-storage.nhncloudservice.com/v1/AUTH_6dbc368b94894416bec4cdfc65b5e067/container/upload_example.txt -i

HTTP/1.1 409 Conflict
Content-Length: 64
Content-Type: text/html; charset=UTF-8
X-Trans-Id: tx60aaa14186d84cca88a8e-0065b8b098
X-Openstack-Request-Id: tx60aaa14186d84cca88a8e-0065b8b098
Date: Tue, 30 Jan 2024 08:17:28 GMT

The object name must not contain the following keywords: example

コンテナ設定の解除

値のないヘッダーを使用すると、設定が解除されます。たとえば、オブジェクトのライフサイクルが 3 日に設定されている場合に 'X-Container-Object-Lifecycle: ' を使用してコンテナの変更をリクエストすると、オブジェクトのライフサイクル設定が解除され、以降コンテナに保存されるオブジェクトにはライフサイクルが自動的に設定されなくなります。

レスポンス

レスポンス本文は返しません。リクエストが正しい場合は、ステータスコード 204 を返します。

コード例

すべてのユーザーにコンテナの読み取りおよび書き込みアクセスを許可する設定変更リクエストの例です。同じ方法で他の設定も必要なヘッダーを選択してリクエストできます。

cURL
$ curl -X POST \
-H 'X-Auth-Token: b587ae461278419da6ecd21a2344c8aa' \
-H 'X-Container-Read: .r:*' \
-H 'X-Container-Write: *:*' \
https://kr1-api-object-storage.nhncloudservice.com/v1/AUTH_6dbc368b94894416bec4cdfc65b5e067/curl_example
Java
// ContainerService.java

package com.nhn.cloud.obs;

// ... import list

public class ContainerService {

    // ContainerService クラス ...

    public void setContainerReadACL(String containerName, boolean isPublic) {
        final String PUBLIC_ACL = ".r:*";
        final String PRIVATE_ACL = "";

        String permission = isPublic ? PUBLIC_ACL : PRIVATE_ACL;

        String url = this.getUrl(containerName);

        // ヘッダーの作成
        HttpHeaders headers = new HttpHeaders();
        headers.add("X-Auth-Token", tokenId);
        headers.add("X-Container-Read", permission);    // ヘッダーに権限を追加

        HttpEntity<String> requestHttpEntity = new HttpEntity<String>(null, headers);

        // API の呼び出し
        this.restTemplate.exchange(url, HttpMethod.POST, requestHttpEntity, String.class);
    }

    public static void main(String[] args) {
        final String storageUrl = "https://kr1-api-object-storage.nhncloudservice.com/v1/AUTH_6dbc368b94894416bec4cdfc65b5e067";
        final String tokenId = "b587ae461278419da6ecd21a2344c8aa";
        final String containerName = "test";

        ContainerService containerService = new ContainerService(storageUrl, tokenId);

        try {
            containerService.setContainerReadACL(containerName, true);
            System.out.println("Container " + containerName + " became public.");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
Python
# container.py
class ContainerService:
    # ...
    def set_read_acl(self, container, is_public):
        req_url = self._get_url(container)
        req_header = self._get_request_header()
        req_header['X-Container-Read'] = '.r:*' if is_public else ''
        return requests.post(req_url, headers=req_header)

if __name__ == '__main__':
    STORAGE_URL = 'https://kr1-api-object-storage.nhncloudservice.com/v1/AUTH_6dbc368b94894416bec4cdfc65b5e067'
    TOKEN_ID = 'b587ae461278419da6ecd21a2344c8aa'
    CONTAINER_NAME = 'test'

    con_service = ContainerService(STORAGE_URL, TOKEN_ID)

    con_service.set_read_acl(CONTAINER_NAME, True)
PHP
// container.php
<?php
class Container {
  const PUBLIC_ACL = '.r:*';
  const PRIVATE_ACL = '';
  // ...
  function set_acl($container, $is_public) {
    $req_url = $this->get_url($container);

    $permission = $is_public ? self::PUBLIC_ACL : self::PRIVATE_ACL;
    $req_header = $this->get_request_header();
    $req_header[] = 'X-Container-Read: ' . $permission;  // ヘッダーにアクセス許可を追加

    $curl  = curl_init($req_url);
    curl_setopt_array($curl, array(
      CURLOPT_POST => TRUE,
      CURLOPT_RETURNTRANSFER => TRUE,
      CURLOPT_HTTPHEADER => $req_header
    ));
    $response = curl_exec($curl);
    curl_close($curl);

    return $response;
  }
}

// main
$STORAGE_URL = 'https://kr1-api-object-storage.nhncloudservice.com/v1/AUTH_6dbc368b94894416bec4cdfc65b5e067';
$TOKEN_ID = 'b587ae461278419da6ecd21a2344c8aa';
$CONTAINER_NAME = 'test';

$container = new Container($STORAGE_URL, $TOKEN_ID);

$container->set_acl($CONTAINER_NAME, TRUE);
?>


コンテナの削除

指定したコンテナを削除します。削除するコンテナは必ず空である必要があります。

DELETE /v1/{Account}/{Container}
X-Auth-Token: {token-id}

リクエスト

リクエスト本文は必要ありません。

名前 種類 形式 必須 説明
X-Auth-Token Header String Y トークンID
Account URL String Y ストレージアカウント、APIエンドポイント設定ダイアログボックスで確認
Container URL String Y 削除するコンテナ名

レスポンス

このリクエストはレスポンス本文を返しません。リクエストが正しい場合、ステータスコード 204 を返します。


コード例

cURL
$ curl -X DELETE -H 'X-Auth-Token: b587ae461278419da6ecd21a2344c8aa' \
https://kr1-api-object-storage.nhncloudservice.com/v1/AUTH_6dbc368b94894416bec4cdfc65b5e067/curl_example
Java
// ContainerService.java

package com.nhn.cloud.obs;

// ... import list

public class ContainerService {

    // ContainerService Class ...

    public void deleteContainer(String containerName) {
        String url = this.getUrl(containerName);

        // ヘッダーの作成
        HttpHeaders headers = new HttpHeaders();
        headers.add("X-Auth-Token", tokenId);

        HttpEntity<String> requestHttpEntity = new HttpEntity<String>(null, headers);

        // API 呼び出し
        this.restTemplate.exchange(url, HttpMethod.DELETE, requestHttpEntity, String.class);
    }

    public static void main(String[] args) {
        final String storageUrl = "https://kr1-api-object-storage.nhncloudservice.com/v1/AUTH_6dbc368b94894416bec4cdfc65b5e067";
        final String tokenId = "b587ae461278419da6ecd21a2344c8aa";
        final String containerName = "test";

        ContainerService containerService = new ContainerService(storageUrl, tokenId);

        try {
            containerService.deleteContainer(containerName);
            System.out.println("Container " + containerName + " deleted.");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
Python
# container.py
class ContainerService:
    # ...
    def delete(self, container):
        req_url = self._get_url(container)
        req_header = self._get_request_header()
        return requests.delete(req_url, headers=req_header)

if __name__ == '__main__':
    STORAGE_URL = 'https://kr1-api-object-storage.nhncloudservice.com/v1/AUTH_6dbc368b94894416bec4cdfc65b5e067'
    TOKEN_ID = 'b587ae461278419da6ecd21a2344c8aa'
    CONTAINER_NAME = 'test'

    con_service = ContainerService(STORAGE_URL, TOKEN_ID)

    con_service.delete(CONTAINER_NAME)
PHP
// container.php
<?php
class Container {
  // ...
  function delete($container) {
    $req_url = $this->get_url($container);
    $req_header = $this->get_request_header();

    $curl  = curl_init($req_url); // initialize curl
    curl_setopt_array($curl, array(
      CURLOPT_CUSTOMREQUEST => "DELETE",
      CURLOPT_RETURNTRANSFER => TRUE,
      CURLOPT_HTTPHEADER => $req_header
    )); // set parameters of curl
    $response = curl_exec($curl); // call api
    curl_close($curl);  // close curl
  }
}

// main
$STORAGE_URL = 'https://kr1-api-object-storage.nhncloudservice.com/v1/AUTH_6dbc368b94894416bec4cdfc65b5e067';
$TOKEN_ID = 'b587ae461278419da6ecd21a2344c8aa';
$CONTAINER_NAME = 'test';

$container = new Container($STORAGE_URL, $TOKEN_ID);

$container->delete($CONTAINER_NAME);
?>


オブジェクト

オブジェクトのアップロード

指定したコンテナに新しいオブジェクトをアップロードします。

PUT /v1/{Account}/{Container}/{Object}
X-Auth-Token: {token-id}
Content-Type: {content-type}

リクエスト

名前 種類 形式 必須 説明
X-Auth-Token Header String Y トークン ID
Content-Type Header String Y オブジェクトのコンテンツタイプ
X-Delete-At Header Timestamp N オブジェクトの有効期限、Unix 時間(秒)
X-Delete-After Header Timestamp N オブジェクトの有効時間、Unix 時間(秒)
Account URL String Y ストレージアカウント、API エンドポイント設定ダイアログボックスで確認
Container URL String Y コンテナ名
Object URL String Y 作成するオブジェクト名
- Body Binary Y 作成するオブジェクトの内容

オブジェクトのライフサイクル設定

X-Delete-At または X-Delete-After ヘッダーを使用すると、オブジェクトのライフサイクルを秒単位で設定できます。

注意

オブジェクト名が ./ または ../ で始まる場合、ブラウザがそれをパス文字として認識し、コンソールからアクセスできません。 API を使用してこのような名前のオブジェクトをアップロードした場合は、API からアクセスする必要があります。

レスポンス

このリクエストはレスポンス本文を返しません。リクエストが正しければ、ステータスコード 201 を返します。

コード例

cURL
$ curl -X PUT -H 'X-Auth-Token: b587ae461278419da6ecd21a2344c8aa' \
https://kr1-api-object-storage.nhncloudservice.com/v1/AUTH_6dbc368b94894416bec4cdfc65b5e067/curl_example/ba6610.jpg \
-T ./ba6610.jpg
Java
// ObjectService.java
package com.nhn.cloud.obs;

// ... import list

@Data
public class ObjectService {

    private String tokenId;
    private String storageUrl;
    private RestTemplate restTemplate;

    public ObjectService(String storageUrl, String tokenId) {
        this.setStorageUrl(storageUrl);
        this.setTokenId(tokenId);

        this.restTemplate = new RestTemplate();
    }

    private String getUrl(@NonNull String containerName, @NonNull String objectName) {
        return this.getStorageUrl() + "/" + containerName + "/" + objectName;
    }

    public void uploadObject(String containerName, String objectName, final InputStream inputStream) {
        String url = this.getUrl(containerName, objectName);

        // InputStreamをリクエストボディに追加できるようにRequestCallbackをオーバーライド
        final RequestCallback requestCallback = new RequestCallback() {
            public void doWithRequest(final ClientHttpRequest request) throws IOException {
                request.getHeaders().add("X-Auth-Token", tokenId);
                IOUtils.copy(inputStream, request.getBody());
            }
        };

        // オーバーライドしたRequestCallbackを使用できるように設定
        SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();
        requestFactory.setBufferRequestBody(false);
        RestTemplate restTemplate = new RestTemplate(requestFactory);

        HttpMessageConverterExtractor<String> responseExtractor
            = new HttpMessageConverterExtractor<String>(String.class, restTemplate.getMessageConverters());

        // API呼び出し
        restTemplate.execute(url, HttpMethod.PUT, requestCallback, responseExtractor);
    }

    public static void main(String[] args) {
        final String storageUrl = "https://kr1-api-object-storage.nhncloudservice.com/v1/AUTH_6dbc368b94894416bec4cdfc65b5e067";
        final String tokenId = "b587ae461278419da6ecd21a2344c8aa";
        final String containerName = "test";
        final String objectPath = "/home/example/";
        final String objectName = "46432aa503ab715f288c4922911d2035.jpg";

        ObjectService objectService = new ObjectService(storageUrl, tokenId);

        try {
            // ファイルからInputStreamを生成
            File objFile = new File(objectPath + "/" + objectName);
            InputStream inputStream = new FileInputStream(objFile);

            // アップロード
            objectService.uploadObject(containerName, objectName, inputStream);
            System.out.println("\nUpload OK");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
Python
# object.py
import os
import requests


class ObjectService:
    def __init__(self, storage_url, token_id):
        self.storage_url = storage_url
        self.token_id = token_id

    def _get_url(self, container, object):
        return '/'.join([self.storage_url, container, object])

    def _get_request_header(self):
        return {'X-Auth-Token': self.token_id}

    def upload(self, container, object, object_path):
        req_url = self._get_url(container, object)
        req_header = self._get_request_header()

        path = '/'.join([object_path, object])
        with open(path, 'rb') as f:
            return requests.put(req_url, headers=req_header, data=f.read())


if __name__ == '__main__':
    STORAGE_URL = 'https://kr1-api-object-storage.nhncloudservice.com/v1/AUTH_6dbc368b94894416bec4cdfc65b5e067'
    TOKEN_ID = 'b587ae461278419da6ecd21a2344c8aa'
    CONTAINER_NAME = 'test'
    OBJECT_NAME = 'd03bda22ffb649a97958d4a5bf4b6eaf.jpg'
    OBJECT_PATH = '/home/example/'

    obj_service = ObjectService(STORAGE_URL, TOKEN_ID)

    obj_service.upload(CONTAINER_NAME, OBJECT_NAME, OBJECT_PATH)
PHP
// object.php
<?php
class ObjectService {
  private $storage_url;
  private $token_id;

  function __construct($storage_url,  $token_id) {
    $this->storage_url = $storage_url;
    $this->token_id = $token_id;
  }

  function get_url($container, $object) {
    return $this->storage_url . '/' . $container . '/' . $object;
  }

  function get_request_header() {
    return array(
      'X-Auth-Token: ' . $this->token_id
    );
  }

  function upload($container, $object, $filename) {
    $req_url = $this->get_url($container, $object);

    $req_header = $this->get_request_header();

    $fd = fopen($filename, 'r');  // ファイルを開く。

    $curl  = curl_init($req_url);
    curl_setopt_array($curl, array(
      CURLOPT_PUT => TRUE,
      CURLOPT_RETURNTRANSFER => TRUE,
      CURLOPT_INFILE => $fd,  // ファイルストリームをパラメータとして渡す。
      CURLOPT_HTTPHEADER => $req_header
    ));
    $response = curl_exec($curl);
    curl_close($curl);

    fclose($fd);
  }
}

// main
$STORAGE_URL = 'https://kr1-api-object-storage.nhncloudservice.com/v1/AUTH_6dbc368b94894416bec4cdfc65b5e067';
$TOKEN_ID = 'b587ae461278419da6ecd21a2344c8aa';
$CONTAINER_NAME = 'test';
$OBJECT_NAME = '0428b9e3e419d4fb7aedffde984ba5b3.jpg';
$OBJ_PATH = '/home/example';

$object = new ObjectService($STORAGE_URL, $TOKEN_ID);

// オブジェクトをアップロードする
$filename = $OBJ_PATH.'/'.$OBJECT_NAME;
$object->upload($CONTAINER_NAME, $OBJECT_NAME, $filename);
?>


マルチパートアップロード

5 GB を超えるサイズのオブジェクトは、5 GB 以下のセグメントに分割してアップロードする必要があります。セグメントオブジェクトをアップロードした後、マニフェストオブジェクトを作成すると、1 つのオブジェクトとして使用できます。


セグメントオブジェクトのアップロード

オブジェクトを分割したセグメントオブジェクトをそれぞれアップロードします。

PUT /v1/{Account}/{Container}/{Object}/{Count}
X-Auth-Token: {token-id}
Content-Type: {content-type}


リクエスト
名前 種類 形式 必須 説明
X-Auth-Token Header String Y トークン ID
Content-Type Header String Y オブジェクトのコンテンツタイプ
Account URL String Y ストレージアカウント、API エンドポイント設定ダイアログボックスで確認
Container URL String Y コンテナ名
Object URL String Y 作成するオブジェクト名
Count URL String Y 分割したオブジェクトの順番、例:001、002
- Body Binary Y 分割したオブジェクトの内容


レスポンス

このリクエストはレスポンス本文を返しません。リクエストが正しければ、ステータスコード 201 を返します。


マニフェストオブジェクトの作成

マニフェストオブジェクトは DLO(Dynamic Large Object) と SLO(Static Large Object) の 2 種類の方法で作成できます。

ヒント

マニフェストオブジェクトはセグメントオブジェクトのパス情報を保持しているため、セグメントオブジェクトとマニフェストオブジェクトを必ず同じコンテナにアップロードする必要はありません。セグメントオブジェクトとマニフェストオブジェクトが同一のコンテナに存在して管理が難しい場合は、セグメントオブジェクトを別のコンテナにアップロードし、元々アップロードしようとしていたコンテナにはマニフェストオブジェクトのみ作成することをお勧めします。

DLO

DLO マニフェストオブジェクトは、X-Object-Manifest ヘッダーに入力したセグメントオブジェクトのパスを使用して、自動的にセグメントオブジェクトを検索して連結します。

PUT /v1/{Account}/{Container}/{Object}
X-Auth-Token: {token-id}
X-Object-Manifest: {Segment-Container}/{Segment-Object}/


リクエスト
名前 種類 形式 必須 説明
X-Auth-Token Header String Y トークン ID
X-Object-Manifest Header String Y 分割したセグメントオブジェクトをアップロードしたパス、{Segment-Container}/{Segment-Object}/
Account URL String Y ストレージアカウント、API エンドポイント設定ダイアログボックスで確認
Container URL String Y コンテナ名
Object URL String Y 作成するマニフェストオブジェクト名
- Body Binary Y 空のデータ


SLO

SLO マニフェストオブジェクトは、リクエスト本文にセグメントオブジェクトのリストを順番に記述して入力する必要があります。最大 1 万個のセグメントオブジェクトを入力できます。 SLO マニフェストオブジェクトの作成リクエストを行うと、各セグメントオブジェクトが入力されたパスに存在するか、ETag 値とオブジェクトのサイズが一致するかを確認します。情報が一致しない場合、マニフェストオブジェクトは作成されません。

PUT /v1/{Account}/{Container}/{Object}?multipart-manifest=put
X-Auth-Token: {token-id}

[
    {
        "path": "{Segment-Container}/{Segment-Object}",
        "etag": "{Etag-of-Segment-Object}",
        "size_bytes": 1048576
    },
    {
        "path": "{Segment-Container}/{Segment-Object1}",
        "etag": "{Etag-of-Segment-Object}",
        "size_bytes": 1048576
    },
    ...
]

リクエスト
名前 種類 形式 必須 説明
X-Auth-Token Header String Y トークン ID
Account URL String Y ストレージアカウント、API エンドポイント設定ダイアログボックスで確認
Container URL String Y コンテナ名
Object URL String Y 作成するマニフェストオブジェクト名
multipart-manifest Query String Y マニフェスト作成時に put を設定
path Body String Y セグメントオブジェクトのパス
etag Body String Y セグメントオブジェクトの ETag
size_bytes Body Integer Y セグメントオブジェクトのサイズ(バイト単位)

ヒント

SLO マニフェストオブジェクトが保持するセグメント情報を照会するには、multipart-manifest=get クエリを使用する必要があります。


レスポンス

このリクエストはレスポンス本文を返しません。リクエストが正しい場合、ステータスコード 201 を返します。


コード例

DLO 方式を使用したマルチパートアップロードの例

cURL
# 200MB単位でファイルを分割
$ split -d -b 209715200 large_obj.img large_obj.img.

# 分割されたオブジェクトをアップロード
$ curl -X PUT -H 'X-Auth-Token: b587ae461278419da6ecd21a2344c8aa' \
https://kr1-api-object-storage.nhncloudservice.com/v1/AUTH_6dbc368b94894416bec4cdfc65b5e067/curl_example/large_obj.img/001 \
-T large_obj.img.00

$ curl -X PUT -H 'X-Auth-Token: b587ae461278419da6ecd21a2344c8aa' \
https://kr1-api-object-storage.nhncloudservice.com/v1/AUTH_6dbc368b94894416bec4cdfc65b5e067/curl_example/large_obj.img/002 \
-T large_obj.img.01

$ curl -X PUT -H 'X-Auth-Token: b587ae461278419da6ecd21a2344c8aa' \
https://kr1-api-object-storage.nhncloudservice.com/v1/AUTH_6dbc368b94894416bec4cdfc65b5e067/curl_example/large_obj.img/003 \
-T large_obj.img.02

# マニフェストオブジェクトをアップロード
$ curl -X PUT -H 'X-Auth-Token: b587ae461278419da6ecd21a2344c8aa' \
-H 'X-Object-Manifest: curl_example/large_obj.img/' \
https://kr1-api-object-storage.nhncloudservice.com/v1/AUTH_6dbc368b94894416bec4cdfc65b5e067/curl_example/large_obj.img \
-d ''
Java
// ObjectService.java
package com.nhn.cloud.obs;

// ... import list

@Data
public class ObjectService {

    // ObjectService Class ...

    // マニフェストオブジェクトのアップロード
    public void uploadManifestObject(String containerName, String objectName) {
        String url = this.getUrl(containerName, objectName);
        String manifestName = containerName + "/" + objectName + "/"; // マニフェスト名の生成

        // ヘッダーの生成
        HttpHeaders headers = new HttpHeaders();
        headers.add("X-Auth-Token", tokenId);
        headers.add("X-Object-Manifest", manifestName);  // ヘッダーにマニフェストを設定

        HttpEntity<String> requestHttpEntity = new HttpEntity<String>(null, headers);

        // API 呼び出し
        this.restTemplate.exchange(url, HttpMethod.PUT, requestHttpEntity, String.class);
    }

    public static void main(String[] args) {
        final String storageUrl = "https://kr1-api-object-storage.nhncloudservice.com/v1/AUTH_6dbc368b94894416bec4cdfc65b5e067";
        final String tokenId = "b587ae461278419da6ecd21a2344c8aa";
        final String containerName = "test";
        final String objectPath = "/home/example/";
        final String objectName = "46432aa503ab715f288c4922911d2035.jpg";

        ObjectService objectService = new ObjectService(storageUrl, tokenId);

        File objFile = new File(objectPath + "/" + objectName);
        int fileSize = (int)objFile.length();

        final int defaultChunkSize = 100 * 1024; // 100 KB 単位で分割
        int chunkSize = defaultChunkSize;
        int chunkNo = 0;  // 分割オブジェクトの名前を作成するためのチャンク番号
        int totalBytesRead = 0;

        try {
            // ファイルから InputStream を生成
            InputStream inputStream = new BufferedInputStream(new FileInputStream(objFile));
            while(totalBytesRead < fileSize) {

                // 残りデータサイズの計算
                int remainedBytes = fileSize - totalBytesRead;
                if(remainedBytes < chunkSize) {
                    chunkSize = remainedBytes;
                }

                // バイトバッファにチャンクサイズ分のデータを読み込む
                byte[] chunkBuffer = new byte[chunkSize];
                int bytesRead = inputStream.read(chunkBuffer, 0, chunkSize);

                if(bytesRead > 0) {
                    // バッファのデータを InputStream にして アップロード、オブジェクトアップロード例の uploadObject() メソッドを使用
                    String objPartName = String.format("%s/%03d", objectName, ++chunkNo);
                    InputStream chunkInputStream = new ByteArrayInputStream(chunkBuffer);
                    objectService.uploadObject(containerName, objPartName, chunkInputStream);

                    totalBytesRead += bytesRead;
                }
            }

            // マニフェストファイルをアップロード
            objectService.uploadManifestObject(containerName, objectName);

            System.out.println("Upload OK");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
Python
# object.py
class ObjectService:
    CHUNK_SIZE = 100 * 1024  # 100 KB
    # ...

    def _create_manifest(self, container, object):
        req_url = self._get_url(container, object)
        req_header = self._get_request_header()
        req_header['X-Object-Manifest'] = '/'.join([container, object]) + '/'
        return requests.put(req_url, headers=req_header)

    def upload_large_object(self, container, object, object_path):
        url = self._get_url(container, object)
        req_header = self._get_request_header()

        path = '/'.join([object_path, object])
        with open(path, 'rb') as f:
            chunk_index = 1
            chunk_size = self.CHUNK_SIZE
            total_bytes_read = 0
            obj_size = os.path.getsize(path)

            while total_bytes_read < obj_size:
                remained_bytes = obj_size - total_bytes_read
                if remained_bytes < chunk_size:
                    chunk_size = remained_bytes

                req_url = '%s/%03d' % (url, chunk_index)
                requests.put(
                    req_url, headers=req_header, data=f.read(chunk_size))
                total_bytes_read += chunk_size
                f.seek(total_bytes_read)
                chunk_index += 1

        return self._create_manifest(container, object)


if __name__ == '__main__':
    STORAGE_URL = 'https://kr1-api-object-storage.nhncloudservice.com/v1/AUTH_6dbc368b94894416bec4cdfc65b5e067'
    TOKEN_ID = 'b587ae461278419da6ecd21a2344c8aa'
    CONTAINER_NAME = 'test'
    LARGE_OBJECT = 'dfa10eec828f4a228a34fb4da1d037ff.jpg'
    OBJECT_PATH = '/home/example/'

    obj_service = ObjectService(STORAGE_URL, TOKEN_ID)

    obj_service.upload_large_object(CONTAINER_NAME, LARGE_OBJECT, OBJECT_PATH)
PHP
// object.php
<?php
class ObjectService {
  const CHUNK_SIZE = 100 * 1024;  // 100 KB
  // ...

  function create_manifest($container, $object) {
    $req_url = $this->get_url($container, $object);
    $req_header = $this->get_request_header();
    $req_header[] = 'X-Object-Manifest: '.$container.'/'.$object.'/';

    $curl  = curl_init($req_url);
    curl_setopt_array($curl, array(
      CURLOPT_PUT => TRUE,
      CURLOPT_RETURNTRANSFER => TRUE,
      CURLOPT_HTTPHEADER => $req_header
    ));
    $response = curl_exec($curl);
    curl_close($curl);
  }

  function upload_large_object($container, $object, $filename) {
    $url = $this->get_url($container, $object);
    $req_header = $this->get_request_header();

    $chunk_index = 1;
    $chunk_size = self::CHUNK_SIZE;
    $total_bytes_read = 0;
    $fd = fopen($filename, 'r');  // ファイルを開く。
    $obj_size = filesize($filename);

    while($total_bytes_read < $obj_size) {
      // 分割するサイズを計算
      $remained_bytes = $obj_size - $total_bytes_read;
      if ($remained_bytes < $chunk_size) {
        $chunk_size = $remained_bytes;
      }
      $chunk = fread($fd, $chunk_size);
      // パート名を生成
      $temp_file = sprintf("./multipart-%03d", $chunk_index);
      $req_url = sprintf("%s/%03d", $url, $chunk_index);

      // パートの一時ファイルを生成
      $part_fd = fopen($temp_file, 'w+');
      fwrite($part_fd, $chunk);
      fseek($part_fd, 0);

      $curl  = curl_init($req_url);
      curl_setopt_array($curl, array(
        CURLOPT_PUT => TRUE,
        CURLOPT_HEADER => TRUE,
        CURLOPT_RETURNTRANSFER => TRUE,
        CURLOPT_INFILE => $part_fd,  // パートファイルのストリームをパラメータとして入力
        CURLOPT_HTTPHEADER => $req_header
      ));
      $response = curl_exec($curl);
      curl_close($curl);
      printf("$response");

      // 一時ファイルを削除
      fclose($part_fd);
      unlink($temp_file);

      $total_bytes_read += $chunk_size;
      $chunk_index += 1;
    }
    fclose($fd);

    $this->create_manifest($container, $object);
  }
}

// main
$STORAGE_URL = 'https://kr1-api-object-storage.nhncloudservice.com/v1/AUTH_6dbc368b94894416bec4cdfc65b5e067';
$TOKEN_ID = 'b587ae461278419da6ecd21a2344c8aa';
$CONTAINER_NAME = 'test';
$LARGE_OBJECT = '8cb0d624f8c14c69b52f2cd89e5e59b7.jpg';
$OBJ_PATH = '/home/example';

$object = new ObjectService($STORAGE_URL, $TOKEN_ID);

$filename = $OBJ_PATH.'/'.$LARGE_OBJECT;
$object->upload_large_object($CONTAINER_NAME, $LARGE_OBJECT, $filename);
?>


オブジェクトの内容の変更

オブジェクトアップロード API と同じですが、オブジェクトがすでにコンテナに存在する場合、そのオブジェクトの内容が変更されます。

PUT /v1/{Account}/{Container}/{Object}
X-Auth-Token: {token-id}
Content-Type: {content-type}

リクエスト

名前 種類 形式 必須 説明
X-Auth-Token Header String Y トークン ID
Content-Type Header String Y オブジェクトのコンテンツタイプ
X-Delete-At Header Timestamp N オブジェクトの有効期限日、Unix 時間 (秒)
X-Delete-After Header Timestamp N オブジェクトの有効時間、Unix 時間 (秒)
Account URL String Y ストレージアカウント。API エンドポイント設定ダイアログボックスで確認できます
Container URL String Y コンテナ名
Object URL String Y 内容を変更するオブジェクト名
- Body Binary Y 変更するオブジェクトの内容

レスポンス

レスポンス本文は返しません。リクエストが正しい場合、ステータスコード 201 を返します。


オブジェクト情報の照会

指定したオブジェクトの情報を照会します。オブジェクト情報は応答ヘッダーで確認できます。

HEAD /v1/{Account}/{Container}/{Object}
X-Auth-Token: {token-id}

リクエスト

リクエスト本文は必要ありません。

名前 種類 形式 必須 説明
X-Auth-Token Header String Y トークンID
Account URL String Y ストレージアカウント、APIエンドポイント設定ダイアログボックスで確認
Container URL String Y コンテナ名
Object URL String Y 情報を照会するオブジェクト名

レスポンス

このリクエストはレスポンス本文を返しません。リクエストが正しい場合、ステータスコード 200 を返します。

名前 種類 形式 説明
Content-Type Header String オブジェクトのコンテンツタイプ
Content-Length Header Integer オブジェクトのサイズ
Etag Header String オブジェクトの ETag 値
オブジェクトの MD5 Hash 値です。
オブジェクトの整合性確認に使用できます。
Last-Modified Header String オブジェクトの最終更新日時
X-Timestamp Header Timestamp オブジェクトの最終更新日時、Unix 時間(秒)
X-Delete-At Header Timestamp オブジェクトの有効期限、Unix 時間(秒)
X-Object-Worm-Retain-Until Header Timestamp オブジェクトロックの有効期限、Unix 時間(秒)
X-Object-Manifest Header String DLO 方式マルチパートオブジェクトのセグメントオブジェクトパス
X-Static-Large-Object Header Boolean SLO 方式マルチパートオブジェクトかどうか
X-Manifest-Etag Header String SLO 方式マルチパートオブジェクトのマニフェスト ETag 値(MD5)

コード例

cURL
$ curl -I -H 'X-Auth-Token: b587ae461278419da6ecd21a2344c8aa' \
https://kr1-api-object-storage.nhncloudservice.com/v1/AUTH_6dbc368b94894416bec4cdfc65b5e067/curl_example/ba6610.jpg

HTTP/1.1 200 OK
content-type: image/jpeg
content-length: 148585
x-delete-at: 1729263600
etag: bad093d7f49dc495751cb3f7f8b2530c
last-modified: Mon, 30 May 2022 15:16:43 GMT
x-timestamp: 1653923802.28970
x-trans-id: tx3c30a8f0272c40f5979b4-0067104fa7
x-openstack-request-id: tx3c30a8f0272c40f5979b4-0067104fa7
date: Wed, 16 Oct 2024 23:43:36 GMT


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

オブジェクトをダウンロードします。

GET /v1/{Account}/{Container}/{Object}
X-Auth-Token: {token-id}

リクエスト

リクエスト本文は必要ありません。

名前 種類 形式 必須 説明
X-Auth-Token Header String Y トークンID
Account URL String Y ストレージアカウント、APIエンドポイント設定ダイアログで確認
Container URL String Y コンテナ名
Object URL String Y ダウンロードするオブジェクト名

レスポンス

オブジェクトの内容がストリームとして返されます。リクエストが正しい場合、ステータスコード 200 を返します。

コード例

cURL
$ curl -O -X GET -H 'X-Auth-Token: b587ae461278419da6ecd21a2344c8aa' \
https://kr1-api-object-storage.nhncloudservice.com/v1/AUTH_6dbc368b94894416bec4cdfc65b5e067/curl_example/ba6610.jpg

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 17166  100 17166    0     0   566k      0 --:--:-- --:--:-- --:--:--  578k
Java
// ObjectService.java
package com.nhn.cloud.obs;

// ... import list

@Data
public class ObjectService {

    // ObjectService Class ...

    public File downloadObject(String containerName, String objectName, String downloadPath) {
        String url = this.getUrl(containerName, objectName);

        // リクエストヘッダーにトークンを追加する RequestCallback
        RequestCallback callback = (request) -> {
            HttpHeaders headers = request.getHeaders();
            headers.add("X-Auth-Token", tokenId);
            headers.setAccept(Collections.singletonList(MediaType.APPLICATION_OCTET_STREAM));
        };

        // レスポンスを受け取って保存する Extractor
        ResponseExtractor<File> extractor = (clientHttpResponse) -> {
            File ret = new File(downloadPath + "/" + objectName);
            StreamUtils.copy(clientHttpResponse.getBody(), Files.newOutputStream(ret.toPath()));
            return ret;
        };

        return this.restTemplate.execute(url, HttpMethod.GET, callback, extractor);
    }

    public static void main(String[] args) {
        final String storageUrl = "https://kr1-api-object-storage.nhncloudservice.com/v1/AUTH_6dbc368b94894416bec4cdfc65b5e067";
        final String tokenId = "b587ae461278419da6ecd21a2344c8aa";
        final String containerName = "test";
        final String objectName = "46432aa503ab715f288c4922911d2035.jpg";
        final String downloadPath = "/home/example/download";

        ObjectService objectService = new ObjectService(storageUrl, tokenId);

        try {
            // オブジェクトのダウンロード
            objectService.downloadObject(containerName, objectName, downloadPath);
            System.out.println("\nDownload OK");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}
Python
# object.py
class ObjectService:
    # ...
    def download(self, container, object, download_path):
        req_url = self._get_url(container, object)
        req_header = self._get_request_header()

        response = requests.get(req_url, headers=req_header)

        dn_path = '/'.join([download_path, object])
        with open(dn_path, 'wb') as f:
            f.write(response.content)


if __name__ == '__main__':
    STORAGE_URL = 'https://kr1-api-object-storage.nhncloudservice.com/v1/AUTH_6dbc368b94894416bec4cdfc65b5e067'
    TOKEN_ID = 'b587ae461278419da6ecd21a2344c8aa'
    CONTAINER_NAME = 'test'
    OBJECT_NAME = 'dfa10eec828f4a228a34fb4da1d037ff.jpg'
    DOWNLOAD_PATH = '/home/example/download'

    obj_service = ObjectService(STORAGE_URL, TOKEN_ID)

    obj_service.download(CONTAINER_NAME, OBJECT_NAME, DOWNLOAD_PATH)
PHP
// object.php
<?php
class ObjectService {
  //...
  function download($container, $object, $filename) {
    $req_url = $this->get_url($container, $object);

    $req_header = $this->get_request_header();

    $fd = fopen($filename, 'w');

    $curl  = curl_init($req_url);
    curl_setopt_array($curl, array(
      CURLOPT_RETURNTRANSFER => TRUE,
      CURLOPT_FILE => $fd,
      CURLOPT_HTTPHEADER => $req_header
    ));
    $response = curl_exec($curl);
    curl_close($curl);

    fclose($fd);
  }
}

// main
$STORAGE_URL = 'https://kr1-api-object-storage.nhncloudservice.com/v1/AUTH_6dbc368b94894416bec4cdfc65b5e067';
$TOKEN_ID = 'b587ae461278419da6ecd21a2344c8aa';
$CONTAINER_NAME = 'test';
$OBJECT_NAME = '0428b9e3e419d4fb7aedffde984ba5b3.jpg';
$DOWNLOAD_PATH = '/home/example/download';

$object = new ObjectService($STORAGE_URL, $TOKEN_ID);

$filename = $DOWNLOAD_PATH.'/'.$OBJECT_NAME;
$object->download($CONTAINER_NAME, $OBJECT_NAME, $filename);
?>


オブジェクトのコピー

オブジェクトを別のコンテナにコピーします。元のオブジェクトのすべての属性が一緒にコピーされます。

COPY /v1/{Account}/{SourceContainer}/{SourceObject}
X-Auth-Token: {token-id}
Destination: {TargetContainer}/{TargetObject}
PUT /v1/{Account}/{TargetContainer}/{TargetObject}
X-Auth-Token: {token-id}
X-Copy-From: {SourceContainer}/{SourceObject}

リクエスト

リクエスト本文は必要ありません。

名前 種類 形式 必須 説明
X-Auth-Token Header String Y トークン ID
Destination Header String Conditional 対象オブジェクトのパス、{対象コンテナ}/{対象オブジェクト}
COPY メソッドを使用するときに必要
X-Copy-From Header String Conditional 元のオブジェクトのパス、{元のコンテナ}/{元のオブジェクト}
PUT メソッドを使用するときに必要
X-Fresh-Metadata Header Boolean N オブジェクトの属性を初期化するかどうか
値が true の場合、元のオブジェクトの属性はコピーされません。
デフォルト値は false です。
X-Object-Meta-{Key} Header String N 対象オブジェクトのメタデータ
X-Delete-At Header Timestamp N 対象オブジェクトの有効期限、Unix 時間(秒)
X-Delete-After Header Timestamp N 対象オブジェクトの有効時間、Unix 時間(秒)
Account URL String Y ストレージアカウント、API エンドポイント設定ダイアログボックスで確認
Container URL String Y コンテナ名
COPY メソッド:元のコンテナ
PUT メソッド:対象コンテナ
Object URL String Y オブジェクト名
COPY メソッド:元のオブジェクト
PUT メソッド:対象オブジェクト
multipart-manifest Query String N 値が get の場合、マニフェストオブジェクトのみコピー
省略した場合、セグメントをマージして単一オブジェクトとしてコピーします。
COPY メソッド:クエリパラメータとして追加
PUT メソッド:X-Copy-From ヘッダー値に追加

オブジェクト属性の保存

オブジェクトをコピーすると、元のオブジェクトの属性が一緒にコピーされます。保存される属性は次のとおりです。

名前 説明
X-Delete-At オブジェクトの有効期限
X-Object-Worm-Retain-Until オブジェクトロックの有効期限
X-Object-Meta-{Key} ユーザー定義メタデータ

ヒント

オブジェクトをコピーするときに X-Delete-At または X-Object-Meta-{Key} ヘッダーを追加すると、コピーされたオブジェクトの属性を新しい値に設定できます。 ただし、ロックの有効期限は変更できず、元のオブジェクトの値がそのまま維持されます。

マルチパートオブジェクトのコピー

マルチパートオブジェクトをコピーすると、マニフェストが参照するセグメントが 1 つのオブジェクトにマージされてコピーされます。そのため、5 GB を超えるマルチパートオブジェクトは通常の方法でコピーすることはできません。5 GB を超えるマルチパートオブジェクトをコピーするには、マニフェストオブジェクトのみをコピーする必要があります。リクエスト時に multipart-manifest=get パラメータを追加してマニフェストを元として指定できます。

COPY /v1/{Account}/{SourceContainer}/{SourceObject}?multipart-manifest=get
X-Auth-Token: {token-id}
Destination: {TargetContainer}/{TargetObject}
PUT /v1/{Account}/{TargetContainer}/{TargetObject}
X-Auth-Token: {token-id}
X-Copy-From: {SourceContainer}/{SourceObject}; multipart-manifest=get

ヒント

PUT メソッドでマニフェストをコピーするときは、X-Copy-From ヘッダー値に multipart-manifest=get パラメータをセミコロンで区切って追加する必要があります。

警告

コピーされたマニフェストは元のセグメントパスを参照するため、元のセグメントオブジェクトを削除するとデータにアクセスできなくなります。 元のセグメントオブジェクトを別のコンテナにコピーした場合は、マニフェストオブジェクトを新たに作成する必要があります。

マニフェストをコピーするときは、マニフェストの属性が一緒にコピーされます。

種類 コピーされる属性
SLO マニフェスト X-Static-Large-Object, X-Manifest-Etag
DLO マニフェスト X-Object-Manifest

レスポンス

このリクエストはレスポンス本文を返しません。リクエストが正しければ、ステータスコード 201 を返します。

コード例

cURL **単一オブジェクトのコピー**
# COPY method
$ curl -X COPY -H 'X-Auth-Token: b587ae461278419da6ecd21a2344c8aa' \
-H 'Destination: copy_con/3a45e9.jpg' \
https://kr1-api-object-storage.nhncloudservice.com/v1/AUTH_6dbc368b94894416bec4cdfc65b5e067/curl_example/3a45e9.jpg

# PUT method
$ curl -X PUT -H 'X-Auth-Token: b587ae461278419da6ecd21a2344c8aa' \
-H 'X-Copy-From: curl_example/3a45e9.jpg' \
https://kr1-api-object-storage.nhncloudservice.com/v1/AUTH_6dbc368b94894416bec4cdfc65b5e067/copy_con/3a45e9.jpg
**マルチパートマニフェストオブジェクトのコピー**
# COPY method
$ curl -X COPY -H 'X-Auth-Token: b587ae461278419da6ecd21a2344c8aa' \
-H 'Destination: copy_con/419da6e.mp4' \
https://kr1-api-object-storage.nhncloudservice.com/v1/AUTH_6dbc368b94894416bec4cdfc65b5e067/curl_example/419da6e.mp4?multipart-manifest=get

# PUT method
$ curl -X PUT -H 'X-Auth-Token: b587ae461278419da6ecd21a2344c8aa' \
-H 'X-Copy-From: curl_example/419da6e.mp4; multipart-manifest=get' \
https://kr1-api-object-storage.nhncloudservice.com/v1/AUTH_6dbc368b94894416bec4cdfc65b5e067/copy_con/419da6e.mp4
Java
// ObjectService.java
package com.nhn.cloud.obs;

// ... import list

@Data
public class ObjectService {

    // ObjectService Class ...

    public void copyObject(String srcContainerName, String objectName, String destContainerName) {
        String url = this.getUrl(destContainerName, objectName);
        String srcObject = "/" + srcContainerName + "/" + objectName;

        // ヘッダーを作成する
        HttpHeaders headers = new HttpHeaders();
        headers.add("X-Auth-Token", tokenId);
        headers.add("X-Copy-From", srcObject);    // コピー元オブジェクトを指定する
        HttpEntity<String> requestHttpEntity = new HttpEntity<String>(null, headers);

        // HttpMethod は COPY メソッドをサポートしていないため、PUT メソッドを使用する代替 API を呼び出す。
        this.restTemplate.exchange(url, HttpMethod.PUT, requestHttpEntity, String.class);
    }

    public static void main(String[] args) {
        final String storageUrl = "https://kr1-api-object-storage.nhncloudservice.com/v1/AUTH_6dbc368b94894416bec4cdfc65b5e067";
        final String tokenId = "b587ae461278419da6ecd21a2344c8aa";
        final String srcContainerName = "test";
        final String destContainerName = "test2";
        final String objectName = "46432aa503ab715f288c4922911d2035.jpg";

        ObjectService objectService = new ObjectService(storageUrl, tokenId);

        try {
            objectService.copyObject(srcContainerName, objectName, destContainerName);
            System.out.println("Copy OK");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
Python
# object.py
class ObjectService:
    # ...
    def copy(self, src_container, object, dest_container):
        req_url = self._get_url(dest_container, object)
        req_header = self._get_request_header()
        req_header['X-Copy-From'] = '/'.join([src_container, object])
        return requests.put(req_url, headers=req_header)


if __name__ == '__main__':
    STORAGE_URL = 'https://kr1-api-object-storage.nhncloudservice.com/v1/AUTH_6dbc368b94894416bec4cdfc65b5e067'
    TOKEN_ID = 'b587ae461278419da6ecd21a2344c8aa'
    CONTAINER_NAME = 'test'
    OBJECT_NAME = 'dfa10eec828f4a228a34fb4da1d037ff.jpg'
    DEST_CONTAINER = 'dest'

    obj_service = ObjectService(STORAGE_URL, TOKEN_ID)

    obj_service.copy(CONTAINER_NAME, OBJECT_NAME, DEST_CONTAINER)
PHP
// object.php
<?php
class ObjectService {
  //...
  function copy($src_container, $object, $dest_container) {
    $req_url = $this->get_url($dest_container, $object);

    $req_header = $this->get_request_header();
    $req_header[] = 'X-Copy-From: '.$src_container.'/'.$object;

    $curl  = curl_init($req_url);
    curl_setopt_array($curl, array(
      CURLOPT_PUT => TRUE,
      CURLOPT_RETURNTRANSFER => TRUE,
      CURLOPT_HTTPHEADER => $req_header
    ));
    $response = curl_exec($curl);
    curl_close($curl);
  }
}

// main
$STORAGE_URL = 'https://kr1-api-object-storage.nhncloudservice.com/v1/AUTH_6dbc368b94894416bec4cdfc65b5e067';
$TOKEN_ID = 'b587ae461278419da6ecd21a2344c8aa';
$CONTAINER_NAME = 'test';
$DEST_CONTAINER = 'dest';
$OBJECT_NAME = '0428b9e3e419d4fb7aedffde984ba5b3.jpg';

$object = new ObjectService($STORAGE_URL, $TOKEN_ID);

$object->copy($CONTAINER_NAME, $OBJECT_NAME, $DEST_CONTAINER);
?>


オブジェクトメタデータの修正

指定したオブジェクトのメタデータを修正します。

POST /v1/{Account}/{Container}/{Object}
X-Auth-Token: {token-id}
X-Object-Meta-{Key}: {Value}

リクエスト

リクエスト本文は必要ありません。

名前 種類 形式 必須 説明
X-Auth-Token Header String Y トークン ID
X-Object-Meta-{Key} Header String N 変更するメタデータ
X-Delete-At Header Timestamp N オブジェクトの有効期限、Unix タイム(秒)
X-Delete-After Header Timestamp N オブジェクトの有効時間、Unix タイム(秒)
X-Object-Worm-Retain-Until Header Timestamp N オブジェクトロックの有効期限、Unix タイム(秒)
設定された時刻以降にのみ変更可能で、オブジェクトロックコンテナでのみ変更できます
Account URL String Y ストレージアカウント、API エンドポイント設定ダイアログボックスで確認
Container URL String Y コンテナ名
Object URL String Y メタデータを修正するオブジェクト名

ヒント

オブジェクトロックコンテナにアップロードされたオブジェクトには、自動的にロック有効期限が設定されます。

ロック有効期限が経過していないオブジェクトは、上書きまたは削除することはできません。

オブジェクトのメタデータは、ロック有効期限前であっても変更できます。

レスポンス

このリクエストはレスポンス本文を返しません。リクエストが正しければ、ステータスコード 202 を返します。

コード例

cURL
# オブジェクトへのメタデータ追加
$ curl -X POST -H 'X-Auth-Token: b587ae461278419da6ecd21a2344c8aa' \
-H "X-Object-Meta-Type: photo" \
https://kr1-api-object-storage.nhncloudservice.com/v1/AUTH_6dbc368b94894416bec4cdfc65b5e067/curl_example/ba6610.jpg

# オブジェクトヘッダーから追加したメタデータを確認
$ curl -I -H "X-Auth-Token: b587ae461278419da6ecd21a2344c8aa" \
https://kr1-api-object-storage.nhncloudservice.com/v1/AUTH_6dbc368b94894416bec4cdfc65b5e067/curl_example/ba6610.jpg
HTTP/1.1 200 OK
...
X-Object-Meta-Type: photo
...
Java
// ObjectService.java
package com.nhn.cloud.obs;

// ... import list

@Data
public class ObjectService {

    // ObjectService Class ...

    public void setObjectMetadata(String containerName, String objectName, String key, String value) {
        String url = this.getUrl(containerName, objectName);

        // メタデータキーを作成
        String metaKey = "X-Object-Meta-" + key;

        // ヘッダーを作成
        HttpHeaders headers = new HttpHeaders();
        headers.add("X-Auth-Token", tokenId);
        headers.add(metaKey, value);    // ヘッダーにメタデータを設定

        HttpEntity<String> requestHttpEntity = new HttpEntity<String>(null, headers);

        // API 呼び出し
        this.restTemplate.exchange(url, HttpMethod.POST, requestHttpEntity, String.class);
    }

    public static void main(String[] args) {
        final String storageUrl = "https://kr1-api-object-storage.nhncloudservice.com/v1/AUTH_6dbc368b94894416bec4cdfc65b5e067";
        final String tokenId = "b587ae461278419da6ecd21a2344c8aa";
        final String containerName = "test";
        final String objectName = "46432aa503ab715f288c4922911d2035.jpg";
        final String key = "Type";
        final String value = "photo";

        ObjectService objectService = new ObjectService(storageUrl, tokenId);

        try {
            objectService.setObjectMetadata(containerName, objectName, key, value);
            System.out.println("Set metadata OK");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
Python
# object.py
class ObjectService:
    # ...
    def set_metadata(self, container, object, key, value):
        req_url = self._get_url(container, object)
        req_header = self._get_request_header()
        req_header['X-Object-Meta-' + key] = value
        return requests.post(req_url, headers=req_header)


if __name__ == '__main__':
    STORAGE_URL = 'https://kr1-api-object-storage.nhncloudservice.com/v1/AUTH_6dbc368b94894416bec4cdfc65b5e067'
    TOKEN_ID = 'b587ae461278419da6ecd21a2344c8aa'
    CONTAINER_NAME = 'test'
    OBJECT_NAME = 'dfa10eec828f4a228a34fb4da1d037ff.jpg'
    META_KEY = 'Type'
    META_VALUE = 'photo'

    obj_service = ObjectService(STORAGE_URL, TOKEN_ID)

    obj_service.set_metadata(CONTAINER_NAME, OBJECT_NAME, META_KEY, META_VALUE)
PHP
<?php
class ObjectService {
  //...
  function set_metadata($container, $object, $key, $value) {
    $req_url = $this->get_url($container, $object);
    $req_header = $this->get_request_header();
    $req_header[] = 'X-Object-Meta-'.$key.': '.$value;  // ヘッダーにメタデータを追加

    $curl  = curl_init($req_url);
    curl_setopt_array($curl, array(
      CURLOPT_POST => TRUE,
      CURLOPT_RETURNTRANSFER => TRUE,
      CURLOPT_HTTPHEADER => $req_header
    ));
    $response = curl_exec($curl);
    curl_close($curl);
  }
}

// main
$STORAGE_URL = 'https://kr1-api-object-storage.nhncloudservice.com/v1/AUTH_6dbc368b94894416bec4cdfc65b5e067';
$TOKEN_ID = 'b587ae461278419da6ecd21a2344c8aa';
$CONTAINER_NAME = 'test';
$OBJECT_NAME = '0428b9e3e419d4fb7aedffde984ba5b3.jpg';

$object = new ObjectService($STORAGE_URL, $TOKEN_ID);

$META_KEY = 'Type';
$META_VALUE = 'photo';
$object->set_metadata($CONTAINER_NAME, $OBJECT_NAME, $META_KEY, $META_VALUE);
?>


オブジェクトの削除

指定したオブジェクトを削除します。

ヒント

マルチパートアップロードしたオブジェクトを削除する際は、セグメントデータをすべて削除する必要があります。マニフェストのみを削除すると、セグメントオブジェクトがそのまま残り、課金される可能性があります。

DELETE /v1/{Account}/{Container}/{Object}
X-Auth-Token: {token-id}

リクエスト

リクエスト本文は必要ありません。

名前 種類 形式 必須 説明
X-Auth-Token Header String Y トークンID
Account URL String Y ストレージアカウント、APIエンドポイント設定ダイアログボックスで確認
Container URL String Y コンテナ名
Object URL String Y 削除するオブジェクト名

レスポンス

このリクエストはレスポンス本文を返しません。リクエストが正しい場合、ステータスコード 204 を返します。


コード例

cURL
$ curl -X DELETE -H 'X-Auth-Token: b587ae461278419da6ecd21a2344c8aa' \
https://kr1-api-object-storage.nhncloudservice.com/v1/AUTH_6dbc368b94894416bec4cdfc65b5e067/curl_example/ba6610.jpg
Java
// ObjectService.java
package com.nhn.cloud.obs;

// ... インポートリスト

@Data
public class ObjectService {

    // ObjectService クラス ...

    public void deleteObject(String containerName, String objectName) {
        String url = this.getUrl(containerName, objectName);

        // ヘッダーの作成
        HttpHeaders headers = new HttpHeaders();
        headers.add("X-Auth-Token", tokenId);
        HttpEntity<String> requestHttpEntity = new HttpEntity<String>(null, headers);

        // API 呼び出し
        this.restTemplate.exchange(url, HttpMethod.DELETE, requestHttpEntity, String.class);
    }

    public static void main(String[] args) {
        final String storageUrl = "https://kr1-api-object-storage.nhncloudservice.com/v1/AUTH_6dbc368b94894416bec4cdfc65b5e067";
        final String tokenId = "b587ae461278419da6ecd21a2344c8aa";
        final String containerName = "test";
        final String objectName = "46432aa503ab715f288c4922911d2035.jpg";

        ObjectService objectService = new ObjectService(storageUrl, tokenId);

        try {
            objectService.deleteObject(containerName, objectName);
            System.out.println("Delete OK");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
Python
# object.py
class ObjectService:
    # ...
    def delete(self, container, object):
        req_url = self._get_url(container, object)
        req_header = self._get_request_header()
        return requests.delete(req_url, headers=req_header)


if __name__ == '__main__':
    STORAGE_URL = 'https://kr1-api-object-storage.nhncloudservice.com/v1/AUTH_6dbc368b94894416bec4cdfc65b5e067'
    TOKEN_ID = 'b587ae461278419da6ecd21a2344c8aa'
    CONTAINER_NAME = 'test'
    OBJECT_NAME = 'dfa10eec828f4a228a34fb4da1d037ff.jpg'

    obj_service = ObjectService(STORAGE_URL, TOKEN_ID)

    obj_service.delete(CONTAINER_NAME, OBJECT_NAME)
PHP
// object.php
<?php
class ObjectService {
  //...
  function delete($container, $object) {
    $req_url = $this->get_url($container, $object);
    $req_header = $this->get_request_header();

    $curl  = curl_init($req_url);
    curl_setopt_array($curl, array(
      CURLOPT_CUSTOMREQUEST => "DELETE",
      CURLOPT_RETURNTRANSFER => TRUE,
      CURLOPT_HTTPHEADER => $req_header
    ));
    $response = curl_exec($curl);
    curl_close($curl);
  }
}

// main
$STORAGE_URL = 'https://kr1-api-object-storage.nhncloudservice.com/v1/AUTH_6dbc368b94894416bec4cdfc65b5e067';
$TOKEN_ID = 'b587ae461278419da6ecd21a2344c8aa';
$CONTAINER_NAME = 'test';
$OBJECT_NAME = '0428b9e3e419d4fb7aedffde984ba5b3.jpg';

$object = new ObjectService($STORAGE_URL, $TOKEN_ID);

$object->delete($CONTAINER_NAME, $OBJECT_NAME);
?>


制限ポリシー

リクエストレート制限

Object Storage は、システムの安定性を確保するため、ストレージアカウント (account) 単位で書き込みリクエストのレート制限 (rate limit) を適用します。

区分 項目 説明
制限条件 リクエストレート制限 500 リクエスト/秒
適用対象 適用単位 ストレージアカウント (account) 単位
適用対象 適用メソッド POST: コンテナ設定の変更、オブジェクトの属性/メタデータの変更
PUT: コンテナの作成、オブジェクトのアップロード
DELETE: コンテナ/オブジェクトの削除
COPY: オブジェクトのコピー
動作方式 制限超過時の処理方式 遅延後に処理、遅延時間が 60 秒を超えた場合は 429 レスポンスを返す

リクエストレート制限を超えた書き込みリクエストに適用されるポリシーは次のとおりです。

  • 超過した書き込みリクエストは即座に拒否されず、遅延処理されます。
  • 遅延時間は超過リクエスト量に応じて段階的に増加し、最大 60 秒まで延びる場合があります。
  • 遅延時間が 60 秒を超えた場合、リクエストは失敗し、429 Too Many Requests レスポンスを返します。

レスポンスの遅延や失敗を防ぐには、書き込みリクエストがレート制限を超えないように調整してください。


References

Swift API v1 - https://docs.openstack.org/api-ref/object-store/

TOP