AWSを真似てOracle Cloud Infrastructure(OCI) で簡易 踏み台サーバーを構築してみた2

# 今回の内容
[前回](https://qiita.com/untitle_23/items/af4e6b9fb00cf5981e32)は、sshログの取得までを実施したが検討事項として、ログのアーカイブが課題となった。そのアーカイブについていくつかわかったため運用方法をまとめる。

## 前提
- [sshログが取得されていること](https://qiita.com/untitle_23/items/af4e6b9fb00cf5981e32)
- Object StorageのBucketが作成されていること
- [Instance Principalが設定されていること](https://qiita.com/untitle_23/items/ddc93a74626ed431af14)
- [CLIがInstallされていること](https://qiita.com/untitle_23/items/ddc93a74626ed431af14)

## 1. Object StorageのCLIの動作説明
先にObject StorageをCLIで操作する上でわかった動作をまとめる。

- putの実行方法
- listの取得方法

### 1-1. putの実行方法
putのマニュアルについては以下を参照。
[putのマニュアル](https://docs.cloud.oracle.com/iaas/tools/oci-cli/latest/oci_cli_docs/cmdref/os/object/put.html)

putの中で注意したい内容については以下と考える。

|項番|注意点|備考|
|:--|:--|:--|
|1|multipart uploadsについて|デフォルトでは128MiB以上だった場合に自動で適応される、変更可能|
|2|parallel upload countについて|デフォルトでは3となっている、変更可能|
|3|アップロードの非同期について|下記コマンド結果を見る限りでは出来ない、--from-jsonだと可能かも？|

実際にputした時のログが以下のような動作。

```
[opc@hostname ~]$ oci os object put -bn <bucket name> --file test.tgz
Upload ID: 442ca437-e20a-42dc-ff1f-f218ff05c0d3
Split file into 8 parts for upload.
Uploading object  [####################################]  100%
{
  "etag": "0d99cc6e-690f-43d3-92a4-33f9ea7927cb",
  "last-modified": "Thu, 31 Jan 2019 06:07:45 GMT",
  "opc-multipart-md5": "KKRDS43OuPhjAwVlwXJM+A==-8"
}
[opc@hostname ~]$ 

```

### 1-2. listの取得方法
listのマニュアルについては以下を参照。
[listのマニュアル](https://docs.cloud.oracle.com/iaas/tools/oci-cli/latest/oci_cli_docs/cmdref/os/object/list.html)

listの中で注意したい内容については以下と考える。(今はあまりない…)

|項番|注意点|備考|
|:--|:--|:--|
|1|数が増えた場合の性能について|Bucketを曜日で分ける運用や、アーカイブする種類によってtagを使い分ける？→putする時にtag付けれない|

実際にlistした時のログが以下のような動作。

```
[opc@hostname ~]$ oci os object list -bn <bucket name> | jq -r '.data[].name'
test.tgz
[opc@hostname ~]$
```
ファイルが増えれば増える程、この結果の行数が多くなる。（当たり前だが…）


## 2. sshログのアップロードについて
「1. Object StorageのCLIの動作説明」から検討した場合に、運用方法としては以下の流れとしようと考える。

* findコマンド(mtimeオプション使用)で1日以上前のログをアップロード対象にする
* 上記の対象は先にtgz化する(1つずつアップロードしても良いが、ファイル数が多くなりすぎてしまうのも避けたい)
* CLIでtgzファイルをアップロードする
* CLIのlistでアップロードしたファイルを検索して見つかったら、ローカルのファイルを削除する
* Object Storageで7日経過後に、Archive Storageに移動されるように「Lifecycle Policy Rules」を設定する
* Archive Storageで2年経過後に、削除されるように「Lifecycle Policy Rules」を設定する

これが出来ればsshログとしての運用も問題ないと思われ、他のログのアーカイブにも応用は可能である。


## 3. 運用を可能にするためのコマンド例
「2. sshログのアップロードについて」で記載した内容のコマンドを簡単に紹介する。
※細かく記載しすぎてしまうのは避けます…script化の助けとなれば。。。


### 3.1 findでのtgz化
findコマンドで1日以上前のファイルを対象にしてtgz化するのは簡単。
運用も考えると日付等の情報を保持すると良いと思われる。

```
[opc@hostname ~]$ cd /var/log/bastion
[opc@hostname bastion]$ export backup_date=`date "+%Y%m%d_%H%M%S"`
[opc@hostname bastion]$ find . -name "*.log" -mtime +1 | xargs tar zcf ${backup_date}.tgz --remove-files
```
スクリプト化する場合は色々と検討ポイントあると思うので各自にお任せ。今回紹介するのはここまで。ちゃんと自身で動作検証してほしい。

### 3.2 tgzファイルのアップロード
これは先ほどのputの通り。注意が必要なのは`${backup_date}`を使用するぐらい。

```
[opc@hostname bastion]$ oci os object put -bn <bucket name> --file ${backup_date}.tgz
Upload ID: XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
Split file into 8 parts for upload.
Uploading object  [####################################]  100%
{
  "etag": "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX",
  "last-modified": "XXX, XX XXX XXXX XX:XX:XX XXX",
  "opc-multipart-md5": "XXXXXXXXXXXXXXXXXXXXXXXXXX"
}
[opc@hostname bastion]$ 
```

### 3.3 list検索して見つかったらローカルを削除
jqを使用することで完全一致の検索をできるので、完全一致したらローカルを削除する

```
[opc@hostname bastion]$ export upload_check=`oci os object list -bn <bucket名> | jq -r '.data[] |select (.name == "'${backup_date}'.tgz").name'`
[opc@hostname bastion]$ if [[ "${upload_check}" == "${backup_date}.tgz" ]]; then
>  rm -f ./${backup_date}.tgz
> else
>  echo "NG"
> fi
[opc@hostname bastion]$
```
ここもスクリプト化する場合は色々と検討ポイントあると思うので各自にお任せ。動作確認必須。



## 4. 今後の検討事項

実はまだ「Lifecycle Policy Rules」については検証していないため、今後要確認となる。
上記の検討事項対応について、以下に記載。
[Oracle Cloud Infrastructure(OCI) のObject Storageの「Lifecycle Policy Rules」について](https://qiita.com/untitle_23/items/27a61d9a978762151168)