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 DynamoDB、 Amazon Simple Notification Service (SNS)、 Amazon Simple Queue Service (SQS) などのサービスのテナント使用量メタデータを生成できます。
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 バケットです。
前提条件
このウォークスルーでは、次のものが必要です。
- AWS アカウント
- コンソールアクセスと管理者権限を持つ AWS IAM ユーザー
- Cost Explorerの有効化
S3 バケットとレポートの設定をセットアップする
- AWS コンソールにログインします。
- Cost Explorerが有効になっていることを確認します (こちらは重要です。AWS Application Cost Profiler は、Cost Explorer が有効になっていないとテナントの使用量データを処理しないためです)。下の [Launch Stack] ボタンをクリックすると、最初の CloudFormation スタックが起動し、適切な Application Cost Profiler のパーミッションとサーバー側の暗号化設定を持つS3バケット、AWS Event Bridge ルール、そしてオプションでサブスクライブできる AWS Application Cost Profiler イベント用の SNS トピック が設置され、設定されます。
- CloudFormation スタックの起動が完了したら、us-east-1 リージョンでコンソールの検索機能を使用して「AWS Application Cost Profiler」ページに移動します。
- AWS Application Cost Profiler のダッシュボードで、[Get started now] をクリックします。
- 新しいレポート設定をセットアップします。
-
- Report Name:これはユーザーが定義するもので、保存後は変更できません。
- Report Description— レポート設定のユーザー定義の説明です (任意)。
- 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 スタックの「リソース」セクションにも記載されています。
- S3 prefix — これは、AWS Application Cost Profiler がレポートを配信する上で使用される S3 バケットのプレフィックスです。上記の CloudFormation テンプレートにデプロイされた S3 バケットでは、AWS Application Cost Profiler による「reports」プレフィックスへの書き込みアクセス許可を有効にしました。したがって、ここに「reports」と入力します。
- Time Frequency:レポートの生成を [毎日]、[毎月]、または [両方] のどちらから選択します。
- Report Output Format — Amazon S3 バケット内に作成されるファイルタイプを選択します。[CSV] を選択した場合、Application Cost Profilerは、レポート用に gzip 圧縮のカンマ区切り値テキストファイルを作成します。[Parquet] を選択すると、レポート用の Parquet ファイルが生成されます。
- [Configure] ボタンをクリックします。Application Cost Profiler は、上記で定義されたバケットの存在と、上記で定義されたプレフィックスに対するサービスの書き込み権限を確認します。成功すると、確認メッセージが表示されます。
- 「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 を利用した基本的なサーバーレスアプリケーションをデプロイします。
サンプルのサーバーレスアプリケーションをデプロイする
- AWS コンソールにログインします。
- 下の [Launch Stack] ボタンをクリックして、サンプルのサーバーレスアプリケーションをインストールおよび設定する 2 番目の CloudFormation スタックを起動します。このスタックは、以前に起動した CloudFormation スタックと同じリージョンで起動する必要があります。
- この CloudFormation テンプレートのデプロイが完了したら、[出力] セクションに移動し、apiGatewayInvokeUrl 値を書き留めます。次の形式になります。
https://q60a8f2j07.execute-api.us-east-1.amazonaws.com/TEST/ACPDemo?tenantId=123
- 上記で確認した 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 ファイルのみです。
フィールド | 説明 |
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 テクノロジー/リソースを使用します。
- X-Ray トレース: これは、例のLambdaのテナント利用データファイルを生成するために必要な情報を提供するものです。その他のテレメトリ、オブザーバビリティ、ロギングのソリューションも使用可能です。
- Amazon CloudWatch Events: これにより、インストルメンテーション Lambda が 1 時間ごとにトリガーされ、1 時間ごとのテナント使用量データが AWS Application Cost Profiler に送信されます。
- Lambda 関数: CloudWatch Logsから情報を抽出し、テナントの使用量データファイルを生成し、上記でデプロイされた CloudFormation テンプレートで作成された S3 バケットにファイルをアップロードします。
- Identity and Access Management (IAM): Lambda 関数 が S3 バケットに書き込むには、適切な IAM ポリシーが設定されている必要があります。
- CloudFormation テンプレート: CloudFormation テンプレートを利用して、サンプル関数を簡単にデプロイし、それをトリガーして時間ごとのテナント使用量データを生成できるようにします。
サンプルテナント使用量の生成プログラムをデプロイする
- AWS コンソールにログインします。
- 下の [Launch Stack] ボタンをクリックして、三つ目の CloudFormation スタックを起動します。このスタックでは、X-Ray を利用したテナント使用量を生成するプログラムの一例 (acp_xrayTracesGenerator) を設置および設定します。このスタックは、以前に起動した CloudFormation スタックと同じリージョンで起動する必要があります。「lambdafunctioname」の環境変数は「acp_DynamoDBSourceDataGenerator」にプリセットされています。これは、以前の CloudFormation テンプレートでデプロイされたLambda 関数の名前です。これは、対応する X-Rayトレースの分析のために使われるLambda関数です。
上記のスタックがデプロイされ、レポート対象の元の AWS Lambda 関数が過去 1 時間に実行されたと仮定すると、ACP_DynamoDBSourceDataGenerator 関数が上記で定義されたスケジュールで実行されるたびに、ACP-{REGION}-{ACCOUNT_ID} バケットに「imports」というプレフィックスで新しいファイルが作成されていることが確認できます。このファイルには、次のような csv 形式のテナント使用量データが含まれます。
また、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 イベントが生成されます。
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 出力例を以下に示します。
この CSV ファイルは、Amazon Athena を介して直接クエリするか、この例のように Amazon Quicksight などの既存の分析およびレポートツールに統合できます。Parquet を使用しているお客様も、同じ解析を実行できます。
まとめ
このウォークスルーでは、適切な権限を持つ宛先S3レポートバケットを含む新しい Application Cost Profiler レポート構成を設定しました。その後、サンプルの Lambda アプリケーションのテナント使用データを生成するプロセスを完了し、使用データを Application Cost Profiler にインポートして、結果レポートを受け取りました。
当社のサービスチームは、インストルメンテーションを容易にするために、さまざまなアーキテクチャパターンの参照実装ガイダンスを提供しています。また、専任のソリューションアーキテクトチームがインストルメンテーションをサポートし、オンボーディングを促進しています。オンボーディングのサポートが必要な場合は、aws-acp@amazon.com までご連絡いただくか、お客様のアカウントチームにお問い合わせください。
テナントあたりのコストの価値と重要性については、ブログ記事「Calculating Tenant Costs in a SaaS Environment」や、AWS LambdaManagement Toolsで、この情報を取得するための基本的なアプローチと課題について説明しています。
翻訳はソリューションアーキテクト福本が担当しました。原文はこちらです。