【AWS】バケットのコストを算出するスクリプト書いてみた

ひっさびさの投稿になります。

AWSの各種サービスの料金の中で特定の部分だけ抽出して見たいってことありませんか？
例えば、S3の特定のバケットの利用料を見たい！ってなった時使うのが「コスト配分タグ」です。
[コスト配分タグの使用](https://docs.aws.amazon.com/ja_jp/awsaccountbilling/latest/aboutv2/cost-alloc-tags.html)

このコスト配分タグを使って、定期的に利用料金を確認できるのが請求レポートになるのですが、4種類のレポートがあります。

 １．Mothly Report
 ２．Detailed Billing Report
 ３．Monthly Cost Allocation report
 ４．Detailed Billing Report with Resources and Tags

以下の資料のP60に各レポートの概要とファイル形式について記載があります。
<iframe src="//www.slideshare.net/slideshow/embed_code/key/47QF07Sw42UAFt" width="595" height="485" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;" allowfullscreen> </iframe> <div style="margin-bottom:5px"> <strong> <a href="//www.slideshare.net/AmazonWebServicesJapan/20140226-aws-meisterregeneratebillingpublic" title="[AWSマイスターシリーズ] AWS Billingについて" target="_blank">[AWSマイスターシリーズ] AWS Billingについて</a> </strong> from <strong><a href="//www.slideshare.net/AmazonWebServicesJapan" target="_blank">Amazon Web Services Japan</a></strong> </div>

今回は、S3の特定のバケットの利用料金をMonthly Cost Allocation reportを使って積算するPowerShellスクリプトを作成してみました。
やってる処理はExcelでフィルター掛けて目視するのを自動でやってくれるってだけす。

```
# 利用料のCSVファイルを選択する
$filename = Read-Host "読み込むCSVファイルパスをフルパスで入力してください。"

if ($filename -eq "") {
    Write-Host "CSVファイル名が入力されておりません。再度スクリプトを起動し入力してください。"
    exit
}

# 利用料のCSVファイルを読み込む
$csvfile = Import-Csv $filename

# CSVから引数で指定したバケットの利用料(小数点第2以下を切り上げてドル表記)をテキストファイルに出力する
# 変数初期化
$target = ""

# バケット名を渡す
$target = $args

# 引数の指定がない場合は処理が終了する
if($target.length -eq 0) {
    Write-Host "バケット名が入力されておりません。再度スクリプトを起動し入力してください。"
    exit
}else {
    # ログファイル名の形式を指定
    $filedate = Get-Date -Format "yyyyMMdd-HHmmss"
    
    # ドル表示で引数に指定したバケットの利用料金を出力する
    foreach ($costchklist in $target){
        echo ($costchklist + "の利用料金の内訳:") >> $filedate"_bucket_cost.csv"
        
        # 引数で指定したバケット名のデータを抽出
        $searchbucket = $csvfile | Where-Object {$_."user:[タグ名]" -eq $costchklist}
        
        echo ("ストレージの利用料金:") >> $filedate"_bucket_cost.csv"
        # リクエスト料金を算出
        $reqcost = $searchbucket | Where-Object {$_.UsageType -like "*Requests-Tier*"} | Measure-Object TotalCost -Sum | %{[math]::round($_.Sum,2)}
        
        # ストレージ保管料を算出
        $savecost = $searchbucket | Where-Object {$_.UsageType -like "*TimedStorage-ByteHrs*"} | Measure-Object TotalCost -Sum | %{[math]::round($_.Sum,2)}
        
        # リクエスト料金とストレージ保管料を合算して出力
        $storagecost = $reqcost + $savecost
        echo ("`t$" + $storagecost) >> $filedate"_bucket_cost.csv"
                        
        echo ("転送料の利用料金:") >> $filedate"_bucket_cost.csv"
        # S3の転送料(上り)を算出
        $data_in_cost = $searchbucket | Where-Object {$_.UsageType -like "*-DataTransfer-In-Bytes"} | Measure-Object TotalCost -Sum | %{[math]::round($_.Sum,2)}
        
        # S3の転送料(下り)を算出
        $data_out_cost = $searchbucket | Where-Object {$_.UsageType -like "*-DataTransfer-Out-Bytes"} | Measure-Object TotalCost -Sum | %{[math]::round($_.Sum,2)}
        
        # S3の転送料(上り・下り)を合算して出力
        $transfercost = $data_in_cost + $data_out_cost
        echo ("`t$" + $transfercost) >> $filedate"_bucket_cost.csv"
         
        # ストレージ利用料と転送料を合わせた料金を出力
        echo ("ストレージ利用料と転送料を合わせた料金:") >> $filedate"_bucket_cost.csv"
        $searchbucket | Measure-Object TotalCost -Sum | %{$toc = [math]::round($_.Sum,2)};echo ("`t$" + $toc) >> $filedate"_bucket_cost.csv"
    }
}
```

使う時の注意は、レポートの1行目を削除しないと何も出力されないため、そこは修正します。
一旦は作ったのであげてみました。