Amazon Web Services ブログ

AWS でのコスト追跡のために一貫したアプリケーションレベルのタグ付けを実現する

この記事は Achieve Consistent Application-level Tagging for Cost Tracking in AWS (記事公開日: 2022 年 9 月 16 日) を翻訳したものです。

はじめに

市場の需要により組織が事業を変革したり成長したりするにつれて、組織は AWS のフットプリントと関連コストを把握するための適切なツールの実装に苦労することがよくあります。大きな AWS のフットプリントには、複数の AWS アカウント、さまざまなインフラストラクチャ環境、および特定のプロジェクトのアプリケーション環境が含まれる場合があります。個別のビルド・デプロイパイプラインと頻繁なリリースサイクルを備えたマイクロサービスアーキテクチャを使用してアプリケーションを構築すると、このフットプリントの複雑さは桁違いに大きくなります。

事業の成長に遅れずについていき、かつ大きな AWS のフットプリントを効果的に管理するために、以下のアプローチが役立ちます。

  • インフラストラクチャとリソースのプロビジョニングの自動化
  • 標準化されたコスト追跡

1 つ目は自動化で、(Infractracture-as-Code ないし IaC といった) コードを使用して、組織が自分たちのインフラストラクチャを定義するようになることです。次の段階の成熟度は、インフラストラクチャとアプリケーションのリリースライフサイクルを定義することです。これは、継続的インテグレーション (CI: 継続的にコードをビルドしテストすること) と継続的デリバリーおよび / または継続的デプロイメント (CD) (自動化) のプロセスで、プロダクトのリリースサイクルにアジリティをもたらします。統制と標準を維持しながら CI/CD 導入のスピードを速めるために、プラットフォームエンジニアリングチームは標準化されたインフラストラクチャをデプロイするためのセルフサービスの仕組みを、アプリケーションチーム (ソフトウェア開発者) に提供できます。

この記事では、組織全体の上述の自動化と標準化に AWS Proton がどのように役立つかを見ていきます。

2 つ目はコスト追跡で、チームが AWS リソースにどのくらいコストをかけているかを把握するために、組織レベルの可視性と一貫したコストのビューが重要です。全てのリソースはコスト追跡が必要で、追跡の仕組みはリソースの変更に即応する必要があります。これは、マイクロサービスとさまざまな環境の急増時に大きな課題となります。アプリケーションは、(Amazon ECS タスクや AWS Lambda 関数や Kubernetes の Deployment といった) 複数のリソースを持つ複数のマイクロサービスで構成されます。またそれぞれのマイクロサービスは、 (開発 / テスト / ステージ / 本番といった) さまざまな環境で独自のリリースサイクル (CI/CD) があります。

マイクロサービスで構成されたモダンアプリケーションのコストを効果的に追跡するには、どうすればよいでしょうか?

コスト配分のためのタグの使用

AWS Billing and Cost Management は、アカウントレベルでの詳細な請求情報を提供します。Billing コンソールのページから、アカウント全体の AWS サービスレベルのコストの内訳を確認できます。しかし初期状態では、マイクロサービスレベルの詳細度の可視性は提供しません。このレベルの詳細度を実現するには、どうすればよいでしょうか?

AWS では、コスト追跡を実現するために、AWS コスト配分タグを提供しています。タグは、作成されたリソースに割り当てられるキー:値のペアです。これらのタグは、組織のワークロードの分類および追跡方法に基づいて、組織の管理者によって設定されます。次のスクリーンショットは、「コストセンター」「環境」を表すタグを使用して追跡する方法を示しています。

ソリューションの概要

一度これらのタグがアクティブ化されリソースに適用されると、特定のタグを持つ全てのリソースはクエリできるようになり、(特定のコストセンター CostCenter:78925 または環境 userStack:Production といった) 詳細なビューを提供することで、コストを一元管理できるようになります。このように現在利用可能な仕組みはありますが、これらのタグはどのように適用され、可視性を高め実用的な洞察を得るためにどのように使用されているのでしょうか?

タグ付けとタグの効果的な使用に関する課題

全てのリソースにタグを適用することは素晴らしいソリューションですが、タグ付けに関する課題は何でしょうか?

  • まず、リソースの追加、変更、削除時に、コストに関連する全てのリソースにタグを付ける必要があります。(個々のリソースのタグは、IaC を使用してコードに追加できます。)
  • 次に、管理者が (開発 / テスト / ステージ / 本番といった) 環境レベルとアプリケーションレベル (および [マイクロサービスのような] サービスレベル) のリソースを確認できる詳細さでタグを設定する必要があります。
  • 3 つめに、アプリケーションやマイクロサービスの急増時、コンテナ化されたワークロードのマイクロサービスレベルでの詳細度のタグ付けは困難になります。マイクロサービスのバージョンを維持すると、この問題はさらに悪化します。
  • 最後に、もし各アプリケーションチームが、アプリケーションで使用しているリソースを分類するために異なるタグの組み合わせを使用すると、組織レベルでコストを一貫して把握することはできません。タグ付けは、個別のアプリケーションチームではなく、組織レベルの一元的なチームで管理することが必要なことは明らかです。

上記で列挙した理由は、大規模で急速に成長している組織でタグを一貫性をもって適用し維持することが容易ではないことを明確に示しています。効果的なコスト追跡のためには、タグをリソースに一律にきめ細かく (つまり AWS アカウントレベルや、構築した環境や、アプリケーションまたはマイクロサービスのレベルで) 適用する自動的な方法が必要です。これは、どうやって実現できるでしょうか?

ウォークスルー

AWS Proton

AWS Proton は、コンテナおよびサーバーレスのアプリケーションをデリバリーするマネージドサービスで、アプリケーションチームが利用できる一貫したインフラストラクチャとアプリケーションテンプレートを、プラットフォームチームが作成を自動化するのに役立ちます。AWS Proton は、AWS CloudFormation で作成されたリソースに自動的にタグ付けし、一貫した Terraform のタグ付けをサポートします。結果として AWS Proton は、一貫したリソース定義とコスト追跡を実現できる一元的な場所になります。

AWS Proton では、環境テンプレートとサービステンプレートを用いてこれを実現しています。

  • 環境テンプレート: バージョン管理とインフラストラクチャの複製を容易にするための、(Amazon VPC、Amazon ECS、AWS ParallelCluster といった) 共通のインフラストラクチャリソースを作成します。
  • サービステンプレート: アプリケーション開発者に開発とテストに必要なセルフサービスの機能を提供する、(AWS Fargate や AWS Lambda といった) アプリケーション固有のインフラストラクチャリソースを作成します。

上記のテンプレートは、AWS Proton によってバージョン管理されます。これにより、動的な組織でのインフラストラクチャとアプリケーションの管理と変更の維持を、一元的な場所から行うことが容易になります。

AWS Proton は、AWS CloudFormation および HashiCorp Configuration Language (Terraform) をサポートしています。上記の各 IaC 言語で作成されたテンプレートの管理方法には違いがあります。AWS 管理型プロビジョニング (CloudFormation) は AWS マネジメントコンソールと統合されたエクスペリエンスを提供し、自己管理型プロビジョニング (Terraform を使用する HCL) はソースコードリポジトリへのプルリクエストを使用します。

AWS 管理型ないし自己管理型のプロビジョニングの仕組みについては、プロビジョニング方法のドキュメントを参照してください。(詳細については、AWS Proton 自己管理型プロビジョニングのブログを参照してください。)

これは、一貫したタグ付けに関する全ての課題にどう役立つでしょうか?

AWS Proton による自動的なタグ付け

AWS Proton が使用する主な仕組みは、インフラストラクチャとアプリケーションのテンプレート定義です。テンプレート作成時、タグを簡単に挿入できます。AWS Proton は、プラットフォームチームとアプリケーションチーム両方のインフラストラクチャを作成するための一元的な場所として機能するため、タグ付けの一貫性は自動的に保たれます。これにより、インフラストラクチャ環境および各サービスに付けられたコストタグに基づいてリソースを一貫して可視化できます。

以下は、(VPC や ECS クラスターといった) インフラストラクチャレベルのタグです。

以下は、(フロントエンドサービスといった) アプリケーションおよびサービスレベルのタグです。

: AWS 管理型プロビジョニング (CloudFormation テンプレート) では、タグは AWS Proton によって自動的に追加されます。自己管理型プロビジョニング (Terraform テンプレート) では、タグは Terraform の default_tags 機能を使用して実現できます。(default_tags についてはこちらをご覧ください。) AWS Proton テンプレートに proton_tags 変数を定義し、またこの proton_tags を Terraform の AWS Provider の default_tags に含める必要があります。

AWS Cost Explorer でのタグベースの可視化

前述の通り、AWS Cost Explorer (および他のサードパーティツール) は、AWS Proton によって自動的に挿入されたコストタグを使用して、(例えば環境やサービスといったレベルで) コストをきめ細かく可視化できます。次の図は、AWS Cost Explore でこれをどう実現できるかを示しています。

  1. 右側のフィルターセクションでタグを選択します。
  2. proton:service タグを選択します。
  3. (arn:aws:proton:us-west-2:271661399851:service/frontend のように) 表示したいサービス名を選択します。

このフィルターは、service/frontend で使用される全てのアプリケーションリソースに適用されます。次のレポートは、AWS Cost Explorer からのサンプル出力の様子を示しています。

AWS Proton テンプレートライブラリの記事では、AWS CloudFormation と Terraform の両方のサンプルテンプレートを提供しています。加えて、AWS Proton 環境テンプレートに対応するサンプルアプリケーションも含まれています。これにより、AWS Proton を簡単に使い始めることができます。さらに詳しく知りたい場合は、AWS Proton as a provisioning mechanism for Amazon EKS clustersAWS Proton Sample Multi Service deployment を参照してください。

Terraform に関する追加考慮事項: 自己管理型プロビジョニング

前述の通り、Terraform ベースのテンプレートのリソースへの AWS Proton のタグ付けは、Terraform の default_tags 機能を使用して実現できます。(Default Tags in the Terraform AWS Provider を参照してください。) AWS Proton は、Terraform の proton_tags 変数を使用します。同変数は、AWS Proton テンプレート内で定義し、Terraform の AWS Provider 内に default_tags として含める必要があります。さらに詳しく知りたい場合は、こちらのタグ伝播の例を参照してください。次の例は、Terraform を使用して自動的なタグ付けを実現する方法を示しています。

Terrafrom の AWS Provider (default_tags の設定)

# AWS Provider を設定する
provider "aws" {
  region = var.aws_region
  default_tags {
    tags = var.proton_tags # proton_tags 内の全てのタグは、default_tags として含まれます
  }
}

AWS Proton は、proton_tags 変数内に必要なタグを含めて、HashiCorp Configuration Language (HCL) ファイルを書き出します。また Terraform の AWS Provider は、デフォルトで作成された全てのリソースにタグを含めるよう更新されます。

{
  "proton_tags" : {
    "proton:account" : "1234567890",
    "proton:template" : "arn:aws:proton:us-east-1:1234567890:environment-template/ecs-ec2-env",
    "proton:environment" : "arn:aws:proton:us-east-1:1234567890:environment/dev"
  }
}

もう一つ考慮すべきことは、GitHub Actions を使用した Terraform のプロビジョニングの自動化です。AWS のサンプル GitHub リポジトリは、AWS Proton が Pull Request を送信した際に Terraform のインフラストラクチャのプロビジョニングプロセスを自動化するために使用できる GitHub Actions のサンプルリポジトリを提供しています。

前提条件

まず、AWS アカウントを持っていること、サービスの定義に使用できる CloudFormation または Terraform の IaC ファイルが少なくとも 1 つあることを確認してから、AWS Proton を使い始めてください。

クリーンアップ

このタグ付けのプロセスを試し終わったら、後でコストがかからないように、サンプルリソースを忘れずに削除してください。

まとめ

この記事では、AWS Proton を使用して、モダンアプリケーション開発方法論に基づいてアプリケーションを開発する組織で、効果的にリソースを追跡、管理し、コストを追跡する方法を紹介しました。AWS Proton の自動的なタグ付け機能の使用で組織は、一貫したインフラストラクチャとアプリケーションレベルのタグを適用でき、(マイクロサービスおよびサーバーレスアプリケーション毎の) 環境アプリケーション別のコスト使用状況を可視化でき、そして AWS Cost Explorer などのツールを使用して実用的な洞察を得ることができます。

翻訳はプロフェッショナルサービスの伊藤が担当しました。原文はこちらです。