Open6
AWS のコスト分析プログラムを作成する
このスクラップについて
AWS で何にどれくらいコストがかかっているかを分析するツールを TypeScript で作成する過程を記録していく。
プロジェクトの作成
oclif も使ってみたいが今回は手動でセットアップしよう。
コマンド
mkdir aws-cost-analyzer
cd aws-cost-analyzer
npm init -y
npm install --save-dev @types/node typescript tsx
npx tsc --init
touch main.ts .env
mkdir data
環境変数ファイルの内容
.env
PROFILE="xxxx"
BUCKET="yyyy"
過去の自分の記事が役に立った。
コストデータの取得
コマンド
source .env && aws --profile $PROFILE s3 sync s3://$BUCKET ./data
CSV 解析
こちらを使わせていただく。
はじめの一歩
main.ts
import { parse } from "csv-parse/sync";
import { readdir, readFile } from "fs/promises";
import { basename, join } from "path";
async function main() {
const dataDirectoryPath = join(__dirname, "data");
const filenames = await readdir(dataDirectoryPath);
const csvFilenames = filenames.filter((filename) =>
filename.endsWith(".csv")
);
const csvFiles = [];
for (const csvFilename of csvFilenames) {
const [month, year] = basename(csvFilename, ".csv").split("-").reverse();
const csvFilePath = join(dataDirectoryPath, csvFilename);
const csvFileBuffer = await readFile(csvFilePath);
const rows = parse(csvFileBuffer, {
columns: true,
});
csvFiles.push({ year, month, rows });
}
console.log(csvFiles[0]);
}
main().catch((err) => console.error(err));
コンソール出力(例)
{
year: '2015',
month: '03',
rows: [
{
InvoiceID: '00000000',
PayerAccountId: '000000000000',
LinkedAccountId: '',
RecordType: 'PayerLineItem',
RecordID: '0000000000000000000',
BillingPeriodStartDate: '2015/03/01 00:00:00',
BillingPeriodEndDate: '2015/03/31 23:59:59',
InvoiceDate: '2015/04/03 11:08:57',
PayerAccountName: 'Tatsuya Susukida',
LinkedAccountName: '',
TaxationAddress: 'xxxx',
PayerPONumber: '',
ProductCode: 'AWSDataTransfer',
ProductName: 'AWS Data Transfer',
SellerOfRecord: 'Amazon Web Services, Inc.',
UsageType: 'APN1-USE1-AWS-In-Bytes',
Operation: '',
RateId: '0000000',
ItemDescription: '$0.00 per GB - Asia Pacific (Tokyo) data transfer from US East (Northern Virginia)',
UsageStartDate: '2015/03/01 00:00:00',
UsageEndDate: '2015/03/31 23:59:59',
UsageQuantity: '6.7E-7',
BlendedRate: '',
CurrencyCode: 'USD',
CostBeforeTax: '0.00',
Credits: '0.0',
TaxAmount: '0.000000',
TaxType: 'None',
TotalCost: '0.000000'
},
}
この調子で必要な情報を集めていこう。
次は Zod で形式をチェックしてみようかな。