Object StorageをCLIで操作する

こんにちは。最近唐揚げを 50 個食べて脂を一括ダウンロードしてしまった id:k-iwadate です。

さて、これまで Object Storage に関する記事を2つ書きましたが、どちらも GUI での操作のみでした。
今回はコマンドをご紹介しながら Object Storage の一連の操作を CLI で行います。
CLI にはオブジェクトの一括操作や対象文字列指定など、便利な機能が多く備わっていますので、是非ご活用ください。

前提

  • Oracle Cloud Infrastructure CLI が動作すること (以下の記事をご参考ください)。 cloudii.atomitech.jp cloudii.atomitech.jp

  • 今回使用するリージョンは us-ashburn-1 です。

  • 現在の名前空間の記載場所 (後ほど入力が必要です)

    • 下の画像の赤く囲った箇所で確認ができます (名前空間の切り替えもここで行うことができます)。
    • (root) を含む場合は、それ以前の部分が名前空間となります。 f:id:k-iwadate:20180903232745p:plain
  • Compartment idの記載場所 (後ほど入力が必要です)

    1. 現在の名前空間を確認します。

    2. 左上 MENU -> Identity -> Compartments の順にクリックします。

    3. 確認した名前空間を探します。以下で ID の確認、コピーができます。 f:id:k-iwadate:20180903233438p:plain

  • バケットのアクセス権限の種類 (後ほど入力が必要です)

    • Private = NoPublicAccess
    • Public (2種類あります)
      • ObjectRead ... get 操作 、head 操作、list 操作が可能。
        get 操作...オブジェクトのメタデータと本体を取得する。
        head 操作...オブジェクトのユーザー定義のメタデータとエンティティタグを取得する。
        list 操作...バケット内のオブジェクトを一覧表示する。
      • ObjectReadWithoutList ... ObjectRead 権限から list 操作が不可になったもの。

バケットの作成

  • コマンド
    アクセス権限の種類を指定せずに作成した場合は、デフォルトで NoPublicAccess に設定されます。
$ oci os bucket create -ns [名前空間] --name [任意のバケット名] -c [Compartment id] (--public-access-type [アクセス権限の種類] )
  • 実行
$ oci os bucket create -ns xxxx --name cli-bucket -c xxxx  
{
  "data": {
    "compartment-id": "ocid1.tenancy.oc1..xxxx",
    "created-by": "ocid1.user.oc1..xxxx",
    "defined-tags": {},
    "etag": "xxxx",
    "freeform-tags": {},
    "metadata": {},
    "name": "cli-bucket",
    "namespace": "xxxx",
    "public-access-type": "NoPublicAccess",
    "storage-tier": "Standard",
    "time-created": "2018-09-03T14:52:28.542000+00:00"
  },
  "etag": "xxxx"
}
  • 確認 f:id:k-iwadate:20180904001357p:plain cli-bucket が作成されています。

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

単体でアップロードする場合

  • コマンド
    任意のオブジェクト名を指定しない場合、現在のファイル名が適用されます。
$ oci os object put -ns [名前空間] -bn [アップロード先のバケット名] --file [対象ファイルのパス] (--name [任意のオブジェクト名]) --no-multipart  
  • 実行
$ oci os object put -ns xxxx -bn cli-bucket --file  xxx/xxx/xxx/xxx --name simple --no-multipart  
Uploading object  [####################################]  100%
{
  "etag": "xxxxx",
  "last-modified": "Mon, 03 Sep 2018 16:01:16 GMT",
  "opc-content-md5": "xxxxx"
}

一括でアップロードする場合

指定したディレクトリと、サブディレクトリにある全てのファイルが対象です。

  • コマンド
$ oci os object bulk-upload -ns [名前空間] -bn [アップロード先バケット名] --src-dir [対象ファイルが格納されているディレクトリパス] --no-multipart
  • 実行
    以下のファイルを一括でアップロードしてみます。 f:id:k-iwadate:20180904222326p:plain
$ oci os object bulk-upload -ns xxxx -bn cli-bucket --src-dir  /xxx/xxx/xxx/xxx --no-multipart  
Uploaded hoge4-e  [####################################]  100%
{
  "skipped-objects": [],
  "upload-failures": {},
  "uploaded-objects": {
      "fuga1-c": {
          "etag": "xxxx",
          "last-modified": "Mon, 03 Sep 2018 16:19:39 GMT",
          "opc-content-md5": "xxxx"
      },
            略
      "hoge5-y": {
          "etag": "xxxx",
          "last-modified": "Mon, 03 Sep 2018 16:19:38 GMT",
          "opc-content-md5": "xxxx"
      }
   }
}

オブジェクトリストの取得

指定したバケットに格納されている全てのオブジェクトが表示されます。

  • コマンド
$ oci os object list -ns [名前空間] -bn [対象バケット名]
  • 実行
    先程のアップロードの確認も兼ねて、指定したバケットのオブジェクトリストを取得してみましょう。
$ oci os object list -ns xxxx -bn cli-bucket  
{  
  "data": [  
    {  
      "md5": "xxxx",
      "name": "fuga1-c",
      "size": 0,
      "time-created": "2018-09-03T16:19:39.848000+00:00"
    },
    {
              略
    },
    {
      "md5": "xxxx",
      "name": "hoge5-y",
      "size": 0,
      "time-created": "2018-09-03T16:19:38.932000+00:00"
    },
    {
      "md5": "xxxx",
      "name": "simple",
      "size": 0,
      "time-created": "2018-09-03T16:01:16.151000+00:00"
    }
  ],
  "prefixes": []
}

アップロードしたオブジェクトのデータがこのように表示されます。

バケット情報の取得

バケットのアクセス権限を変更したいところですが、まずは現在のバケット情報を取得し、確認をしてみましょう。

  • コマンド
$ oci os bucket get -ns [名前空間] -bn [対象バケット名]
  • 実行
$ oci os bucket get -ns xxxx -bn cli-bucket
{
  "data": {
    "compartment-id": "xxxx",
    "created-by": "ocid1.user.oc1..xxxx",
    "defined-tags": {},
    "etag": "xxxx",
    "freeform-tags": {},
    "metadata": {},
    "name": "cli-bucket",
    "namespace": "xxxx",
    "public-access-type": "NoPublicAccess",
    "storage-tier": "Standard",
    "time-created": "2018-09-03T14:52:28.542000+00:00"
  },
  "etag": "xxxx"
}

public-access-type (アクセス権限の種類) がNoPublicAccess (Private) になっています。
前述のとおり、バケット作成時にアクセス権限を指定しなかったため、デフォルト値である NoPublicAccess が割り当てられています。

アクセス権限の変更

アクセス権限を NoPublicAccess から ObjectRead (Public) に変更してみましょう。

  • コマンド
$ oci os bucket update -ns [名前空間] -bn [対象バケット名] --public-access-type [アクセス権限の種類]
  • 実行
$ oci os bucket update -ns xxxx -bn cli-bucket --public-access-type ObjectRead
{
  "data": {
    略
    "public-access-type": "ObjectRead",
    略
}

レスポンスにより ObjectRead に変更されたことが確認できました。

オブジェクトの上書き

先程、単体でアップロードした「simple」オブジェクトの中身を上書きしてみましょう。
以下のように中身の異なる同名のファイルを用意します(または --name で同じ名前を指定します)。 f:id:k-iwadate:20180904104250p:plain

  • コマンド (単体アップロードのコマンドと同じです)
$ oci os object put -ns [名前空間] -bn [アップロード先のバケット名] --file [対象ファイルのパス] (--name [任意のオブジェクト名]) --no-multipart  
  • 実行
    上書き実行前に確認があるので、y を選択します。
$ oci os object put -ns xxxx -bn cli-bucket --file /xxx/xxx/xxx/xxx/simple  --no-multipart
WARNING: This object already exists. Are you sure you want to overwrite it? [y/N]: y
Uploading object  [####################################]  100%
{
  "etag": "",xxxx
  "last-modified": "Tue, 04 Sep 2018 01:48:02 GMT",
  "opc-content-md5": "xxxx"
}

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

単体でダウンロードする場合

上書きされているかの確認も兼ねて、「simple」 オブジェクトをダウンロードしてみましょう。
単体ダウンロードの際は、格納したい場所に空のファイルを用意しておく必要があります。

  • コマンド
$ oci os object get -ns [名前空間] -bn [対象バケット名] --name [ダウンロードするオブジェクト名] --file [格納用に用意した空ファイルのパス] 
  • 実行
$ oci os object get -ns xxxx -bn cli-bucket --name simple --file /xxx/xxx/xxx/xxx/download-test
Downloading object  [####################################]  100%
  • 確認
    f:id:k-iwadate:20180904110951p:plain ダウンロード完了と同時に、中身が overwrite test に書き換わっていることも確認できました。

一括でダウンロードする場合

単体ダウンロードはファイルが格納先になるのに対し、一括ダウンロードはディレクトリが格納先になります。

  • コマンド
 oci os object bulk-download -ns [名前空間] -bn [バケット名] --download-dir [格納先のディレクトリパス]
  • 実行
$ oci os object bulk-download -ns xxxx -bn cli-bucket --download-dir /xxx/xxx/xxx/bulkdownload-test
Downloaded 02c-fuga  [####################################]  100%
{
  "download-failures": {},
  "skipped-objects": []
}
  • 確認
    f:id:k-iwadate:20180905000533p:plain
    指定したディレクトリに全てのオブジェクトが格納されました。

オブジェクトの削除

アップロードしたオブジェクトを削除し、バケットを空にしてみます。
複数削除の際は、コマンドに --dry-run を付けると削除対象のオブジェクトが表示されます (削除は行われません)。

単体で削除する場合

まずは、「simple」オブジェクトを削除します。

  • コマンド
$ oci os object delete -ns [名前空間] -bn [対象バケット名] --name [削除するオブジェクト名]
  • 実行
    削除実行前に確認があるので、y を選択します。
$ oci os object delete -ns xxxx -bn cli-bucket --name simple
Are you sure you want to delete this resource? [y/N]: y

文字列を指定して対象となるもの全てを削除する場合

オブジェクト名の先頭の文字列を指定し、合致するオブジェクトを一括で削除することができます。

  • コマンド
$ oci os object bulk-delete -ns [名前空間] -bn [対象バケット名] --prefix [削除対象となる文字列]
  • 実行
    オブジェクト名の先頭に hoge を含むものを全て削除してみます。
    削除実行前に確認があるので、y を選択します。
$ oci os object bulk-delete -ns xxxx -bn cli-bucket --prefix hoge
WARNING: This command will delete 5 objects. Are you sure you wish to continue? [y/N]: y
Deleted hoge5-y  [####################################]  100%
{
  "delete-failures": {},
  "deleted-objects": [
    "hoge3-tt",
    "hoge2-d",
    "hoge1-a",
    "hoge4-e",
    "hoge5-y"
  ]
}
  • 確認
    削除状況を一旦確認してみましょう。

f:id:k-iwadate:20180905005039p:plain
「simple」、hogeを名前の先頭に含むオブジェクトが削除されています。

バケット内の全てのオブジェクト一括で削除する場合

  • コマンド
$ oci os object bulk-delete -ns [名前空間] -bn [対象バケット名]
  • 実行
    残りのオブジェクトを削除します。
    削除実行前に確認があるので、y を選択します。
$ oci os object bulk-delete -ns xxxx -bn cli-bucket
WARNING: This command will delete 6 objects. Are you sure you wish to continue? [y/N]: y
Deleted fuga5-d  [####################################]  100%
{
  "delete-failures": {},
  "deleted-objects": [
    "fuga6-ii",
    "fuga1-c",
    "fuga4-u",
    "fuga2-l",
    "fuga3-o",
    "fuga5-d"
  ]
}
  • 確認
    f:id:k-iwadate:20180905010427p:plain
    バケットが空になりました。

バケットの削除

空になったバケットを削除して終わりたいと思います。

  • コマンド
$ oci os bucket delete -ns [名前空間] -bn [対象バケット名]
  • 実行
    削除実行前に確認があるので、y を選択します。
$ oci os bucket delete -ns xxxx -bn cli-bucket  
Are you sure you want to delete this resource? [y/N]: y

最後に

今回は Object Storage の基本操作を CLI で行ってみました。コマンドの形がある程度決まっているので、使い始めでもスムーズに操作できる印象です。GUI 操作より実践的なため、CLI を使用される方も多いのではないかと思います。さらに CLI 操作に関して知りたい方は、下記の参考文献をご参考ください。この記事が少しでもお役に立てれば幸いです。今後ともよろしくお願いいたします。

参考文献