【OCI】Archive Storageを利用して低コストでバックアップを保管する。

# はじめに

OCIを操作するOracle Cloud Command Line Interface（OCI CLI）の実行環境を用意する。
なるべく環境を汚したくない＆バージョンアップ楽にしたいタイプなのでDockerで用意します。

今回利用したDocker環境はGit hubで公開しています。
[manaki-naoe/docker-oci-cli](https://github.com/manaki-naoe/docker-oci-cli)
[【OCI】DockerでOCI-CLIを実行する。](https://qiita.com/manaki079/items/cdb9b566c7e534fdb815)

## アーカイブストレージについて

AWSでいう「Amazon S3 Glacier」
GCPでいう「Nearline Storage/Coldline Storage」にあたるサービスだと思っています。

**低頻度アクセス向けのストレージ**
1か月あたりGB 0.312円
データアクセスや最小オブジェクトサイズなど隠れたコストが無いため、
コスト計算ができ安全に利用できると思います。

**復元まで**
データの復元には約4時間ほどかかるそうです。

### 料金について

AWSやGCPでは取り出すために料金がものすごくかかってしまいますが、
OCIではストレージ料金とリクエスト費用しかかかりません。
![0.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111276/9b0d5ba4-c4ed-6e79-5308-ea258165cbd0.jpeg)
[画像参照先](https://www.oracle.com/cloud/storage/archive-storage-faq.html)

### Always Freeもあります

10GBのオブジェクト・ストレージ
10GBのアーカイブ・ストレージ

10GBまでが無料になっています。

## 準備

### アーカイブストレージを作成する。

> **ダッシュボードからオブジェクト・ストレージを選択**
> ![1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111276/e551f739-c3d6-f26d-e0bf-77d1a063bf26.jpeg)
> 
> **バケットの作成をクリック**
> ![2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111276/463938b4-ef62-b93b-fc03-759086005556.jpeg)
> 
> **アーカイブストレージを利用する場合は必ずストレージ層を「アーカイブ」にしてください。**
![3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111276/47193fad-e1ca-98f9-12c9-49db43bfce39.jpeg)
> 
> **作成され終了です。**
![4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111276/430c9c57-9297-b2df-a74b-1a17e4f78d58.jpeg)
> 

### OCI CLIの実行環境を用意する。
> 
> **Dockerfileをクローンする**
> 
> ```bash
> $ git clone git@github.com:manaki-naoe/docker-oci-cli.git
>```
>

> **イメージのビルド**
> 
> ```bash
> $ docker build -t oci-cli .
>```
>

> **ConfigファイルとAPI Keyの作成**
> 
> ```bash
> $ docker run --rm -v ${PWD}/.oci:/root/.oci -it oci-cli:latest setup config
> ```
>
> **作成したAPI Keyの登録**
> ユーザーの詳細画面でAPI Keyを追加してください
> 
> ![5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111276/3bd8db8b-7032-ef06-9879-30a1ba3e977e.jpeg)

> **コンパートメント用configの作成**
> 
> ```bash
> $ docker run --rm -v ${PWD}/.oci:/root/.oci -it oci-cli:latest setup oci-cli-rc
>
> # リポジトリ内はこんな構造になっているはずです。
> - .oci
>    - config
>    - oci_api_key.pem
>    - oci_api_key_public.pem
>    - oci_cli_rc
> - Dockerfile
>
> $ vi .oci/oci_cli_rc
> # 末尾に以下を追加します。
> [DEFAULT]
> compartment-id = <Compartment OCID>
>
> ```
>

以上で準備は終了です。

## アーカイブストレージにアップロードする。

### 1ファイルだけアップロードする。

> **スクリプトを設置する**
> 
> ```bash:put.sh
> #!/bin/bash
> docker run --rm \
> -v ${PWD}/.oci:/root/.oci \
> -v <アップロードしたいファイルがあるディレクトリパス>:/root/bucket \
> -it oci-cli:latest \
> os object put \
> --bucket-name <バケット名> \
> --file /root/bucket/$1
>```
>

> **実行**
> 
> ```bash
> $ ./put.sh <ファイル名>
>```
> オブジェクト・ストレージの詳細ページでファイルがアップロードされていれば成功です。
>

### ディレクトリ内のファイルをアップロードする。

> **スクリプトを設置する**
> 
> ```bash:bulk_upload.sh
> #!/bin/bash
> docker run --rm \
> -v ${PWD}/.oci:/root/.oci \
> -v <アップロードしたいファイルがあるディレクトリパス>:/root/bucket \
> -it oci-cli:latest \
> os object bulk-upload \
> --bucket-name <バケット名> \
> --src-dir /root/bucket \
> --exclude .gitignore \
> --no-overwrite
>```
> 除外したファイルがあれば[--exclude]オプションで除外できます
> 例　--exclude .gitignore
>
> --no-overwriteはすでに存在しているファイルをアップロードしないオプションです。

> **実行**
> 
> ```bash
> $ ./bulk_upload.sh
>```
> オブジェクト・ストレージの詳細ページでファイルがアップロードされていれば成功です。
>

## おわりに

コストの事前計算ができ、
取り出すための料金がリクエスト費用しかないため、
安心して取り出すことができます。

10GBまで無料でもあるので、
私はバックアップの保管に利用しています。