Open6

AWS のコスト分析プログラムを作成する

薄田達哉 / tatsuyasusukida薄田達哉 / tatsuyasusukida

このスクラップについて

AWS で何にどれくらいコストがかかっているかを分析するツールを TypeScript で作成する過程を記録していく。

薄田達哉 / tatsuyasusukida薄田達哉 / tatsuyasusukida

プロジェクトの作成

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
薄田達哉 / tatsuyasusukida薄田達哉 / tatsuyasusukida

はじめの一歩

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 で形式をチェックしてみようかな。