New RelicでAWSのコストに関する使用状況レポートを見る

記事タイトルとURLをコピーする

みなさんこんにちは。マネージドサービス部MS課の塩野(正)です。

AWSのコスト周りで問い合わせを受けることがあるものの、New Relicさんのブログ記事を見ても必要なところがかなり端折られておりどのような設定が必要でどんなところが注意点になるのかがよくわからなかったので検証環境にて設定を試してみました。

参照しているブログ記事はこちらです。

newrelic.com

目次

AWSコスト調査に関する概要

全体の構成

ブログ記事を見る限りでは、AWSのコストをNew Relicで確認するために必要な構成として下記のような構成になると考えています。

設定

設定項目としては、下記の設定が必要になる認識です。

  1. AWSアカウントにてコストレポートをS3に出力する設定
  2. S3に出力したコストレポートをNew Relicに転送するための設定
  3. New Relicにログとして取り込まれたレポートに属性を付ける設定
  4. 受信した1~3の項目を分析するためのダッシュボード設定

1.AWSアカウント側の設定

参考までに、AWSの公式手順は下記の通りです。

docs.aws.amazon.com

  1. AWSマネジメントコンソールにログインする
  2. Billing and cost management(請求とコスト管理) > データエクスポート を開く
  3. エクスポートとダッシュボードの右側にある作成をクリックする
  4. レガシー CUR エクスポートを選択
  5. コンテンツをエクスポートで必要な項目をチェックする
  6. データエクスポート配信オプションで下記の設定をおこなう
    • データの時間粒度を報告: 時間単位
    • バージョニングを報告: 新しいレポートバージョンを作成
    • レポートデータ統合: Amazon QuickSight
  7. データエクスポートストレージ設定でS3バケットの横の構成をクリックする
    1. バケットを作成するを選択し、S3 バケット名の欄に任意の名前を入力する
    2. リージョンに展開先のリージョン( Asia Pacific(Tokyo) 等)を選択する
    3. バケット作成をクリックする
  8. レポート作成をクリックする

設定は以上です。

2.New Relic側のログ転送設定

次にAWSからNew Relicへ取得したレポートデータを転送する設定になります。 当設定の公式ドキュメントは下記になりますが、ざっくり解説するならこのセクションではLambdaを使用してS3に出力されたコストレポートを送信するという流れになります。

newrelic.com

※当作業の前に展開先のAWSアカウントにログインしておくこと。

  1. New Relicの管理画面を開く
  2. Integrations & Agents > Integrate your AWS account を開く
  3. What type(s) of data do you want to ingest? の項目でLogsを選択する
  4. Choose a setup methodの項で Automate AWS with CloudFormation (Recommended) を選択する
  5. Choose log integration path の項で S3 via Lambda を選択する
  6. 新しく表示された項目は以下のように入力する
    • Enter your S3 bucket(s)
      • S3 bucket name: <前項で作成したS3バケット名>
      • Prefix: <前項で作成したプレフィックス ※例CUR、cost-reportなど>
    • Choose an endpoint for your logs は変更しない
    • Optional Configurationの項は、ログにカスタム属性を付ける場合のみ設定する
  7. 上記入力が終わればContinueをクリックする
  8. Continueをクリックする
  9. Name your CloudFormation stackの項で任意のCloudformationの名前を入力し、Lanch your CloudFormation in AWSのボタンをクリックする
  10. CloudFormationのセクションで下記の項目を入力する
    • パラメータ
      • New Relic Ingest License Key
        • New Relicの画面に戻り、Copy and paste your ingest key in AWSからCreate a new keyをクリックし、発行されたキーを入力する
    • 機能と変換
      • チェックボックスにすべてチェックを入れて、スタックの作成をクリックする
        ※CloudFormationが完了する所まで確認をして、CloudFormationの画面は閉じる
  11. New Relicの画面でContinueをクリックする
  12. See your dataボタンをクリックして取り込み設定を完了させる

設定は以上です。

3.New Relic側のParsing Rule設定

さて、無事New Relicにレポートデータが送信されるとLogsに該当データが取り込まれます。

こうしたデータもただのログとして取り込まれただけだとその先の分析をすることができません。 ログデータを分析するためにParsing Ruleを使って分析しやすい形に加工する必要があります。 ここでは、Parsing Ruleを使った設定をしていきます。

  1. New Relicの管理画面にログインする
  2. Logs > Parsing を開き、Create Parsing ruleをクリックする
  3. New Relic社のブログ記事にあるように入力します
    • Name: 任意の名称を入力する(例:AWS Cost Usage Report)
    • Field to parse: message
    • Filter logs based on NRQL: 転送されたログから対象バケットの条件を確認し入力する(例:logBucketName='記載されているバケット名')
    • Parsing rule and output: 下記に記載のParsing ruleの詳細の値をコピーペースト
  4. Create ruleをクリックして設定を保存

なお、New Relicのブログ記事に記載されているParsing ruleは文字数制限にひっかかって使用できませんでした。

Parsing ruleの詳細

%{GREEDYDATA:log:csv({"columns":["identity_LineItemId","identity_TimeInterval","bill_InvoiceId","bill_InvoicingEntity","bill_BillingEntity","bill_BillType","bill_PayerAccountId","bill_BillingPeriodStartDate","bill_BillingPeriodEndDate","lineItem_UsageAccountId","lineItem_LineItemType","lineItem_UsageStartDate","lineItem_UsageEndDate","lineItem_ProductCode","lineItem_UsageType","lineItem_Operation","lineItem_AvailabilityZone","lineItem_ResourceId","lineItem_UsageAmount","lineItem_NormalizationFactor","lineItem_NormalizedUsageAmount","lineItem_CurrencyCode","lineItem_UnblendedRate","lineItem_UnblendedCost","lineItem_BlendedRate","lineItem_BlendedCost","lineItem_LineItemDescription","lineItem_TaxType","lineItem_LegalEntity","product_ProductName","product_instanceType","product_region","product_availabilityZone","product_operatingSystem","product_usagetype","product_location","product_vcpu","product_memory","product_storage","product_networkPerformance","product_tenancy","pricing_RateCode","pricing_currency","pricing_publicOnDemandCost","pricing_publicOnDemandRate","pricing_term","pricing_unit","reservation_EffectiveCost","reservation_StartTime","reservation_EndTime","savingsPlan_SavingsPlanARN","savingsPlan_SavingsPlanRate","savingsPlan_SavingsPlanEffectiveCost","resourceTags_user_Env","resourceTags_user_Name","resourceTags_user_STAGE","resourceTags_user_Use","resourceTags_user_company","resourceTags_user_team"]})}

4.ダッシュボードの設定

基本的にはNew Relicさんのブログに記載されているNRQLを使用してダッシュボードを作成します。 ただし、New Relicさんのブログ記事が書かれたころからParsing ruleの仕様が変更になっているようで、New Relicさんのブログに記載されているNRQLでは文字数制限に引っかかってしまうため、一部クエリの文字を削減してNRQLの文字数を少なくしたクエリを使用しました。

下記は文字数を少なくしたクエリを使用したサンプルクエリです。

AWSサービス別のコスト①

SELECT
    max(cost)
FROM
    (
        SELECT
            sum(numeric(`log.lineItem_BlendedCost`)) as cost
        FROM
            Log
        WHERE
            `logBucketName` = 'aws-cost-and-usage-reports-dvjjed7w9f3z' TIMESERIES 6 hour facet `log.product_ProductName`
    ) SINCE 7 days ago TIMESERIES 24 hours facet `log.product_ProductName`

AWSサービス別のコスト②

SELECT
    max(cost)
FROM
    (
        SELECT
            sum(numeric(`log.lineItem_BlendedCost`)) as cost
        FROM
            Log
        WHERE
            `logBucketName` = 'aws-cost-and-usage-reports-dvjjed7w9f3z' TIMESERIES 6 hour facet `log.product_ProductName`
    ) SINCE 7 days ago facet `log.product_ProductName`

使用状況レポート

それっぽい情報が取れているように見えますが、実際のコストレポートを見ると少しだけ値が異なるようでした。 どこが違うかまで確認は仕切れていませんが、ざっくりベースでの情報として見るのであればこのグラフでも問題ないのではないかと推測します。

まとめ

時間が経つと仕様が変わるということは現代のシステムではよくある話となりますが、ちょっと工夫すればこうした情報でもまだまだ使用できそうだなぁということが分かりました。 基本的にはAWSの請求とコスト管理を見て頂くのが確実かとは思いますが、複数アカウントの情報を取り込んで横断して分析するという観点ではNew Relicで分析するのもアリではないかと推測します。

こちらの記事がどなたかのお役に立てれば幸いです。

◆ 塩野 正人
◆ マネージドサービス部 所属
◆ X(Twitter):@shioccii
◆ 過去記事はこちら

前職ではオンプレミスで仮想化基盤の構築や運用に従事。現在は運用部隊でNew Relicを使ってサービス改善に奮闘中。New Relic User Group運営。