Memo/AmazonWebServices/Billing

https://dexlab.net:443/pukiwiki/index.php?Memo/AmazonWebServices/Billing
 

AWS Billing: 請求


Cost Anomaly Detection: 機械学習で異常なコストを検知

  • 2021-04: 通知はemailのみで、SNSには非対応。Chatbotが使えない

Cost Explorer


Savings Plans: RIの代わりの柔軟なコスト削減


Savings Plansをawscliで計算する

  • awscliの結果が多く、1回の出力で1.2MB(json)の制限があるようだ。なので、なるべく条件を絞る。region丸ごとの出力は1回ではできない。
  • 例: 1 year partial upfront, Compute, instanceType: t3.medium, のper hourから「時間単位のコミットメント」、「一部前払い金」を計算する。
    profile=example
    
    # durationsを指定して、offeringIdを取得。describe-savings-plans-offering-ratesではdurationsで絞り込めない。
    aws savingsplans describe-savings-plans-offerings \
      --product-type EC2 \
      --plan-types Compute \
      --payment-options "Partial Upfront" \
      --durations $((3600*24*365)) \
      --currencies USD \
      --profile $profile
    
    {
        "searchResults": [
            {
                "offeringId": "8a5f1067-1eba-46cd-804c-4eb74c0fd43b",
                "productTypes": [
                    "Fargate",
                    "EC2",
                    "Lambda"
                ],
                "planType": "Compute",
                "description": "1 year Partial Upfront Compute Savings Plan",
                "paymentOption": "Partial Upfront",
                "durationSeconds": 31536000,
                "currency": "USD",
                "serviceCode": "ComputeSavingsPlans",
                "usageType": "ComputeSP:1yrPartialUpfront",
                "operation": "",
                "properties": []
            }
        ],
        "nextToken": "11111114011AKXHi82LDrvXSYuU4NaQhgqffGWGkm7NYgDgGhZp2asyvYVUZFiQNU1YBhoBJF"
    }
    
    
    # 検索したいリージョン、インスタンスタイプ
    region=ap-northeast-1
    instanceType=t3.medium
    
    # durationSeconds: 1年
    # usageType: BoxUsage のみ
    aws savingsplans describe-savings-plans-offering-rates \
      --savings-plan-payment-options "Partial Upfront" \
      --products EC2 \
      --savings-plan-types Compute \
      --operations RunInstances \
      --filters "name=region,values=$region" "name=instanceType,values=$instanceType" "name=tenancy,values=shared" \
      --profile $profile \
      | jq '.searchResults[] | select(.savingsPlanOffering.durationSeconds == '$((3600*24*365))') | select(.usageType | contains("BoxUsage"))'
    
    {
      "savingsPlanOffering": {
        "offeringId": "8a5f1067-1eba-46cd-804c-4eb74c0fd43b",
        "paymentOption": "Partial Upfront",
        "planType": "Compute",
        "durationSeconds": 31536000,
        "currency": "USD",
        "planDescription": "1 year Partial Upfront Compute Savings Plan"
      },
      "rate": "0.0407",
      "unit": "Hrs",
      "productType": "EC2",
      "serviceCode": "AmazonEC2",
      "usageType": "APN1-BoxUsage:t3.medium",
      "operation": "RunInstances",
      "properties": [
        {
          "name": "instanceFamily",
          "value": "t3"
        },
        {
          "name": "productDescription",
          "value": "Linux/UNIX"
        },
        {
          "name": "instanceType",
          "value": "t3.medium"
        },
        {
          "name": "tenancy",
          "value": "shared"
        },
        {
          "name": "region",
          "value": "ap-northeast-1"
        }
      ]
    }
  • "rate": "0.0407", "unit": "Hrs",が「時間単位のコミットメント」 Savings Plans の料金と一致しているのが分かる

料金計算:

例1:

  • 上記の ap-northeast-1, t3.medium, Compute Savings Plans, 1年 の場合
  • 実際にAWS consoleのSavings Plansの購入画面と計算結果を比較して、ほぼ一致している
paymentOptionrate (Savings Plans の料金)オンデマンドと比較した費用節減
No Upfront0.042722%
Partial Upfront0.040725%
  • No Upfront:
    • Hourly commitment(時間単位のコミットメント)は小数点第3位までしか入力できないので、第4位を四捨五入
      # Hourly commitment
      houry_commit=0.043
      
      # Total cost: 1 year
      total_cost=$(echo "${houry_commit}*24*365" | bc); echo $total_cost
      376.680
      
      # Monthly payment:
      monthly_cost=$(echo "scale=2;${total_cost}/12" | bc); echo $monthly_cost
      31.39
  • Partial Upfront:
    • Hourly commitment(時間単位のコミットメント): 小数点第3位までしか入力できないので、第4位を四捨五入
    • Upfront cost(一部前払い): Total costの50%以上
      # Hourly commitment
      houry_commit=0.041
      
      # Total cost: 1 year
      total_cost=$(echo "${houry_commit}*24*365" | bc); echo $total_cost
      359.160
      
      # Upfront cost:
      upfront_cost=$(echo "${total_cost}*0.5" | bc); echo $upfront_cost
      179.580
      
      # Monthly payment:
      monthly_cost=$(echo "scale=2;(${total_cost} - ${upfront_cost}) / 12" | bc); echo $monthly_cost
      14.96

Athenaで検索


Budgets: 予算を超えたらアラート


RI購入を忘れないためのアラート設定

  • RI の使用率とカバレッジのアラートを受信して RI を追跡する
    • リソース(EC2, RDS, ElastiCache, Elasticsearch)に対して、RIのカバー率。リソース数に対して、購入済みRIが少ないと下がる。
      • 例「EC2 RI Coverage daily < 80%」
    • 購入済みRIに対して、実際のリソースへの適用率。RI購入したインスタンスタイプが一致してない時は下がる。
      • 例「EC2 RI Usage daily < 80%」

GrafanaでBillingグラフの表示

日々どれだけコストがかかっている事をエンジニアも確認した方が良い。
無駄な費用を払わないように、コスト意識を持たせる。


リソースにタグを振ってリソース毎のコストを計算

設定が必要だが、EC2,RDSといったリソースにタグを振ると、s3バケット上のCSVにそのタグが表示される。
そのため、CSVをExcel等のピボットテーブルで集計するとタグごとのコストが分かる。

ただし、現在全てのリソースにタグをふれないため、金額を厳密に分けたい場合(例えば、クライアント会社毎に請求書を作る)は、別のAWSアカウントを作成し、Consolidated BillingでメインのAWSアカウントに請求をまとめた方が良い。


コスト見積


Consolidated Billing: 一括請求

  • 組織の一括請求 - AWS 請求情報とコスト管理
    • 複数のAWSアカウントがある場合、一つのAWSアカウントに請求を集約できる
    • アカウント毎に請求を一覧できる。例えば請求先が異なる場合に、AWSアカウントを別にすると便利。
    • RIを購入した場合、一括請求に適用されるので、無駄が出にくい。
  • 子アカウントを削除した場合、子アカウントのRIはどうなるか? -> 90日後に完全に削除され、一括請求にも適用されなくなる
    • 課金の仕組み - Amazon Elastic Compute Cloud

      リザーブドインスタンス を購入したアカウントを解約すると、リザーブドインスタンス が期限切れになるか、解約したアカウントが完全に削除されるまで、支払いアカウントに リザーブドインスタンス の請求が継続されます。解約したアカウントは 90 日後に完全に削除されます。削除後、メンバーアカウントは リザーブドインスタンス の請求割引を受けられなくなります。


コスト削減/RI(Reserved Instance)


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2021-04-13 (火) 12:51:13 (6d)