LoginSignup
4
2

More than 3 years have passed since last update.

【Oracle Cloud Infrastructure】Object Storage Service の概要とその主要な CLI コマンドについて

Last updated at Posted at 2021-02-04

Oracle Cloud Infrastructure(OCI) のオブジェクト・ストレージの概要と簡単な使用例について書いていきます。

本記事で取り扱うこと

  • OCI のオブジェクトストレージの概要・特徴・利用方法について
    • Amazon S3 互換 API について
  • OCI CLI を使用した、オブジェクト・ストレージの利用方法
    • バケットの作成・取得
    • バケットへのオブジェクトのアップロード・ダウンロード・削除

前半では、OCI のオブジェクト・ストレージについて概観を眺めます。
後半では実際に OCI CLI (oci コマンド)を用いてオブジェクト・ストレージを操作します。各種コマンドの主要な引数についても併せて紹介し、実行例とともに示します。

なお、コマンドの引数や実行結果などは、記事をコンパクトに保つため details タグを使った折りたたみ形式で記載しています。 必要に応じて展開して参照ください。

本記事で使用したOCI CLIのバージョン

> oci -v
2.17.0

オブジェクト・ストレージの概要

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

reference: https://docs.oracle.com/ja-jp/iaas/Content/Object/Concepts/objectstorageoverview.htm

Oracle Cloud Infrastructure Object Storage は、その名の通り OCI の提供するオブジェクト・ストレージサービス。

OCI のオブジェクト・ストレージには3種のストレージクラス(Tier)がある。

  • スタンダード
    頻繁にアクセスするオブジェクトを格納するストレージ。Amazon S3 に対応する。
    料金設定は 3.06 円/月・GB(2021年2月現在)。
  • 低頻度アクセス
    2021年2月にリリースされた新しいストレージクラス。Amazon S3 IA に対応する。
    アーカイブと異なり、保管しているオブジェクトを即座に取り出すことができる。
  • アーカイブ
    アクセス頻度が低く、長期間保存するオブジェクトを格納する低価格ストレージ。Amazon S3 Glacier に対応する。
    料金設定は 0.312 円/月・GB(2021年2月現在)。

オブジェクト・ストレージの特徴

  • 強い一貫性
    OCI のオブジェクト・ストレージは強い一貫性をサポートしている。
    S3 でも先日サポートされた強い一貫性が、OCI でも同様にサポートされている。
  • 暗号化
    OCI のオブジェクト・ストレージでは、格納されるオブジェクトは常に暗号化される。
    これはデフォルトで有効になっており、無効にすることはできない。
    また、デフォルトでは暗号化キーは OCI によって自動生成されるものを利用するが、キーのローテーションや自前のキーを利用することも可能。
  • 耐久性
    オブジェクト・ストレージサービスは、99.95%のSLOを設定している
    耐久性としては、年間99.999999999%(11 nines)を掲げている1
  • RMAN(Recovery Manager) との親和性
    Oracle のマネージドサービスであることのメリット。
    RMAN を使用して、データベースのバックアップを透過的に直接オブジェクト・ストレージに格納することができる。
  • 名前空間によるバケット名の分離(後述)

オブジェクト・ストレージ・ネームスペース

reference: https://docs.oracle.com/ja-jp/iaas/Content/Object/Tasks/understandingnamespaces.htm

OCI のオブジェクト・ストレージでは、各テナンシごとにグローバルに一意な名前空間が切られ、その中にバケットが作成される。
この機構によって、Amazon S3 バケットの命名で発生するような他ユーザとの名前衝突を回避している。
なお、ネームスペースはアカウント作成時に自動的に生成される値である。

名前空間はテナンシごとのグローバルな値だが、バケット名は同一テナント・同一リージョン内で一意であればよい。つまり、同一テナント・別リージョンには同名のバケットを作成できる。

ネームスペースをOCI CLIから確認するには、oci os ns get を実行する2

> oci os ns get
{
  "data": "xxxxxxxxxxx"
}

オブジェクト・ストレージの利用方法

以下の利用方法がある。

  • OCIコンソール
    Webブラウザからオブジェクト・ストレージを操作する。
  • OCI CLI
    コマンドライン・インターフェースからオブジェクト・ストレージを操作する。
    本記事ではこちらの利用方法について、基礎的な部分を確認していく。
  • REST API
    以下のAPIが利用できる。
    • Object Storage Service API(OCIの提供する通常のWebAPI)
    • Amazon S3互換API(後述)
    • Swift API(RMANで利用される)
  • SDK
    以下の言語向けにSDKが提供されている
    • Java
    • Python
    • TypeScript/JavaScript
    • .NET
    • Go
    • Ruby
  • Storage Gateway
    Storage Gatewayを使うことで、オブジェクト・ストレージをオンプレサーバやコンピュートインスタンスにNFSとしてマウントすることもできる。

Amazon S3 互換 API

ref: https://docs.oracle.com/ja-jp/iaas/Content/Object/Tasks/s3compatibleapi.htm

OCI オブジェクト・ストレージの REST API では、Amazon S3 互換の API も提供されている。
これにより、AWS SDK から、API エンドポイントを変更するだけで OCI オブジェクト・ストレージを操作できる。

サポートされている API や、SDK での利用例も上記参考 URL に記載されているので、興味があれば参照してみるといいだろう。

各種OCI CLIコマンド

ここからは実際にCLIを使ってリソースを操作しながら各種概念を確認していく。

バケット操作

oci os bucket create

ref: https://docs.oracle.com/en-us/iaas/tools/oci-cli/2.17.0/oci_cli_docs/cmdref/os/bucket/create.html

OCI CLIを用いたバケットの作成では、oci os bucket createコマンドを用いる。
コマンドの主要な引数は以下の通り。

oci os bucket create コマンドの主要な引数
引数 Required/Optional 説明
--name [text] Required バケット名
--compartment-id, -c [text] Required バケットを作成するコンパートメントOCID
--storage-tier [text] Optional
(デフォルト: Standard)
ストレージクラス。StandardまたはArchiveを指定する。
--object-events-enabled [boolean] Optional
(デフォルト: false)
有効にすると、オブジェクトの作成・削除・更新イベントを Oracle Cloud Infrastructure Events で利用できる。
Events は Functions(Lambdaみたいなもの)のトリガとしての用途などがある。
--versioning [text] Optional
(デフォルト: Disabled)
バージョニングを利用するか否か。DisabledまたはEnabledを指定する。
有効になると、オブジェクトの上書きや削除時に自動的にバージョニングが行われる。
--public-access-type [text] Optional
(デフォルト: NoPublicAccess)
パブリックアクセスの制御に関するパラメータ。NoPublicAccess, ObjectRead, またはObjectReadWithoutListを指定する。
--kms-key-id [text] Optional Vault に作成した暗号化キーのOCIDを設定し、これをオブジェクトの暗号化キーとして利用する。
--metadata [complex type] Optional カスタムメタデータを設定する。
引数にはJSON形式の文字列またはファイルをfile://path/to/file形式で指定できる。
--defined-tags [complex type] Optional 定義済みタグを設定する。
引数にはJSON形式の文字列またはファイルをfile://path/to/file形式で指定できる。
--freeform-tags [complex type] Optional フリーフォーム・タグを設定する。
引数にはJSON形式の文字列またはファイルをfile://path/to/file形式で指定できる。
--from-json [text] Optional 各種パラメータを JSON ファイルから指定することができる。
JSON の形式は、--generate-full-command-json-input オプションで生成されるものを参考にする。

コマンド実行例

OCI CLI を用いてバケットを作成する例を以下に示す。

CLI によるバケット作成例①: 必須パラメータのみ
> oci os bucket create --name qiita-test --compartment-id ocid1.compartment.exampleuniqueID
{
  "data": {
    "approximate-count": null,
    "approximate-size": null,
    "compartment-id": "ocid1.compartment.exampleuniqueID",
    "created-by": "ocid1.user.oc1.exampleuniqueID",
    "defined-tags": {},
    "etag": "hogehoge",
    "freeform-tags": {},
    "id": "ocid1.bucket.oc1.ap-tokyo-1.exampleuniqueID",
    "is-read-only": false,
    "kms-key-id": null,
    "metadata": {},
    "name": "qiita-test",
    "namespace": "fugafuga",
    "object-events-enabled": false,
    "object-lifecycle-policy-etag": null,
    "public-access-type": "NoPublicAccess",
    "replication-enabled": false,
    "storage-tier": "Standard",
    "time-created": "2021-01-06T09:13:13.194000+00:00",
    "versioning": "Disabled"
  },
  "etag": "hogehoge"
}

CLI によるバケット作成例②: JSON ファイルによるメタデータ付与
> cat metadata.json                                                                     2196ms
{
    "label": "qiita",
    "type": "Standard",
    "metadata-type": "json-file"
}
> oci os bucket create --compartment-id ocid1.compartment.oc1..exampleuniqueID--name qiita-test-metadata-json --metadata file://path/to/metadata.json
{
  "data": {
    "approximate-count": null,
    "approximate-size": null,
    "compartment-id": "ocid1.compartment.oc1..exampleuniqueID",
    "created-by": "ocid1.user.oc1..exampleuniqueID",
    "defined-tags": {},
    "etag": "72c119a1-26e1-431c-8b7c-75e8eded81bc",
    "freeform-tags": {},
    "id": "ocid1.bucket.oc1.ap-tokyo-1.exampleuniqueID",
    "is-read-only": false,
    "kms-key-id": null,
    "metadata": {
      "label": "qiita",
      "metadata-type": "json-file",
      "type": "Standard"
    },
    "name": "qiita-test-metadata-json",
    "namespace": "hogehoge",
    "object-events-enabled": false,
    "object-lifecycle-policy-etag": null,
    "public-access-type": "NoPublicAccess",
    "replication-enabled": false,
    "storage-tier": "Standard",
    "time-created": "2021-01-07T10:27:29.034000+00:00",
    "versioning": "Disabled"
  },
  "etag": "72c119a1-26e1-431c-8b7c-75e8eded81bc"
}

CLI によるバケット作成例③: Vault に作成したキーを使用する

Vault に作成したキーをオブジェクト・ストレージから利用する場合は、Allow service objectstorage-<region_name> to use keys in compartment <compartment_name> ポリシの適用が必要。

> oci os bucket create --compartment-id ocid1.compartment.oc1..exampleuniqueID--kms-key-id ocid1.key.oc1.ap-tokyo-1.exampleuniqueID --name qiita-test-vault-key
{
  "data": {
    "approximate-count": null,
    "approximate-size": null,
    "compartment-id": "ocid1.compartment.oc1..exampleuniqueID",
    "created-by": "ocid1.user.oc1..exampleuniqueID",
    "defined-tags": {},
    "etag": "1a1d5444-58d1-4266-9651-857616c17988",
    "freeform-tags": {},
    "id": "ocid1.bucket.oc1.ap-tokyo-1.exampleuniqueID",
    "is-read-only": false,
    "kms-key-id": "ocid1.key.oc1.ap-tokyo-1.exampleuniqueID",
    "metadata": {},
    "name": "qiita-test-vault-key",
    "namespace": "hogehoge",
    "object-events-enabled": false,
    "object-lifecycle-policy-etag": null,
    "public-access-type": "NoPublicAccess",
    "replication-enabled": false,
    "storage-tier": "Standard",
    "time-created": "2021-01-08T01:09:50.131000+00:00",
    "versioning": "Disabled"
  },
  "etag": "1a1d5444-58d1-4266-9651-857616c17988"
}

CLI によるバケット作成例④: --from-json でパラメータを指定する
> cat bucket_create_parameters.json
{
  "compartmentId": "ocid1.compartment.oc1..exampleuniqueID",
  "freeformTags": {
    "type": "jsonparams"
  },
  "name": "qiita-json-bucket",
  "objectEventsEnabled": false,
  "publicAccessType": "NoPublicAccess",
  "storageTier": "Standard",
  "versioning": "Disabled"
}
> oci os bucket create --from-json file://path/to/bucket_create_parameters.json
{
  "data": {
    "approximate-count": null,
    "approximate-size": null,
    "compartment-id": "ocid1.compartment.oc1..exampleuniqueID",
    "created-by": "ocid1.user.oc1..exampleuniqueID",
    "defined-tags": {},
    "etag": "c415f313-61e9-4c14-933e-df8ddb33f75d",
    "freeform-tags": {
      "type": "jsonparams"
    },
    "id": "ocid1.bucket.oc1.ap-tokyo-1.exampleuniqueID",
    "is-read-only": false,
    "kms-key-id": null,
    "metadata": {},
    "name": "qiita-json-bucket",
    "namespace": "hogehoge",
    "object-events-enabled": false,
    "object-lifecycle-policy-etag": null,
    "public-access-type": "NoPublicAccess",
    "replication-enabled": false,
    "storage-tier": "Standard",
    "time-created": "2021-01-07T10:00:35.751000+00:00",
    "versioning": "Disabled"
  },
  "etag": "c415f313-61e9-4c14-933e-df8ddb33f75d"
}

oci os bucket list

ref: https://docs.oracle.com/en-us/iaas/tools/oci-cli/2.17.0/oci_cli_docs/cmdref/os/bucket/list.html

バケット情報一覧の取得では、oci os bucket listコマンドを用いる。
コマンドの主要な引数は以下の通り。

oci os bucket list コマンドの主要な引数
引数 Required/Optional 説明
--compartment-id, -c [text] Required コンパートメントのOCID
--all Optional 全てのバケットを取得する。この引数が付与されている場合は --limit は利用できない。
--fields [text] Optional アウトプットに含めるフィールドを指定する。現在はtagsのみサポートしている。
--limit [integer] Optional 表示するバケットの数
--from-json [text] Optional 各種パラメータを JSON ファイルから指定することができる。
JSON の形式は、--generate-full-command-json-input オプションで生成されるものを参考にする。

コマンド実行例

OCI CLI を用いてバケットリストを取得する例を以下に示す。

CLI によるバケットリスト取得例①: 必須パラメータのみ
> oci os bucket list --compartment-id ocid1.compartment.oc1..exampleuniqueID
{
  "data": [
    {
      "compartment-id": "ocid1.compartment.oc1..exampleuniqueID",
      "created-by": "ocid1.user.oc1..exampleuniqueID",
      "defined-tags": null,
      "etag": "e5dc2492-3694-48a0-b79a-d260cc129404",
      "freeform-tags": null,
      "name": "qiita-test",
      "namespace": "hogehoge",
      "time-created": "2021-01-07T01:08:23.044000+00:00"
    },
    {
      "compartment-id": "ocid1.compartment.oc1..exampleuniqueID",
      "created-by": "ocid1.user.oc1..exampleuniqueID",
      "defined-tags": null,
      "etag": "4a2346f4-f982-4558-8814-77ff1c88d643",
      "freeform-tags": null,
      "name": "qiita-test-freeformtag",
      "namespace": "hogehoge",
      "time-created": "2021-01-07T09:41:36.934000+00:00"
    },
    {
      "compartment-id": "ocid1.compartment.oc1..exampleuniqueID",
      "created-by": "ocid1.user.oc1..exampleuniqueID",
      "defined-tags": null,
      "etag": "d082fdc7-e077-46e1-8b52-a730d0bb2fd1",
      "freeform-tags": null,
      "name": "qiita-test-jsonfile",
      "namespace": "hogehoge",
      "time-created": "2021-01-07T01:12:42.436000+00:00"
    }
  ]
}

CLI によるバケットリスト取得例②: --field tags を指定

①ではnullとなっていたfreeform-tagsに正しく値が表示されていることが確認できる。

> oci os bucket list --fields tags --compartment-id ocid1.compartment.oc1..exampleuniqueID
{
  "data": [
    {
      "compartment-id": "ocid1.compartment.oc1..exampleuniqueID",
      "created-by": "ocid1.user.oc1..exampleuniqueID",
      "defined-tags": {},
      "etag": "e5dc2492-3694-48a0-b79a-d260cc129404",
      "freeform-tags": {},
      "name": "qiita-test",
      "namespace": "hogehoge",
      "time-created": "2021-01-07T01:08:23.044000+00:00"
    },
    {
      "compartment-id": "ocid1.compartment.oc1..exampleuniqueID",
      "created-by": "ocid1.user.oc1..exampleuniqueID",
      "defined-tags": {},
      "etag": "4a2346f4-f982-4558-8814-77ff1c88d643",
      "freeform-tags": {
        "label": "qiita",
        "metadata-type": "json-file",
        "type": "Standard"
      },
      "name": "qiita-test-freeformtag",
      "namespace": "hogehoge",
      "time-created": "2021-01-07T09:41:36.934000+00:00"
    },
    {
      "compartment-id": "ocid1.compartment.oc1..exampleuniqueID",
      "created-by": "ocid1.user.oc1..exampleuniqueID",
      "defined-tags": {},
      "etag": "d082fdc7-e077-46e1-8b52-a730d0bb2fd1",
      "freeform-tags": {},
      "name": "qiita-test-jsonfile",
      "namespace": "hogehoge",
      "time-created": "2021-01-07T01:12:42.436000+00:00"
    }
  ]
}

oci os bucket get

ref: https://docs.oracle.com/en-us/iaas/tools/oci-cli/2.17.0/oci_cli_docs/cmdref/os/bucket/get.html

特定のバケット情報の取得では、oci os bucket getコマンドを用いる。
コマンドの主要な引数は以下の通り。

oci os bucket get コマンドの主要な引数
引数 Required/Optional 説明
--bucket-name, --name, -bn [text] Required バケット名
--fields [text] Optional アウトプットに含めるフィールドを指定する。
approximateCount, approximateSize をサポートしている。
--from-json [text] Optional 各種パラメータを JSON ファイルから指定することができる。
JSON の形式は、--generate-full-command-json-input オプションで生成されるものを参考にする。

コマンド実行例

CLI によるバケット取得例①: 必須パラメータのみ
> oci os bucket get --name qiita-test
{
  "data": {
    "approximate-count": null,
    "approximate-size": null,
    "compartment-id": "ocid1.compartment.oc1..exampleuniqueID",
    "created-by": "ocid1.user.oc1..exampleuniqueID",
    "defined-tags": {},
    "etag": "e5dc2492-3694-48a0-b79a-d260cc129404",
    "freeform-tags": {},
    "id": "ocid1.bucket.oc1.ap-tokyo-1.exampleuniqueID",
    "is-read-only": false,
    "kms-key-id": null,
    "metadata": {
      "label": "qiita",
      "type": "Standard"
    },
    "name": "qiita-test",
    "namespace": "hogehoge",
    "object-events-enabled": false,
    "object-lifecycle-policy-etag": null,
    "public-access-type": "NoPublicAccess",
    "replication-enabled": false,
    "storage-tier": "Standard",
    "time-created": "2021-01-07T01:08:23.044000+00:00",
    "versioning": "Disabled"
  },
  "etag": "e5dc2492-3694-48a0-b79a-d260cc129404"
}

CLI によるバケット取得例②: --fields approximateSize を指定

バケット取得例①では null だった .data.approximate-size の値が 0 と表示されていることが確認できる。
この時点でバケットにオブジェクトは存在しないため、0 が表示されている。

> oci os bucket get --name qiita-test --fields approximateSize
{
  "data": {
    "approximate-count": null,
    "approximate-size": 0,
    "compartment-id": "ocid1.compartment.oc1..exampleuniqueID",
    "created-by": "ocid1.user.oc1..exampleuniqueID",
    "defined-tags": {},
    "etag": "e5dc2492-3694-48a0-b79a-d260cc129404",
    "freeform-tags": {},
    "id": "ocid1.bucket.oc1.ap-tokyo-1.exampleuniqueID",
    "is-read-only": false,
    "kms-key-id": null,
    "metadata": {
      "label": "qiita",
      "type": "Standard"
    },
    "name": "qiita-test",
    "namespace": "hogehoge",
    "object-events-enabled": false,
    "object-lifecycle-policy-etag": null,
    "public-access-type": "NoPublicAccess",
    "replication-enabled": false,
    "storage-tier": "Standard",
    "time-created": "2021-01-07T01:08:23.044000+00:00",
    "versioning": "Disabled"
  },
  "etag": "e5dc2492-3694-48a0-b79a-d260cc129404"
}

oci os bucket delete

ref: https://docs.oracle.com/en-us/iaas/tools/oci-cli/2.17.0/oci_cli_docs/cmdref/os/bucket/delete.html

バケットの削除では、oci os bucket delete コマンドを用いる。
コマンドの主要な引数は以下の通り。

oci os bucket delete コマンドの主要な引数
引数 Required/Optional 説明
--bucket-name, --name, -bn [text] Required バケット名
--force Optional 確認を表示せず即座に削除を実行するためのオプション
--from-json [text] Optional 各種パラメータを JSON ファイルから指定することができる。
JSON の形式は、--generate-full-command-json-input オプションで生成されるものを参考にする。

コマンド実行例

CLI によるバケット削除例①: 必須パラメータのみ
> oci os bucket delete --name qiita-test-for-deletion
Are you sure you want to delete this resource? [y/N]: y
> oci os bucket delete --name qiita-test
Are you sure you want to delete this resource? [y/N]: n
Abort:
>

オブジェクト操作

前章まででバケットの操作を確認した。
ここからは実際に作成したバケットに対してオブジェクトをアップロードし、動作を確認していこう。

本節では、特に断りがない場合以下のコマンドで作成されたバケットを使用する。

> oci os bucket create \
  --name qiita-test \
  --compartment-id ocid1.compartment.oc1..exampleuniqueID

oci os object put

ref: https://docs.oracle.com/en-us/iaas/tools/oci-cli/2.17.0/oci_cli_docs/cmdref/os/object/put.html

バケットへオブジェクトをアップロードするには、oci os object put コマンドを用いる。
ディレクトリを対象とした一括アップロードには oci os object bulk-upload コマンドを用いる(本記事では扱わない)。

コマンドの主要な引数は以下の通り。

oci os object put コマンドの主要な引数
引数 Required/Optional 説明
--bucket-name, --name, -bn [text] Required バケット名
--file [filename] Required アップロードするファイルを指定する。- を指定すると標準入力から受け取ることができる。
--name [text] Optional オブジェクト名
--content-md5 [text] Optional オブジェクトの put リクエストに Content-MD5 ヘッダを付与し、アップロードしたオブジェクトの完全性をチェックする
--disable-parallel-uploads Optional マルチパート・アップロード時に並列アップロードを行わない
--force Optional 同名のオブジェクトがすでにバケットに存在する場合に、確認をせずに上書きする
--no-multipart Optional マルチパート・アップロードを行わない
--no-overwrite Optional 同名のオブジェクトがすでにバケットに存在する場合に、上書きを行わない
--parallel-upload-count [integer range] Optional
(デフォルト: 3)
並列アップロードの最大数
--part-size [integer] Optional
(デフォルト: 128)
マルチパート・アップロードの際に分割するサイズを MiB 単位で指定する。
--verify-checksum Optional アップロード後に、ローカルのファイルとアップロードしたファイルの間で MD5 チェックサムによるチェックを行う
--from-json [text] Optional 各種パラメータを JSON ファイルから指定することができる。
JSON の形式は、--generate-full-command-json-input オプションで生成されるものを参考にする。

なお、オブジェクト名にスラッシュを含む接頭辞文字列を使用することで、ディレクトリ構造をシミュレートしてバケットに格納できる。

コマンド実行例

CLI によるオブジェクトアップロード例①: 必須パラメータのみ
> oci os object put \
             --bucket-name qiita-test \
             --file ./testfile.txt
Uploading object  [####################################]  100%
{
  "etag": "e5c937cd-b51f-4990-9f19-c5b1de10596d",
  "last-modified": "Fri, 08 Jan 2021 08:36:51 GMT",
  "opc-content-md5": "ZllWSF64s0R+jxuXwKohWw=="
}

CLI によるオブジェクトアップロード例②: --verify-checksum によるアップロード結果チェック
> openssl md5 -binary ./testfile.txt | base64
ZllWSF64s0R+jxuXwKohWw==
> oci os object put \
             --bucket-name qiita-test \
             --file ./testfile.txt \
             --name testfile-verified.txt \
             --verify-checksum
Uploading object  [####################################]  100%
{
  "etag": "58bc7eaf-0d53-4ab6-b72b-d2a28f3cf408",
  "last-modified": "Fri, 08 Jan 2021 08:38:48 GMT",
  "opc-content-md5": "ZllWSF64s0R+jxuXwKohWw=="
}
md5 checksum matches [Local: ZllWSF64s0R+jxuXwKohWw==]

CLI によるオブジェクトアップロード例③: --content-md5 によるアップロード結果チェック(失敗例)
> openssl md5 -binary ./dummyfile.txt | base64
1B2M2Y8AsgTpgAmY7PhCfg==
> oci os object put \
             --bucket-name qiita-test \
             --file ./testfile.txt \
             --name testfile-failed.txt \
             --content-md5 1B2M2Y8AsgTpgAmY7PhCfg==
Uploading object  [####################################]  100%
ServiceError:
{
    "code": "UnmatchedContentMD5",
    "message": "The computed MD5 hash (ZllWSF64s0R+jxuXwKohWw==) does not match the expected MD5 hash (1B2M2Y8AsgTpgAmY7PhCfg==)",
    "opc-request-id": "nrt-1:f_mu44JTzpNsuAJ9zQeeaU0eBP7a4PUpr_CJp9Xn-VCwnI4CQsXpaG59hTkH_VoW",
    "status": 400
}

CLI によるオブジェクトアップロード例④: マルチパート・アップロード(大容量ファイルのアップロード)

Split file into 8 parts for upload. と表示されていることがわかる。

> ls -lh 1G.dummy
-rw-r--r-- 1 testuser testuser 1000M Jan  8 14:58 1G.dummy
> oci os object put \
             --bucket-name qiita-test \
             --file ./1G.dummy \
             --profile APITEST
Upload ID: 6fd34c7d-555d-c0d8-b8e2-28c28eb9fd57
Split file into 8 parts for upload.
Uploading object  [####################################]  100%
{
  "etag": "305b9e53-453a-4d1c-a3af-7c8f238115ce",
  "last-modified": "Fri, 08 Jan 2021 08:43:27 GMT",
  "opc-multipart-md5": "XL33HVbpOwkyd+JY0YSxPg==-8"
}

oci os object list

ref: https://docs.oracle.com/en-us/iaas/tools/oci-cli/2.17.0/oci_cli_docs/cmdref/os/object/list.html

バケットに格納されているオブジェクトのリストを取得するには、oci os object list コマンドを用いる。
コマンドの主要な引数は以下の通り。

oci os object list コマンドの主要な引数
引数 Required/Optional 説明
--bucket-name, -bn [text] Required バケット名
--all Optional 全結果を取得する。--limit との併用はできない。
--delimiter [text] Optional 指定されたデリミタを含むオブジェクトを表示しないよう指定する。--prefix と併用して、特定の階層直下に存在するオブジェクトのみを表示できる。
--start [text] Optional オブジェクトを取得する始点を指定する。
--end [text] Optional オブジェクトを取得する終点を指定する。辞書順で指定されたパラメータ以前のオブジェクトを取得する。
--fields [text] Optional
(デフォルト: name,size,timeCreated,md5 )
結果に含まれるフィールドを指定する。指定しなかったフィールドの値は null となる。
--limit [integer] Optional
(デフォルト: 100)
表示するオブジェクトの最大数を指定する。
--page-size [integer] Optional ページ分割におけるページサイズを指定する。
--prefix [text] Optional 指定されたプレフィクスを持つオブジェクトを取得する。
--from-json [text] Optional 各種パラメータを JSON ファイルから指定することができる。
JSON の形式は、--generate-full-command-json-input オプションで生成されるものを参考にする。

以下の例では、図に示すようにオブジェクトを配置したバケットに対してコマンドを実行した結果を示す。

image.png

CLI によるオブジェクトリスト取得例①: 必須パラメータのみ
> oci os object list -bn qiita-test
{
  "data": [
    {
      "etag": null,
      "md5": "1B2M2Y8AsgTpgAmY7PhCfg==",
      "name": "parent1/child1/fileA.txt",
      "size": 0,
      "time-created": "2021-02-02T09:35:54.011000+00:00",
      "time-modified": null
    },
    {
      "etag": null,
      "md5": "1B2M2Y8AsgTpgAmY7PhCfg==",
      "name": "parent1/child1/fileB.txt",
      "size": 0,
      "time-created": "2021-02-02T09:35:54.064000+00:00",
      "time-modified": null
    },
    {
      "etag": null,
      "md5": "1B2M2Y8AsgTpgAmY7PhCfg==",
      "name": "parent1/child2/fileC.txt",
      "size": 0,
      "time-created": "2021-02-02T09:35:54.067000+00:00",
      "time-modified": null
    },
    {
      "etag": null,
      "md5": "1B2M2Y8AsgTpgAmY7PhCfg==",
      "name": "parent1/child2/fileD.txt",
      "size": 0,
      "time-created": "2021-02-02T09:35:53.968000+00:00",
      "time-modified": null
    },
    {
      "etag": null,
      "md5": "1B2M2Y8AsgTpgAmY7PhCfg==",
      "name": "parent1/parentFile.txt",
      "size": 0,
      "time-created": "2021-02-02T10:59:31.704000+00:00",
      "time-modified": null
    },
    {
      "etag": null,
      "md5": "1B2M2Y8AsgTpgAmY7PhCfg==",
      "name": "parent2/child1/fileA.txt",
      "size": 0,
      "time-created": "2021-02-02T09:35:53.977000+00:00",
      "time-modified": null
    },
    {
      "etag": null,
      "md5": "1B2M2Y8AsgTpgAmY7PhCfg==",
      "name": "parent2/child1/fileB.txt",
      "size": 0,
      "time-created": "2021-02-02T09:35:54.033000+00:00",
      "time-modified": null
    },
    {
      "etag": null,
      "md5": "1B2M2Y8AsgTpgAmY7PhCfg==",
      "name": "parent2/child2/fileC.txt",
      "size": 0,
      "time-created": "2021-02-02T09:35:53.986000+00:00",
      "time-modified": null
    },
    {
      "etag": null,
      "md5": "1B2M2Y8AsgTpgAmY7PhCfg==",
      "name": "parent2/child2/fileD.txt",
      "size": 0,
      "time-created": "2021-02-02T09:35:53.924000+00:00",
      "time-modified": null
    },
    {
      "etag": null,
      "md5": "1B2M2Y8AsgTpgAmY7PhCfg==",
      "name": "parent2/parentFile.txt",
      "size": 0,
      "time-created": "2021-02-02T10:59:38.756000+00:00",
      "time-modified": null
    }
  ],
  "prefixes": []
}

CLI によるオブジェクトリスト取得例②: --limit の指定
> oci os object list -bn qiita-test --limit 2
{
  "data": [
    {
      "etag": null,
      "md5": "1B2M2Y8AsgTpgAmY7PhCfg==",
      "name": "parent1/child1/fileA.txt",
      "size": 0,
      "time-created": "2021-02-02T09:35:54.011000+00:00",
      "time-modified": null
    },
    {
      "etag": null,
      "md5": "1B2M2Y8AsgTpgAmY7PhCfg==",
      "name": "parent1/child1/fileB.txt",
      "size": 0,
      "time-created": "2021-02-02T09:35:54.064000+00:00",
      "time-modified": null
    }
  ],
  "next-start-with": "parent1/child2/fileC.txt",
  "prefixes": []
}

CLI によるオブジェクトリスト取得例③: --prefix の指定

parent2/ をプレフィクスにもつ(parent2/ フォルダ以下の)オブジェクトが全て取得されていることが確認できる。

> oci os object list -bn qiita-test --prefix parent2/
{
  "data": [
    {
      "etag": null,
      "md5": "1B2M2Y8AsgTpgAmY7PhCfg==",
      "name": "parent2/child1/fileA.txt",
      "size": 0,
      "time-created": "2021-02-02T09:35:53.977000+00:00",
      "time-modified": null
    },
    {
      "etag": null,
      "md5": "1B2M2Y8AsgTpgAmY7PhCfg==",
      "name": "parent2/child1/fileB.txt",
      "size": 0,
      "time-created": "2021-02-02T09:35:54.033000+00:00",
      "time-modified": null
    },
    {
      "etag": null,
      "md5": "1B2M2Y8AsgTpgAmY7PhCfg==",
      "name": "parent2/child2/fileC.txt",
      "size": 0,
      "time-created": "2021-02-02T09:35:53.986000+00:00",
      "time-modified": null
    },
    {
      "etag": null,
      "md5": "1B2M2Y8AsgTpgAmY7PhCfg==",
      "name": "parent2/child2/fileD.txt",
      "size": 0,
      "time-created": "2021-02-02T09:35:53.924000+00:00",
      "time-modified": null
    },
    {
      "etag": null,
      "md5": "1B2M2Y8AsgTpgAmY7PhCfg==",
      "name": "parent2/parentFile.txt",
      "size": 0,
      "time-created": "2021-02-02T10:59:38.756000+00:00",
      "time-modified": null
    }
  ],
  "prefixes": []
}

CLI によるオブジェクトリスト取得例④: --delimiter--prefix の併用

parent2/ 直下のファイルのみが表示されていることが確認できる。

> oci os object list -bn qiita-test --prefix parent2/ --delimiter /
{
  "data": [
    {
      "etag": null,
      "md5": "1B2M2Y8AsgTpgAmY7PhCfg==",
      "name": "parent2/parentFile.txt",
      "size": 0,
      "time-created": "2021-02-02T10:59:38.756000+00:00",
      "time-modified": null
    }
  ],
  "prefixes": [
    "parent2/child1/",
    "parent2/child2/"
  ]
}

oci os object get

ref: https://docs.oracle.com/en-us/iaas/tools/oci-cli/2.17.0/oci_cli_docs/cmdref/os/object/get.html

バケットからオブジェクトをダウンロードするには、oci os object get コマンドを用いる。
ディレクトリを対象とした一括ダウンロードには oci os object bulk-download コマンドを用いる(本記事では扱わない)。
コマンドの主要な引数は以下の通り。

oci os object get コマンドの主要な引数
引数 Required/Optional 説明
--bucket-name, --name, -bn [text] Required バケット名
--file [filename] Required ダウンロード後のファイル名を指定する。- を指定すると標準入力から受け取ることができる。
--name [text] Required ダウンロードするオブジェクト名
--multipart-download-threshold [integer range] Optional 対象のオブジェクトのサイズがここで指定したサイズ(MiB)以上だった場合、マルチパート・ダウンロードを行う。最小値は 128 MiB。
--parallel-download-count [integer] Optional
(デフォルト: 10)
マルチパート・ダウンロードを行う際の並列数
--part-size [integer] Optional
(デフォルト: 128)
マルチパート・ダウンロードを行う際の各パートのサイズ。最小値は 128 MiB。
--version-id [text] Optional ダウンロードするオブジェクトのバージョンを指定する
--namespace-name, --namespace, -ns [text] Optional バケットを取得する名前空間を指定する。
デフォルトではoci os ns getで返ってくる値が入っている。
--from-json [text] Optional 各種パラメータを JSON ファイルから指定することができる。
JSON の形式は、--generate-full-command-json-input オプションで生成されるものを参考にする。

コマンド実行例

CLI によるオブジェクトダウンロード例①: 必須パラメータのみ
> oci os object get \
  --file testfile.txt \
  --name testfile.txt
Downloading object  [####################################]  100%
> ls
testfile.txt

oci os object delete

ref: https://docs.oracle.com/en-us/iaas/tools/oci-cli/2.17.0/oci_cli_docs/cmdref/os/object/delete.html

バケットからオブジェクトを削除するには、oci os object delete コマンドを用いる。
ディレクトリを対象とした一括削除には oci os object bulk-delete コマンドを用いる(本記事では扱わない)。
コマンドの主要な引数は以下の通り。

oci os object delete コマンドの主要な引数
引数 Required/Optional 説明
--bucket-name, -bn [text] Required バケット名
--object-name, --name [text] Required オブジェクト名
--force Optional 確認を表示せず即座に削除を実行するためのオプション
--version-id [text] Optional バージョニングが有効化されているバケットの際に、削除するオブジェクトのバージョンを指定する。
--from-json [text] Optional 各種パラメータを JSON ファイルから指定することができる。
JSON の形式は、--generate-full-command-json-input オプションで生成されるものを参考にする。

コマンド実行例

CLI によるオブジェクト削除例①: 必須パラメータのみ
> oci os object list --bucket-name qiita-test
{
  "data": [
    {
      "etag": null,
      "md5": "ZllWSF64s0R+jxuXwKohWw==",
      "name": "testfile.txt",
      "size": 24,
      "time-created": "2021-01-12T01:07:02.061000+00:00",
      "time-modified": null
    }
  ],
  "prefixes": []
}
> oci os object delete \
  --bucket-name qiita-test \
  --object-name testfile.txt
Are you sure you want to delete this resource? [y/N]: y
> oci os object list --bucket-name qiita-test
{
  "prefixes": []
}

おわりに

Oracle Cloud Infrastructure の Object Storage Service について、さわりの部分を説明してきました。
本記事では説明しませんでしたが、 ライフサイクルポリシーを設定することでオブジェクト・ストレージからアーカイブ・ストレージへの移動を自動化したり、レプリケーションポリシーを設定することで別のリージョンのバケットにオブジェクトをレプリケーションすることもでき、基本的なオブジェクトストレージの機能は備えているようです。

see also


  1. https://www.oracle.com/cloud/storage/object-storage-faq.htmlHow durable is data stored in Oracle Cloud Infrastructure Object Storage? に記載がある。 

  2. 以降、本記事では allow group Group_Name to manage object-family in compartment Compartment_Name ポリシが適用されているユーザを利用してAPIを利用する。 

4
2
0

Register as a new user and use Qiita more conveniently

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