【IBM Cloud】ICOS(IBM Cloud Object Storage)使ってみた

# ICOS(IBM Cloud Object Storage)とは
IBM CloudにおけるAWS S3です。
ごくごく一般的なオブジェクトストレージとしての機能をもっています。
わざわざファイルストレージとの差異は書きません。

# ICOSへの認証について
ICOSへの認証を行う方法には、IAM APIキーを使う方法とHMACキーを使う方法の二通りがあります。

IBM Cloudとしては、IAM API キーを使う方法を推奨しているようです。HMAC キーを使う方法はAWS S3などからマイグレーションされたアプリケーションとの互換性を保つためのものだからだそうです。IAM APIキーを使う場合のほうが実行できる操作は多いようです。
一方、HMAC キー方法のほうがAWS CLIを使ったことがある人にとっては慣れていると思われます。私はAWS CLIを使う方法で今回検証しました。

API キー vs HMAC
https://cloud.ibm.com/docs/cloud-object-storage/iam?topic=cloud-object-storage-service-credentials

IAM の概要
https://cloud.ibm.com/docs/cloud-object-storage/iam?topic=cloud-object-storage-iam-overview

HMAC 資格情報の使用
https://cloud.ibm.com/docs/cloud-object-storage/hmac?topic=cloud-object-storage-hmac


#手順

## 1.IBM Cloudアカウント作成

持っていない場合、IBM Cloudのアカウントを作成しておきます。(この記事を読む人はもう持っている人がほとんどのような気がしますが)
https://cloud.ibm.com/login

登録後、クレジットカードを登録してアカウントのプランをライトプランから従量課金プランにしてください。
従量課金プランにしないと無料の全サービスが利用できません。

## 2.ICOSリソースとバケットの作成
### 2-1.ICOSリソース作成
ICOSのサービス・インスタンスを作成します。
今回はテストのため、ライトプランで作成します。ライトプランのサービス・インスタンスは30日で削除されます。

### 2-2.バケットの作成
ICOSサービス・インスタンスを作成した後にバケットを作成します。
以下のようなオプションがあります。


|項目名|選択肢|説明|
|-|-|-|
|固有のバケット名|(3文字以上63文字以下の文字列)|バケットの名前。ICOSサービス全体で一意な値である必要がある。利用可能な文字列などの制限はポータルで確認可能|
|回復力|Cross Region/Regional/Single Site|データの複製先|
|ロケーション|(日本国内であれば)jp-tok/jp-osa|データの保存先|
|ストレージ・クラス|Smart Tier/Standard/Vault/Cold Vault|データのアクセス頻度|
|オブジェクト・バージョン管理|無効/有効|オブジェクトのバージョン管理ルールの指定|
|有効期限|ルール名/プレフィックス・フィルター(オプション)/有効期限(日単位)|オブジェクトの自動削除ルールの指定|
|保存ポリシー|最短保存期間/最長保存期間/デフォルト保存期間|オブジェクトの最短保存期間・最長保存期間・デフォルト保存期間|
|静的Webサイト・ホスティング|リダイレクト・ルール・タイプの設定|静的Webサイト用にストレージアクセスを許可する場合指定|
|割り当て量の適用|割り当て量をbyte～PBの単位で指定|バケットの割り当て容量(最大容量)|
|サービス統合(オプション)|暗号化/監査/モニタリングの有効/無効|鍵による暗号化/LogDNAによるActivity Tracker(監査)/Sysdigによるモニタリングを行う場合指定。デフォルトではすべて無効|

主な項目の説明は以下です。
今回、私は以下項目のみ、「test-bucket-xxxxxxxxx(xはランダム英数字)」、「回復力：Regional」、「ロケーション：jp-tok」、「ストレージ・クラス：Smart Tier」を指定して、それ以外は指定なしでバケットを作成しました。

回復力：
　データをどの範囲で複製するかを選択します。ICOSは自動的に複数の場所にデータを保存しています。
　日本国内限定でデータを保管したい場合、現状指定できるオプションは「Regional」一択です。
　・Cross Region：3つのリージョンにまたがってデータを複製します。(日本国外のリージョンにもデータが複製されます)
　・Regional：一つのリージョン内で、3つのデータセンターにまたがってデータを複製します。
　・Single Site：一つのデータセンター内で、複数のデバイスにまたがってデータを複製します。(指定できるデータセンターは日本国外のみです)

ロケーション：
　グローバルでロケーションを選択できます。
　日本国内で使用する場合はjp-tokまたはjp-osaのいずれかでしょう。

ストレージ・クラス：
　データのアクセス頻度を指定します。大雑把には、Standard＞Vault＞Coold Vaultの順で性能が高いです。
　一度バケットを作成するとストレージ・クラスは変更できません。
　・Smart Tier(利用状況に合わせて最適な料金を指定してくれる。迷ったらとりあえずこれ)
　・Standard
　・Vault
　・Cold Vault

### 2-3.サービス資格情報の作成
バケット作成後はサービス資格情報を作成します。
今回、とりあえず私は「役割：ライター」、「サービスID：自動作成」、「HMAC資格情報を含める：オン(AWS CLIを使うため)」にして指定して作成しました。

|項目名|選択肢|説明|
|-|-|-|
|名前|資格情報名|任意の名前|
|役割|ライター/管理者など|サービスに対する権限を指定|
|サービスIDの選択(オプション)|既存のサービスIDの指定/自動作成|資格情報を関連付けるサービスIDの指定|
|HMAC資格情報を含める|オン/オフ|HMACキーによる認証を行う場合、オンにする必要がある|

## 3.AWS CLIのインストール

今回、私はAWS CLIを使ってICOSにアクセスしました。
このためAWS CLIのインストールが必要です。以下からダウンロードできます。
(IBM Cloudのサービスを使うのに、AWSが用意したコマンドを使うのかよ、という突っ込みはさておき)
https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-chap-install.html

インストール後、正常に動作するかも確認しておきます。Python 2または3がインストールされていない場合はそちらのインストールも必要と思います。
コマンドプロンプトで以下を実行して、以下のようにバージョンが表示されれば成功です。

```
$ aws --version
aws-cli/2.2.35 Python/3.8.8 Windows/10 exe/AMD64 prompt/off
```

aws cliに設定を行います。

```
$ aws configure
AWS Access Key ID [None]: <サービス資格情報のaccess_key_idを指定>
AWS Secret Access Key [None]: <サービス資格情報のsecret_access_keyを指定>
Default region name [None]: jp-tok
Default output format [None]: json
```

## 4.ファイルのアップロード/ダウンロードのテスト

まず、以下コマンドを実行して、先ほどポータル上で作成したバケットが取得できるか確認します。
AWS CLIに正しくサービス資格情報の設定をしており、バケットへ設定した権限が正しければバケット一覧が表示されます
ここで指定するエンドポイントはIBM Cloudポータルから確認可能です。

```
$ aws s3 ls --endpoint=https://s3.jp-tok.cloud-object-storage.appdomain.cloud
2021-09-05 01:01:10 test-bucket-xxxxxxxxx
```

次に、実際にパブリックエンドポイント経由でICOSにファイルをアップロード/ダウンロードできるかテストしてみます。
テストコマンドは以下の通りです。
test-file.txtという適当なファイルを作って、適当にファイルに内容を書き込んでおきます。とりあえず今回は"This is [test-file.txt]
"と書いておきました。

アップロード

```
$ aws --endpoint-url https://s3.jp-tok.cloud-object-storage.appdomain.cloud s3 cp test-file.txt s3://test-bucket-xxxxxxxxx
upload: .\test-file.txt to s3://test-bucket-xxxxxxxxx/test-file.txt
```

test-file.txtがアップロードされたことを確認(IBM Cloudポータル上から確認しても問題なし)

```
$ aws --endpoint-url https://s3.jp-tok.cloud-object-storage.appdomain.cloud s3 ls s3://test-bucket-xxxxxxxxx
2021-09-05 02:02:02         22 test-file.txt
```


ダウンロード

```
$ aws --endpoint-url https://s3.jp-tok.cloud-object-storage.appdomain.cloud s3 cp s3://test-bucket-xxxxxxxxx/test-file.txt test-file-2.txt
download: s3://test-bucket-xxxxxxxxx/test-file.txt to .\test-file-2.txt
```

ダウンロードでき、中身が問題ないことを確認

```
$ dir
2021/09/05  01:34                22 test-file.txt
2021/09/05  02:02                22 test-file-2.txt

$ type test-file-2.txt
This is [test-file.txt]
```

以上でパブリックエンドポイント経由でICOSに対し、HMAC認証を使ってファイルのアップロード/ダウンロードができることが確認できました。