クラスメソッドメンバーズ用のAWSコストと使用状況レポート(MCUR)を Sumo Logic で可視化してみた

クラスメソッドメンバーズ用のAWSコストと使用状況レポート(MCUR)を Sumo Logic で可視化してみました。
2023.10.23

こんにちは、アライアンス事業部の佐久間です。
今回は Sumo Logic を使ってクラスメソッドメンバーズの AWS コストと使用状況レポートを可視化してみました。

構成

① まずはクラスメソッドメンバーズのユーザーガイドに沿って、クラスメソッドが提供する CloudFormation テンプレートを使い MCUR 出力用の Amazon S3 bucket を作成します。
② 次に Sumo Logic 提供の CloudFormation テンプレートを使って Sumo Logic の AWS アカウントがお客様の S3 bucket にアクセスできるように IAM ポリシーを作成します。

Sumo Logic では、Parce 構文を使ってデータを可視化します。

MCUR 用に S3 bucket を作成する

クラスメソッドのメンバーズポータル ユーザーガイド | コストと使用状況レポート(CUR)の手順に沿って、Amazon S3 に MCUR を出力します。

① CloudFormation テンプレートからスタックを作成

② スタックの作成後、cm-cur-アカウントID の名前で S3 バケットが作成されていることを確認

Sumo Logic の Source を作成

Hosted Collector > Add Source で S3 Source を選択して、S3 bucket の情報を入力、Sumo Logic が提供する CloudFormation を展開していきます。

① Source の設定で Bucket Name と Path Expression(.csv ファイルまでのファイルパス/*)を入れます。

② Role-based access (recommended) を選択して、Generate role-based access template をクリック。json ファイルをダウンロードしておきます。

※ この画像で青く伏字にしてある部分に Sumo Logic の AWS アカウントが記載されており、ダウンロードした CloudFormation テンプレートを使って、次の工程でアクセス許可を施します。

③ テンプレートファイルのアップロードで先ほどダウンロードした CloudFormation テンプレートファイル(.json)をアップロードします。

④ スタック名を任意で入力して次へと進み、スタックを作成します。

⑤ スタックの展開が完了したら、出力の値をコピーしておきます。

⑥ Sumo Logic の Source 作成画面に戻り、先ほどコピーした値を Role ARN に貼り付けて Save します。

設定は以上です。

ログの出力を確認する

① 先ほど設定した sourceCategory 名を検索してみるとログが出力されているのを確認できます。

② 次に CSV ログをパースして、検索に必要なフィールドを抽出します。 以下は CSV ログの全フィールドをパースするクエリです。(_sourceCategory="hoge" をご自身の sourceCategory 名に修正してご利用ください。)

_sourceCategory="hoge"
| csv _raw extract %"identity/LineItemId", %"identity/TimeInterval", %"bill/BillingEntity", %"bill/BillType", %"bill/PayerAccountId", %"bill/BillingPeriodStartDate", %"bill/BillingPeriodEndDate", %"bill/InvoicingEntity", %"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/LineItemDescription", %"lineItem/TaxType", %"lineItem/LegalEntity", %"product/ProductName", %"product/acceleratorSize", %"product/acceleratorType", %"product/accessType", %"product/activityType", %"product/addonFeature", %"product/alarmType", %"product/apiType", %"product/attachmentType", %"product/availability", %"product/availabilityZone", %"product/bitRate", %"product/brokerEngine", %"product/bundle", %"product/cacheEngine", %"product/cacheMemorySizeGb", %"product/callingType", %"product/capacitystatus", %"product/category", %"product/clientLocation", %"product/clockSpeed", %"product/cloudSearchVersion", %"product/codec", %"product/computeFamily", %"product/computeType", %"product/concurrencyscalingfreeusage", %"product/contentType", %"product/country", %"product/countsAgainstQuota", %"product/cputype", %"product/currentGeneration", %"product/data", %"product/dataTransfer", %"product/dataTransferQuota", %"product/databaseEdition", %"product/databaseEngine", %"product/datatransferout", %"product/dedicatedEbsThroughput", %"product/deploymentLocation", %"product/deploymentOption", %"product/describes", %"product/description", %"product/device", %"product/deviceType", %"product/directConnectLocation", %"product/directorySize", %"product/directoryType", %"product/directoryTypeDescription", %"product/dominantnondominant", %"product/durability", %"product/ebsOptimized", %"product/ecu", %"product/edition", %"product/elasticGraphicsType", %"product/endpoint", %"product/endpointType", %"product/engine", %"product/engineCode", %"product/enhancedNetworkingSupport", %"product/enhancedNetworkingSupported", %"product/entityType", %"product/eventType", %"product/executionFrequency", %"product/executionLocation", %"product/feeCode", %"product/feeDescription", %"product/fileSystemType", %"product/frameRate", %"product/freeOverage", %"product/freeQueryTypes", %"product/freeTier", %"product/freeTrial", %"product/freeUsageIncluded", %"product/frequencyMode", %"product/fromLocation", %"product/fromLocationType", %"product/georegioncode", %"product/gets", %"product/gpu", %"product/gpuMemory", %"product/graphqloperation", %"product/group", %"product/groupDescription", %"product/highAvailability", %"product/indexingSource", %"product/ingestType", %"product/input", %"product/inputMode", %"product/instance", %"product/instanceCapacity10xlarge", %"product/instanceCapacity12xlarge", %"product/instanceCapacity24xlarge", %"product/instanceCapacity2xlarge", %"product/instanceCapacity4xlarge", %"product/instanceCapacity8xlarge", %"product/instanceCapacityLarge", %"product/instanceCapacityXlarge", %"product/instanceFamily", %"product/instanceFunction", %"product/instanceType", %"product/instanceTypeFamily", %"product/instances", %"product/instancesku", %"product/intelAvx2Available", %"product/intelAvxAvailable", %"product/intelTurboAvailable", %"product/io", %"product/license", %"product/licenseModel", %"product/licenseType", %"product/lineType", %"product/location", %"product/locationType", %"product/logsSource", %"product/logsType", %"product/machineLearningProcess", %"product/mailboxStorage", %"product/maxIopsBurstPerformance", %"product/maxIopsvolume", %"product/maxThroughputvolume", %"product/maxVolumeSize", %"product/maximumCapacity", %"product/maximumExtendedStorage", %"product/maximumStorageVolume", %"product/memory", %"product/memoryGib", %"product/memorytype", %"product/messageDeliveryFrequency", %"product/messageDeliveryOrder", %"product/meteringType", %"product/minVolumeSize", %"product/minimumStorageVolume", %"product/networkPerformance", %"product/newcode", %"product/normalizationSizeFactor", %"product/offer", %"product/operatingSystem", %"product/operation", %"product/operationType", %"product/opsItems", %"product/origin", %"product/osLicenseModel", %"product/output", %"product/outputMode", %"product/overageType", %"product/parameterType", %"product/physicalCores", %"product/physicalCpu", %"product/physicalGpu", %"product/physicalProcessor", %"product/pipeline", %"product/portSpeed", %"product/preInstalledSw", %"product/processorArchitecture", %"product/processorFeatures", %"product/productFamily", %"product/protocol", %"product/provisioned", %"product/queueType", %"product/readtype", %"product/realtimeoperation", %"product/recipient", %"product/region", %"product/requestDescription", %"product/requestType", %"product/resolution", %"product/resourceEndpoint", %"product/resourceType", %"product/rootvolume", %"product/routingTarget", %"product/routingType", %"product/runningMode", %"product/servicecode", %"product/servicename", %"product/singleOrDualPass", %"product/sku", %"product/softwareIncluded", %"product/softwareType", %"product/standardStorageRetentionIncluded", %"product/steps", %"product/storage", %"product/storageClass", %"product/storageDescription", %"product/storageMedia", %"product/storageType", %"product/subscriptionType", %"product/supportedModes", %"product/tenancy", %"product/tenancySupport", %"product/throughput", %"product/throughputClass", %"product/tier", %"product/tiertype", %"product/toLocation", %"product/toLocationType", %"product/trafficDirection", %"product/transcodingResult", %"product/transferType", %"product/type", %"product/updates", %"product/usageFamily", %"product/usagetype", %"product/uservolume", %"product/vcpu", %"product/version", %"product/videoCodec", %"product/videoFrameRate", %"product/videoMemoryGib", %"product/videoQuality", %"product/videoQualitySetting", %"product/videoResolution", %"product/virtualInterfaceType", %"product/volumeType", %"product/vqSetting", %"pricing/LeaseContractLength", %"pricing/OfferingClass", %"pricing/PurchaseOption", %"pricing/publicOnDemandCost", %"pricing/publicOnDemandRate", %"pricing/term", %"pricing/unit", %"reservation/AmortizedUpfrontCostForUsage", %"reservation/AmortizedUpfrontFeeForBillingPeriod", %"reservation/AvailabilityZone", %"reservation/EffectiveCost", %"reservation/EndTime", %"reservation/ModificationStatus", %"reservation/NormalizedUnitsPerReservation", %"reservation/NumberOfReservations", %"reservation/RecurringFeeForUsage", %"reservation/ReservationARN", %"reservation/StartTime", %"reservation/TotalReservedNormalizedUnits", %"reservation/TotalReservedUnits", %"reservation/UnitsPerReservation", %"reservation/UnusedAmortizedUpfrontFeeForBillingPeriod", %"reservation/UnusedNormalizedUnitQuantity", %"reservation/UnusedQuantity", %"reservation/UnusedRecurringFee", %"reservation/UpfrontValue", %"resourceTags/user:CmBillingGroup", %"savingsPlan/TotalCommitmentToDate", %"savingsPlan/SavingsPlanARN", %"savingsPlan/SavingsPlanRate", %"savingsPlan/UsedCommitment", %"savingsPlan/SavingsPlanEffectiveCost", %"savingsPlan/AmortizedUpfrontCommitmentForBillingPeriod", %"savingsPlan/RecurringCommitmentForBillingPeriod", %"savingsPlan/Region", %"savingsPlan/PaymentOption", %"savingsPlan/EndTime", %"savingsPlan/InstanceTypeFamily", %"savingsPlan/PurchaseTerm", %"savingsPlan/OfferingType", %"savingsPlan/StartTime"

この状態で検索をすると、パースしたデータが以下の様に抽出されます。

これらの抽出されたデータを更に必要なものだけに絞りこめます。(以下をクエリに追加してみる。)

// フィールド名を日本語に変更
| %"lineItem/ResourceId" as リソースID
| %"lineItem/UsageType" as 利用用途

// ProductCode を AmazonEC2 のデータに絞り込み
| where %"lineItem/ProductCode" = "AmazonEC2"

// リソースID と 利用用途 のフィールドごとに請求金額(USD)を出力
| sum (%"pricing/publicOnDemandCost") as %"請求金額(USD)" group リソースID, 利用用途

この状態で検索すると以下のようなテーブルを作成できます。

更に赤枠の部分を選択すると

リソースと利用用途別にコスト(USD)がいくら掛かっているのかが分かるグラフを作成できます。

まとめ

Sumo Logic で MCUR を可視化してみたブログでした!クエリはシンプルに( | )パイプで条件を付けたしていくことができ、グラフ化するのもクリック1つで行えます。

以下、本記事作成で参考にさせていただいたドキュメントページです。
AWS | 明細項目の詳細
クラスメソッドのメンバーズポータル ユーザーガイド | コストと使用状況レポート(CUR)

以上、皆様の一助になれば幸いです。