[OCI] 前回実行時からの差分のコストレポートファイルのみをダウンロードするシェルスクリプトを作って実行してみた


# はじめに
OCIでは、OCI CLIの以下のコマンドを用いて、テナンシのコストレポートをダウンロードすることができます。

```
sudo oci os object list -ns bling -bn <テナンシのOCID＞ --prefix reports/cost-csv
```

こちらのコマンドを使用して、実行時に前回までにダウンロードしていないファイルのみをダウンロードしてくるシェルスクリプトを作成しました。

ちなみに、使用状況レポート（Usage Report）をダウンロードする場合は、以下のコマンドを使用します。（コストレポートと使用状況レポートでは、--prefixの部分のみが異なります。）

```
sudo oci os object list -ns bling -bn <テナンシのOCID＞ --prefix reports/usage-csv
```

# 1.事前準備
OCI CLIを使用しますので、OCI CLIのインストールと設定を行なっておきます。
また、必要に応じて、コストレポートのアクセスに必要なポリシーの設定を行います。
参考：
https://docs.oracle.com/ja-jp/iaas/Content/Billing/Tasks/accessingusagereports.htm

また、スクリプトを作成/実行するディレクトリに、ダウンロード済みのコストレポートファイルのリストとなるdownloaded_files.txtという空のテキストファイルを作成しておきます。

```
touch downloaded_files.txt
```

# 2.シェルスクリプトの作成
今回はcost_report_dl.shという名前でシェルスクリプトを作成しました。

cost_report_dl.shを実行すると、前回のスクリプト実行時までにダウンロードされていない全てのコストレポートファイル（.gz形式）をダウンロードし、ダウンロードしたファイルを解凍します。解凍するとCSVファイルが生成されます。

なお、初回実行時はダウンロード済みのファイルがありませんので、そのテナントの現在までの全てのコストレポートをダウンロードします。

処理の内容の詳細はスクリプト内のコメントを参照してください。

```sh:cost_report_dl.sh
#!/bin/bash

## 初期設定
delimiter=/
declare -i cnt=0;

## コストレポートのリストを取得し、available_files.txtというファイル名で保存
oci os object list -ns bling -bn ocid1.tenancy.oc1..xxxxxxxx --prefix reports/cost-csv --fields name --output json | jq -r '.data[].name' > available_files.txt

## downloaded_files.txtとavailable_files.txtの差分を対象にループ
while read line
do
## ファイル数カウンタ
 cnt=`echo $(($cnt + 1))`

## オブジェクト名からファイル名を取得
 line1=${line##*${delimiter}}

## オブジェクト名、ファイル名の表示
 echo "File No.${cnt}"
 echo "Object Name: ${line}"
 echo "File Name: ${line1}"

# コストレポート(.gz)をダウンロード
 oci os object get -ns bling -bn ocid1.tenancy.oc1..xxxxxxxx --name $line --file $line1

# ダウンロードしたコストレポートの解凍
 echo "Extract downloaded file:"
 gunzip -v ${line1}

done < <(sort downloaded_files.txt available_files.txt | uniq -u)

# ダウンロードしたファイル数の表示
echo "Downloaded ${cnt} file(s)"

if [ $cnt -ne 0 ] ; then
# ダウンロード済みファイルのリストを更新
 mv available_files.txt downloaded_files.txt
else
 rm available_files.txt
fi
```

# 3.シェルスクリプトの実行
シェルスクリプトが作成できたので早速実行してみます。
実行する前にファイルを実行可能にします。

```
[opc@work1 ~]$ chmod +x cost_report_dl.sh
```
cost_report_dl.shを実行してみます。

実行結果は以下のようになります。

```
[opc@work1 ~]$ ./cost_report_dl.sh 
File No.1
Object Name: reports/cost-csv/0001000000197016.csv.gz
File Name: 0001000000197016.csv.gz
Downloading object  [####################################]  100%
Extract downloaded file:
0001000000197016.csv.gz:	 95.2% -- replaced with 0001000000197016.csv
File No.2
Object Name: reports/cost-csv/0001000000197918.csv.gz
File Name: 0001000000197918.csv.gz
Downloading object  [####################################]  100%
Extract downloaded file:
0001000000197918.csv.gz:	 95.6% -- replaced with 0001000000197918.csv
File No.3
Object Name: reports/cost-csv/0001000000198579.csv.gz
File Name: 0001000000198579.csv.gz
Downloading object  [####################################]  100%
Extract downloaded file:
0001000000198579.csv.gz:	 95.6% -- replaced with 0001000000198579.csv
Downloaded 3 file(s)
[opc@work1 ~]$ 
```
今回は3つのファイルがダウンロードされました。
lsコマンドでディレクトリの内容を確認してみます。

```
[opc@work1 ~]$ ls -l
total 500
-rw-r--r--. 1 opc  opc  122109 Jul  9 04:43 0001000000197016.csv
-rw-r--r--. 1 opc  opc  191595 Jul  9 04:43 0001000000197918.csv
-rw-r--r--. 1 opc  opc  181053 Jul  9 04:43 0001000000198579.csv
-rwxrwxr-x. 1 opc  opc    1311 Jul  9 04:15 cost_report_dl.sh
-rw-rw-r--. 1 opc  opc    4100 Jul  9 04:43 downloaded_files.txt
[opc@work1 ~]$ 
```
前回のスクリプト実行後に生成されたコストレポート（3ファイル）がダウンロードされ、解凍されてCSVファイルになっていることが確認できました。
また、タイムスタンプからダウンロード済みファイルのリスト（downloaded_files.txt）が更新されていることも確認できました。

# まとめ
シェルスクリプトでコストレポートをダウンロードして解凍までできることがわかったので、データのダウンロードからコスト分析のためのDBへのデータロードまで一気通貫で行うスクリプトを作ったりすることも可能になりますね。