Amazon Web Services ブログ

AWS X-Ray と AWS Application Cost Profilerを使用して共有 AWS インフラストラクチャのテナントコストを追跡する

こちらのブログ記事では、AWS Application Cost Profiler をご紹介しました。この新サービスでは、マルチテナントのアプリケーションを実行しているお客様が、テナント間で共有されている AWS リソースの詳細なコスト内訳を取得することができます。AWS Application Cost Profiler は、お客様、特に SaaS ISV に、各顧客またはテナントのインフラストラクチャコストを関連付けて報告する標準的なメカニズムを提供します。この詳細なテナントベースのコスト表示により、ISV は製品の利用プランベースまたは使用量ベースの価格設定による市場投入戦略を策定し、マルチテナントアーキテクチャモデルのコストを効果的に管理できます。また、マルチテナント型のアプリケーションを運用している企業は、このデータを活用して、チャージバック目的の正確なコスト配分モデルを定義することができます。

Application Cost Profiler では、アプリケーションの所有者は、テナントの使用量メタデータを生成し、Application Cost Profiler の入力として使用できるように、アプリケーションを計測する必要があります。以前、Amazon CloudWatch Logs を利用するサンプルアプリケーションのインストルメンテーションをご紹介しました。この例では、テナント情報が Amazon CloudWatch Logsの出力に追加され、スケジュールされた AWS Lambda 関数がログ出力を時間ごとに処理して、AWS Application Cost Profiler によって使用されるテナント使用量のメタデータを生成します。次の例では、AWS X-Ray のトレースサマリを使用して、テナントの使用量メタデータを生成し、AWS Application Cost Profiler と統合します。

AWS X-Ray による分散トレーシング

AWS X-Ray は、マイクロサービスアーキテクチャを介して構築されたアプリケーションなど、分散アプリケーションの開発者の分析とデバッグを支援する分散トレースサービスです。AWS X-Ray によって生成されたこれらのトレースサマリには、リクエストで使用されたサービスとリソースに関する情報が含まれています。テナント情報で AWS X-Ray を使用している既存のアプリケーションをインストルメンテーションすることで、AWS Lambda、Amazon DynamoDBAmazon Simple Notification Service (SNS)Amazon Simple Queue Service (SQS) などのサービスのテナント使用量メタデータを生成できます。

exports.handler = async (event, context) => {
             AWSXRay.captureFunc("annotations", function (subsegment) {
              subsegment.addAnnotation("Tenant_id", event.tenantId);
});
     }

AWS X-Ray を使用したインストルメンテーションの例

AWS Application Cost Profiler の使用を開始する

AWS Application Cost Profiler の使用を開始するには、次の 2 段階の手順で行えます。

ステップ 1: 消費インサイトレポートを生成するように Application Cost Profiler を設定します。

ステップ 2: テナントメタデータのアプリケーションをインストルメンテーションします。

両方のステップは任意の順序で完了できますが、Application Cost Profiler がこれらのインサイトを生成する前に、両方のステップを完了する必要があります。初期設定の時間を節約するために、3 つの便利な CloudFormation テンプレートを作成しました。詳細については、以下のセクションをご覧ください。

ステップ 1: 消費インサイトレポートを生成するようにApplication Cost Profilerを設定する

Application Cost Profiler のレポート設定は、AWS コンソール、AWS CLI、またはいずれかの AWS SDK を使用して定義する必要があります。AWS コンソールでこれを設定する方法を紹介します。レポートの設定は、Application Cost Profiler にテナントコストレポートの配信先を指示することです。送信先は、Application Cost Profiler がレポートを書き込むための適切なアクセス許可を持つ Amazon S3 バケットです。

前提条件

このウォークスルーでは、次のものが必要です。

S3 バケットとレポートの設定をセットアップする

  1. AWS コンソールにログインします。
  2. Cost Explorerが有効になっていることを確認します (こちらは重要です。AWS Application Cost Profiler は、Cost Explorer が有効になっていないとテナントの使用量データを処理しないためです)。下の [Launch Stack] ボタンをクリックすると、最初の CloudFormation スタックが起動し、適切な Application Cost Profiler のパーミッションとサーバー側の暗号化設定を持つS3バケット、AWS Event Bridge ルール、そしてオプションでサブスクライブできる AWS Application Cost Profiler イベント用の SNS トピック が設置され、設定されます。

    Interactive "launch stack" button

  3. CloudFormation スタックの起動が完了したら、us-east-1 リージョンでコンソールの検索機能を使用して「AWS Application Cost Profiler」ページに移動します。
  4. AWS Application Cost Profiler のダッシュボードで、[Get started now] をクリックします。
Screen shot of AWS Application Cost Profiler console with Get started now button highlighted

Application Cost Profiler コンソール

  1. 新しいレポート設定をセットアップします。
    1. Report Name:これはユーザーが定義するもので、保存後は変更できません。
    2. Report Description— レポート設定のユーザー定義の説明です (任意)。
    3. S3 bucket name — これは、AWS Application Cost Profiler がレポートを配信する S3 バケットです。このバケットは、先程の CloudFormation テンプレートを使用して作成されました。このバケットの名前は「acp-{REGION} — {ACCOUNT_ID}」で、{REGION} を CloudFormation テンプレートがデプロイされた AWS リージョン (例: us-east-1) に置き換え、{ACCOUNT_ID} を CloudFormation テンプレートのデプロイに使用された実際の AWS アカウント ID に置き換えます。たとえば、”acp-us-east-1-987654321″ のようになります。このレポートバケット名は、上記でデプロイされた CloudFormation スタックの「リソース」セクションにも記載されています。
    4. S3 prefix — これは、AWS Application Cost Profiler がレポートを配信する上で使用される S3 バケットのプレフィックスです。上記の CloudFormation テンプレートにデプロイされた S3 バケットでは、AWS Application Cost Profiler による「reports」プレフィックスへの書き込みアクセス許可を有効にしました。したがって、ここに「reports」と入力します。
    5. Time Frequency:レポートの生成を [毎日]、[毎月]、または [両方] のどちらから選択します。
    6. Report Output Format — Amazon S3 バケット内に作成されるファイルタイプを選択します。[CSV] を選択した場合、Application Cost Profilerは、レポート用に gzip 圧縮のカンマ区切り値テキストファイルを作成します。[Parquet] を選択すると、レポート用の Parquet ファイルが生成されます。
AWS Application Cost Profiler configuration screen shot

Application Cost Profilerコンソールの最終レポート設定画面

  1. [Configure] ボタンをクリックします。Application Cost Profiler は、上記で定義されたバケットの存在と、上記で定義されたプレフィックスに対するサービスの書き込み権限を確認します。成功すると、確認メッセージが表示されます。
AWS Application Cost Profiler configuration screen shot showing successful save

Application Cost Profilerコンソールの確認メッセージ

  1. 「OK」をクリックして AWS Application Cost Profiler に戻ります。

AWS Application Cost Profiler コンソールでアクセス許可を持つ S3 バケットの送信先とレポート設定をしたので、テナントの使用量データを準備、アップロード、インポートする用意ができました。

ステップ 2: サービスからテナント使用量データを渡す

レポートを生成するために、AWS Application Cost Profiler では、テナントの使用量データを提供する必要があります。この情報は、AWS Application Cost Profiler が読み取り権限を持つ S3 ロケーションにアップロードする必要があります。上記の最初の CloudFormation テンプレートで作成された S3 バケットにより、AWS Application Cost Profiler に「import/*」プレフィックスへの読み取りアクセスが許可されています。

Application Cost Profilerに S3 バケットの使用量データへのアクセスを許可することで、レポート処理中に、Application Cost Profilerがそのような使用量データオブジェクトを一時的に米国東部(バージニア北部)AWS リージョンにコピーすることを許可します。これらのデータオブジェクトは、月次レポートの生成が完了するまで、米国東部 (バージニア北部) リージョンに保持されます。データ転送料金が発生しないように、バケットに対するリクエスタ支払いを設定できます。

試しにサンプルサーバーレスアプリケーションのインストルメンテーションをして、テナントベース全体のコストを追跡してみましょう。2 つ目の CloudFormation テンプレートは、Amazon API Gateway、AWS Lambda、そして分散トレース用の AWS X-Ray を利用した基本的なサーバーレスアプリケーションをデプロイします。

Serverless application architecture diagram showing API Gateway, Lambda, X-Ray, and DynamoDB

サーバーレスアプリケーションの概念的なアーキテクチャ図

サンプルのサーバーレスアプリケーションをデプロイする

  1. AWS コンソールにログインします。
  2. 下の [Launch Stack] ボタンをクリックして、サンプルのサーバーレスアプリケーションをインストールおよび設定する 2 番目の CloudFormation スタックを起動します。このスタックは、以前に起動した CloudFormation スタックと同じリージョンで起動する必要があります。

    Interactive "launch stack" button

  3. この CloudFormation テンプレートのデプロイが完了したら、[出力] セクションに移動し、apiGatewayInvokeUrl 値を書き留めます。次の形式になります。

    https://q60a8f2j07.execute-api.us-east-1.amazonaws.com/TEST/ACPDemo?tenantId=123

  4. 上記で確認した apigatewayInvokeUrl を使用して、ウェブブラウザを開き、値をアドレスバーに貼り付けます。これにより、テナント「123」による使用をシミュレートするサンプルサーバーレスアプリケーションが実行されます。次に、ブラウザのアドレスバーで tenantiD= の後ろの値を変更して、tenantiD=10 や tenantiD=20 など値を変更してアプリケーションを実行して、複数のテナントの使用をシュミレーションします。ブラウザでこのエンドポイントを呼び出すと、Lambda 関数が実行され、テナント情報を含む AWS X-Ray トレースアノテーションが生成されます。さらに、JMeter などのユーティリティを使用して、このサンプルサーバーレスアプリケーションを呼び出す数百または数千のテナントの使用をシュミレーションできます。

注意: このサーバーレスアプリケーションは、テナントの使用量を追跡するために使用できるいくつかのアプローチの1つです。AWS Application Cost Profiler では、テナント使用量レポートは CSV ファイル形式のみである必要があり、この例における最終的な結果になります。前述のように、テナント使用量の CSV レポートは、アプリケーションのアーキテクチャや現在のテナントモデルに応じて、さまざまな方法で生成することができます。
テナント ID がサンプルサーバーレスアプリケーションの Lambda CloudWatch ログで利用できるようになったので、次はテナントの使用量データファイルを生成します。このファイルは、次に示す形式で構造化する必要があります。Application Cost Profiler がサポートしているのは、「.csv」、「.csv.gz」、「.csv.gzip」などのファイル名を持つ CSV ファイルのみです。

表 1: テナントの使用量データ要素
フィールド 説明
ApplicationId 使用しているシステム内のアプリケーションまたは製品を識別します。テナントメタデータのスコープを定義します。
TenantId 指定されたリソースを消費するテナントのシステム内の識別子です。Application Cost Profiler は、ApplicationId の中でこのレベルまで集約します。
TenantDesc (任意の値)追加レポート用のテナントに関する追加データ。
UsageAccountId リソースが実行されるアカウント(組織内のアカウントの場合は重要)。
StartTime エポックからのタイムスタンプ(ミリ秒単位)、UTC。指定されたテナントの使用期間の開始時刻を示します。
EndTime エポックからのタイムスタンプ(ミリ秒単位)、UTC。指定されたテナントによる使用期間の終了時刻を示します。
ResourceId 使用中のリソースのAmazon Resource Name(ARN)。
Name (任意)ResourceId を指定する代わりに、Name リソースタグを指定して、コストをリソースセットに関連付けます(フィールドには、Name タグに使用する値を含める必要があります)。リソースタグは、コストおよび使用量レポートの一部として有効になります。リソースタグの詳細については、 「コストと使用量レポートユーザーガイド」の「リソースタグの詳細」を参照してください。

applicationID、tenantID、tenantDesc、usageAccountID、startTime、endTime、ResourceID は AWS Application Cost Profiler が予約したキーワードであり、Nameタグ名として使用することはできません。
この例では、レポート対象の Lambda 関数の CloudWatch Logsから情報を処理して読み取ることで、上記の形式に従ってテナント使用量データを生成します。インストルメンテーションインフラストラクチャでは、以下の AWS テクノロジー/リソースを使用します。

  1. X-Ray トレース: これは、例のLambdaのテナント利用データファイルを生成するために必要な情報を提供するものです。その他のテレメトリ、オブザーバビリティ、ロギングのソリューションも使用可能です。
  2. Amazon CloudWatch Events: これにより、インストルメンテーション Lambda が 1 時間ごとにトリガーされ、1 時間ごとのテナント使用量データが AWS Application Cost Profiler に送信されます。
  3. Lambda 関数: CloudWatch Logsから情報を抽出し、テナントの使用量データファイルを生成し、上記でデプロイされた CloudFormation テンプレートで作成された S3 バケットにファイルをアップロードします。
  4. Identity and Access Management (IAM): Lambda 関数 が S3 バケットに書き込むには、適切な IAM ポリシーが設定されている必要があります。
  5. CloudFormation テンプレート: CloudFormation テンプレートを利用して、サンプル関数を簡単にデプロイし、それをトリガーして時間ごとのテナント使用量データを生成できるようにします。

サンプルテナント使用量の生成プログラムをデプロイする

  1. AWS コンソールにログインします。
  2. 下の [Launch Stack] ボタンをクリックして、三つ目の CloudFormation スタックを起動します。このスタックでは、X-Ray を利用したテナント使用量を生成するプログラムの一例 (acp_xrayTracesGenerator) を設置および設定します。このスタックは、以前に起動した CloudFormation スタックと同じリージョンで起動する必要があります。「lambdafunctioname」の環境変数は「acp_DynamoDBSourceDataGenerator」にプリセットされています。これは、以前の CloudFormation テンプレートでデプロイされたLambda 関数の名前です。これは、対応する X-Rayトレースの分析のために使われるLambda関数です。

Interactive "launch stack" button

上記のスタックがデプロイされ、レポート対象の元の AWS Lambda 関数が過去 1 時間に実行されたと仮定すると、ACP_DynamoDBSourceDataGenerator 関数が上記で定義されたスケジュールで実行されるたびに、ACP-{REGION}-{ACCOUNT_ID} バケットに「imports」というプレフィックスで新しいファイルが作成されていることが確認できます。このファイルには、次のような csv 形式のテナント使用量データが含まれます。

ApplicationId TenantId TenantDesc UsageAccountId StartTime EndTime ResourceId
DynamoDBSourceDataGenerator Tenant3 Generating data for ACP 123456789 1625868822240.0100 1625868822306.7000 arn:aws:lambda:us-east-1:123456789:function:ACP_DynamoDBSourceDataGenerator
DynamoDBSourceDataGenerator Tenant3 Generating data for ACP 123456789 1625868822248.0000 1625868822305.0000 arn:aws:dynamodb:us-east-1:123456789:table/acpdemo
DynamoDBSourceDataGenerator Tenant2 Generating data for ACP 123456789 1625868818021.0100 1625868818055.0900 arn:aws:lambda:us-east-1:123456789:function:ACP_DynamoDBSourceDataGenerator
DynamoDBSourceDataGenerator Tenant2 Generating data for ACP 123456789 1625868818022.0000 1625868818053.0000 arn:aws:dynamodb:us-east-1:123456789:table/acpdemo
DynamoDBSourceDataGenerator Tenant4 Generating data for ACP 123456789 1625868826495.3300 1625868826553.9600 arn:aws:lambda:us-east-1:123456789:function:ACP_DynamoDBSourceDataGenerator
DynamoDBSourceDataGenerator Tenant4 Generating data for ACP 123456789 1625868826507.0000 1625868826552.0000 arn:aws:dynamodb:us-east-1:123456789:table/acpdemo
DynamoDBSourceDataGenerator Tenant1 Generating data for ACP 123456789 1625868813094.5400 1625868813203.6500 arn:aws:lambda:us-east-1:123456789:function:ACP_DynamoDBSourceDataGenerator
DynamoDBSourceDataGenerator Tenant1 Generating data for ACP 123456789 1625868813115.0000 1625868813201.0000 arn:aws:dynamodb:us-east-1:123456789:table/acpdemo

また、Step Functionsステートマシンは、ACP_SubmitTenantdata Lambda 関数を起動し、AWS Application Cost Profiler に通知して、日次あるいは月次レポート生成サイクル中に生成されたファイルを処理します。

Application Cost Profiler データ

Application Cost Profiler レポートの時間間隔が日単位として設定されている場合、生成されたレポートが S3 に表示されるまでに最大で 24 時間かかることがあります。上記の CloudFormation セットアップを利用して、Application Cost Profiler データはs3://acp-{REGION}-{ACCOUNT_ID}/reports/YYYY/MM/DD/part-*.csv.gz に配置されます。Application Cost Profiler データが利用可能になると、次の形式で Amazon EventBridge イベントが生成されます。

{
    "version": "0",
    "id": "01234567-EXAMPLE",
    "detail-type": "Application Cost Profiler Report Generated",
    "source": "aws.application-cost-profiler",
    "account": "123456789012",
    "time": "2021-03-31T10:23:43Z",
    "region": "us-east-1",
    "resources": [],
    "detail": {
        "message": "Application Cost Profiler report delivered in bucket: acp-us-east-1-123456789, key: reports/2020/05/01/ part-c744af14-57bd-4c51-b1d4-badc155ef7ef-c000.csv.gz"
    }
}

Application Cost Profiler によって生成されたテナントコストの csv ファイルには、次のデータがあります。

列名 説明
PayerAccountId 組織内の管理アカウントID、またはアカウントがAWS Organizations に含まれていない場合はアカウントIDです。
UsageAccountId 使用量を示すアカウントのアカウントIDです。
LineItemType レコードのタイプ。常に Usage になります。
UsageStartTime エポックからのタイムスタンプ(ミリ秒単位)(UTC)。指定されたテナントによる使用期間の開始時刻を示します。
UsageEndTime エポックからのタイムスタンプ(ミリ秒単位)(UTC)。指定されたテナントによる使用期間の終了時刻を示します。
ApplicationIdentifier Application Cost Profiler に送信された使用量データで指定された ApplicationId
TenantIdentifier Application Cost Profilerに送信された使用量データで指定されたTenantId。使用データに記録がないデータは無属性に収集されます。
TenantDescription Application Cost Profiler に送信された使用量データで指定された TenantDesc。
ProductCode 課金対象のAWS製品(例:AmazonEC2)。
UsageType 課金される利用方法の種類(例:BoxUsage:c5.large)。
Operation 課金対象となる操作(例:RunInstances)。
ResourceId 課金対象となるリソースのリソース ID または Amazon Resource Name(ARN)。
ScaleFactor リソースの割り当てが 1 時間を超えている場合 (たとえば、レポートされた使用量データが 1 時間ではなく 2 時間である場合)、合計が実際の請求金額 (この場合は 0.5) と等しくなるように尺度係数が適用されます。この列は、その時間の特定のリソースに使用された縮尺係数をレポートします。スケール係数は、常にゼロ (0) より大きく、1 以下です。
TenantAttributionPercent 指定したテナントに起因する使用量の割合(0~1の間)。
UsageAmount 指定されたテナントに関連する使用量です。
CurrencyCode レートとコストが表示される通貨(例:USD)。
Rate 単位あたりの使用量の請求レート。
TenantCost 指定されたテナントに対するそのリソースの総コスト。
Region AWSリソースのリージョンです。
Name コスト・使用量レポート上、またはリソースの使用量データを通じてリソースにリソースタグを作成した場合、Name タグがここに表示されます。リソースタグの詳細については、Cost and Usage Report User Guide の Resource tags details を参照してください。

実際の Application Cost Profiler レポートの CSV 出力例を以下に示します。

PayerAccountId UsageAccountId LineItemType UsageStartTime UsageEndTime ApplicationIdentifier TenantIdentifier TenantDescription ProductCode UsageType Operation ResourceId ScaleFactor TenantAttributionPercent UsageAmount CurrencyCode Rate TenantCost Region
123456789 123456789 Usage 2021-07-08T17:00:00.000Z 2021-07-08T18:00:00.000Z DynamoDBSourceDataGenerator 101 Generating data for ACP AWSLambda Request Invoke arn:aws:lambda:us-east-1:123456789:function:ACP_DynamoDBSourceDataGenerator 1 0.06959188 0.55673504 USD 0 0 us-east-1
123456789 123456789 Usage 2021-07-08T17:00:00.000Z 2021-07-08T18:00:00.000Z DynamoDBSourceDataGenerator 101 Generating data for ACP AWSLambda Lambda-GB-Second Invoke arn:aws:lambda:us-east-1:123456789:function:ACP_DynamoDBSourceDataGenerator 1 0.06959188 0.035004716 USD 0 0 us-east-1
123456789 123456789 Usage 2021-07-08T17:00:00.000Z 2021-07-08T18:00:00.000Z DynamoDBSourceDataGenerator 100 Generating data for ACP AWSLambda Request Invoke arn:aws:lambda:us-east-1:123456789:function:ACP_DynamoDBSourceDataGenerator 1 0.440249691 3.521997528 USD 0 0 us-east-1
123456789 123456789 Usage 2021-07-08T17:00:00.000Z 2021-07-08T18:00:00.000Z DynamoDBSourceDataGenerator 100 Generating data for ACP AWSLambda Lambda-GB-Second Invoke arn:aws:lambda:us-east-1:123456789:function:ACP_DynamoDBSourceDataGenerator 1 0.440249691 0.221445595 USD 0 0 us-east-1
123456789 123456789 Usage 2021-07-08T17:00:00.000Z 2021-07-08T18:00:00.000Z DynamoDBSourceDataGenerator 101 Generating data for ACP AmazonDynamoDB WriteRequestUnits PayPerRequestThroughput arn:aws:dynamodb:us-east-1:123456789:table/acpdemo 1 0.076719577 0.613756614 USD 0.00000125 7.67E-07 us-east-1
123456789 123456789 Usage 2021-07-08T17:00:00.000Z 2021-07-08T18:00:00.000Z DynamoDBSourceDataGenerator 100 Generating data for ACP AmazonDynamoDB WriteRequestUnits PayPerRequestThroughput arn:aws:dynamodb:us-east-1:123456789:table/acpdemo 1 0.439153439 3.513227513 USD 0.00000125 4.39E-06 us-east-1

この CSV ファイルは、Amazon Athena を介して直接クエリするか、この例のように Amazon Quicksight などの既存の分析およびレポートツールに統合できます。Parquet を使用しているお客様も、同じ解析を実行できます。

Example visualization of AWS Application Cost Profiler report data

Amazon QuickSight ダッシュボードのサンプル

まとめ

このウォークスルーでは、適切な権限を持つ宛先S3レポートバケットを含む新しい Application Cost Profiler レポート構成を設定しました。その後、サンプルの Lambda アプリケーションのテナント使用データを生成するプロセスを完了し、使用データを Application Cost Profiler にインポートして、結果レポートを受け取りました。

当社のサービスチームは、インストルメンテーションを容易にするために、さまざまなアーキテクチャパターンの参照実装ガイダンスを提供しています。また、専任のソリューションアーキテクトチームがインストルメンテーションをサポートし、オンボーディングを促進しています。オンボーディングのサポートが必要な場合は、aws-acp@amazon.com までご連絡いただくか、お客様のアカウントチームにお問い合わせください。

テナントあたりのコストの価値と重要性については、ブログ記事「Calculating Tenant Costs in a SaaS Environment」や、AWS LambdaManagement Toolsで、この情報を取得するための基本的なアプローチと課題について説明しています。

翻訳はソリューションアーキテクト福本が担当しました。原文はこちらです。