Help us understand the problem. What is going on with this article?

新しめの設定をいれた AWS Billing and Cost Management 総まとめ

1. はじめに

  • 私が現在行っている AWS Billing and Cost Management 設定がかなりレガシーなものになっているので、新しめの設定へ移行する。
  • AWS Billing and Cost Management 設定やること/やらないことリストをアップデートする。
  • 設定を CloudFormation, Terraform 化できるところは作成する。

2. やること/やらないことリスト

2.1. やることリスト

  • アカウントの請求情報の表示を IAM ユーザーに許可

    • 手動で設定する。(要ルートユーザー)
  • Cost Explorer 有効化と設定

    • 手動で設定する。
  • コスト配分タグをアクティブ化

    • 手動で設定する。
  • 電子メールで PDF 版請求書を受け取る設定

    • 手動で設定する。
  • Budgets 作成

    • 従来の「請求書アラート」設定は止めて、こちらを使う。
    • Terraform で設定する。
  • Cost & Usage Reports 作成

    • 従来の「AWSの請求明細レポート(DetailedBillingReport)」を止めて、こちらを使う。
    • Terraform で設定する。
  • Billing管理専用IAMユーザ作成

    • CloudFormation で設定する。

2.2. やらないことリスト

3. やることリストの設定

3.1. アカウントの請求情報の表示を IAM ユーザーに許可

3.1.1. 目的

  • AWSアカウント開通直後のデフォルト設定では、請求情報へアクセスすることができるのはルートユーザーのみとなっている。
  • ルートユーザーはAWSアカウント開通時だけ使用するユーザーであり、IAMドキュメント では、日常の作業で AWS ルートユーザーを使用しないことを推奨している(サポートプラン変更など、ルートユーザーしか設定できない場合は除く)。
  • IAMユーザーにも請求書情報へのアクセスを許可するために、この設定を行う。
  • ただし、この設定だけでは IAMユーザーは請求書情報へアクセスすることはできない。請求書情報へアクセスしたい IAMユーザー(例えば、AWS管理者ユーザー、経理部門ユーザー、Terraformユーザーなど)に Billing ポリシーをアタッチする必要がある。
  • Billing のすべての権限を許可したい場合は、IAMポリシーの「AWS管理のジョブ機能」の「Billing」ポリシーをアタッチする。

3.1.2. 設定

(1) ルートユーザーでサインインする

(2) マイアカウント

20200123-01.png

(3) IAM ユーザー/ロールによる請求情報へのアクセス の箇所までスクロール
 (ルートユーザー以外がサインインしたときには表示されない)

「IAM アクセスのアクティブ化」にチェックを入れて、更新

20200123-02.png

(4) 確認

「IAM ユーザー/ロールによる請求情報へのアクセスは有効になっています。」
と表示されていることを確認

20200123-03.png

(5) 設定が終わったら、速やかにルートユーザーをサインアウトする

3.2. Cost Explorer 有効と設定

3.2.1. 目的

3.2.2. 設定

(1) 「Billing」ポリシーをアタッチしたIAMユーザーでサインインする

(2) 「請求情報とコスト管理ダッシュボード」(Billing) コンソールへ

20200123-04.png

(3) Cost Esplorer へ

20200123-05.png

(4) コストエクスプローラーを有効化 する

※ すでに有効化してあるので、画面キャプチャは取れず・・
※ Cost Explorer を有効にした後、コストと使用状況のデータが追加されるまで、最大 24 時間かかることがある。

(5) コストエクスプローラーを起動 する

20200123-06.png

(6) 設定画面へ

20200123-07.png

(7) 「時間単位とリソースレベルのデータ」と「Amazon EC2 リソースの推奨事項を受け取る」にチェックを入れる

20200123-08.png

(8) リザーブドインスタンスの有効期限切れアラート設定を行う場合

※ 現時点では、メール通知のみ。私はSlackへ通知したいので、自作した監視設定を入れている。

20200123-09.png
20200123-10.png
20200123-11.png

3.3. コスト配分タグをアクティブ化

3.3.1. 目的

  • Cost Explorer で効率的なコスト管理を行う。

3.3.2. 設定

(1) 「Billing」ポリシーをアタッチしたIAMユーザーでサインインする

(2) 「請求情報とコスト管理ダッシュボード」(Billing) コンソールへ

20200123-04.png

(3) コスト配分タグ へ

20200123-27.png

(4) 有効化 を押下で有効にする

20200123-28.png

(5) ユーザー定義のコスト配分タグ設定

コスト配分タグに設定したいタグにチェックを入れて、有効化 を押下する。
※ 設定したタグが Cost Explorer に表示されるまで最大 3 日かかることがある。

20200123-29.png

3.4. 電子メールで PDF 版請求書を受け取る設定

3.4.1. 目的

  • 毎月3日か4日くらいに、前月分の請求書のPDFファイルを指定したメールアドレスへ送信する。

3.4.2. 設定

(1) 「Billing」ポリシーをアタッチしたIAMユーザーでサインインする

(2) 「請求情報とコスト管理ダッシュボード」(Billing) コンソールへ

20200123-04.png

(3) Billing の設定 へ

20200123-17.png

(4) 電子メールで PDF 版請求書を受け取る にチェックをいれて、設定を保存する

20200123-30.png

3.5. Budgets 設定

3.5.1. 目的

  • 予算の管理を行う。

  • 予算がアラートの閾値を超えた場合に通知(Eメール or SNSトピック)する。

  • 実際のコストがアラートの閾値を超えた場合に通知(Eメール or SNSトピック)する。

  • 従来の「請求書アラート」設定よりもきめ細かいアラート設定ができる。

3.5.2. Budgets 設定

※ ここでは、1ヶ月の実際のコストが閾値を超えた場合に通知する設定を行う。
※ 通知を SNS トピックで行う場合は、事前に SNS トピックを作成しておく。

(1) 「Billing」ポリシーをアタッチしたIAMユーザーでサインインする

(2) 「請求情報とコスト管理ダッシュボード」(Billing) コンソールへ

20200123-04.png

(3) Budgets へ

20200123-12.png

(4) 「Create a budget」へ}

20200123-13.png

(5) 「コスト予算」へ

20200123-14.png

(6) 予算の設定

名前:〇〇〇
間隔:月別
定期予算
開始月:〇〇〇
予算額:〇〇〇

※ 設定例

20200123-15.png

(7) アラートの設定

次に基づいてアラートを送信:実際のコスト
アラートの閾値:〇〇〇 金額
SNS トピックのARN:〇〇〇

※ 設定例

20200123-16.png

3.5.3. 従来の「請求書アラート」設定は止める

(1) 「Billing」ポリシーをアタッチしたIAMユーザーでサインインする

(2) 「請求情報とコスト管理ダッシュボード」(Billing) コンソールへ

20200123-04.png

(3) Billing の設定 へ

20200123-17.png

(4) 請求書アラートは、一度オンにするとオフに戻すことはできない・・

20200123-26.png

(5) バージニア北部リージョンの CloudWatch にある 請求アラームを削除する

3.5.4. Terraform

  • 3.5.2. で行った設定の Terraform(0.11, 0.12対応)例
resource "aws_budgets_budget" "cost" {
  budget_type       = "COST"
  limit_amount      = "1000.0"
  limit_unit        = "USD"
  name              = "〇〇〇"
  time_period_start = "2020-01-01_00:00"
  time_unit         = "MONTHLY"
  cost_types {
    include_credit             = false
    include_discount           = true
    include_other_subscription = true
    include_recurring          = true
    include_refund             = false
    include_subscription       = true
    include_support            = true
    include_tax                = true
    include_upfront            = true
    use_amortized              = false
    use_blended                = false
  }
  notification {
    comparison_operator        = "GREATER_THAN"
    notification_type          = "ACTUAL"
    subscriber_email_addresses = []
    subscriber_sns_topic_arns = [
      "arn:aws:sns:us-east-1:〇〇〇:〇〇〇"
    ]
    threshold      = 800
    threshold_type = "ABSOLUTE_VALUE"
  }
}

3.6. Cost & Usage Reports 作成

3.6.1. 目的

一般的な目的

  • AWS のコストと使用状況レポートは、AWS 請求に関する詳細なデータセットを提供し、選択した Amazon Simple Storage Service (Amazon S3) バケットに配信されます。次の 2 つの方法のいずれかでコストと使用状況レポートを表示できます。

    • S3 バケットから .csv 形式のレポートファイルを表示またはダウンロードします。
    • レポートを Amazon Athena、Amazon QuickSight、または Amazon Redshift に取り込みます。
  • AWS のコストと使用状況レポートには、アカウントとその IAM ユーザーが使用した各サービスカテゴリの AWS 使用状況が、時間単位または日単位の明細項目として一覧表示されているほか、コスト配分のためにアクティブ化されたタグも表示されます。また、AWS のコストと使用状況レポートをカスタマイズし、使用状況のデータを日単位または時間単位で集計することも可能です。

  • Amazon Athena に統合するように、コストと使用状況レポートを 設定することも可能です。Amazon Athena と、AWS のコストと使用状況レポートとの統合が有効化されると、ユーザーのデータは、圧縮された Apache Parquet ファイルとしてユーザーが指定した Amazon S3 バケットに配信されます。AWS のコストと使用状況レポートは、Amazon Redshift に直接取り込むか、または、Amazon QuickSight にアップロードすることも出来ます。

  • 参考

個人的な目的

3.6.2. コストと使用状況レポート(CUR)設定

(1) 「Billing」ポリシーをアタッチしたIAMユーザーでサインインする

(2) 「請求情報とコスト管理ダッシュボード」(Billing) コンソールへ

20200123-04.png

(3) Cost & Usage Reports へ

20200123-19.png

(4) レポートの作成 へ

20200123-20.png

(5) レポートの明細項目

設定例

20200123-21.png

(6) 配信オプション

レポートを配信する S3 バケットを設定する

20200123-22.png

既存バケットを選択 あるいは 新規に作成する

20200123-23.png

ポリシーの確認にチェックを入れる

20200123-24.png

今回は、レポートデータ統合の有効化 はチェックしない

20200123-25.png

確認して完了

3.6.3. 請求明細レポート(DBR)を停止する

(1) 「Billing」ポリシーをアタッチしたIAMユーザーでサインインする

(2) 「請求情報とコスト管理ダッシュボード」(Billing) コンソールへ

20200123-04.png

(3) Billing の設定 へ

20200123-17.png

(4) 請求明細レポート(レガシー)設定を無効にする

20200123-18.png

「レガシー化した請求明細レポート機能を使って、AWS の料金に関する継続的なレポートを受け取る。」のチェックを外して、設定を保存する。
レポートを保存していたS3バケットは、消さずに残しておく。

3.6.4. Terraform

3.6.2. で行った設定の Terraform(0.11, 0.12対応)例

コストと使用状況レポートは、バージニア北部(us-east-1)リージョンに作成する必要がある。
S3バケットは 東京(ap-northeast-1)リージョンに作成する。
なので、Multiple Providers 機能を使う。

provider "aws" {
  shared_credentials_file = "credentials"
  profile                 = "terraform"
  region                  = "ap-northeast-1"
}
provider "aws" {
  shared_credentials_file = "credentials"
  profile                 = "terraform"
  alias                   = "virginia"
  region                  = "us-east-1"
}

アクセスキーID と シークレットアクセスキー を credentials ファイルに設定する。

[terraform]
aws_access_key_id = ********************
aws_secret_access_key = ****************************************

AWSアカウントIDを data "aws_caller_identity" "current" {} で取得している。
S3 バケット名は「cost-report-AWSアカウントID」としている。

data "aws_caller_identity" "current" {
}
data "aws_iam_policy_document" "s3bucket-policy" {
  version = "2008-10-17"
  statement {
    sid    = "Stmt1"
    effect = "Allow"
    principals {
      type        = "Service"
      identifiers = ["billingreports.amazonaws.com"]
    }
    actions = [
      "s3:GetBucketPolicy",
      "s3:GetBucketAcl"
    ]
    resources = [
      "${aws_s3_bucket.cost-report.arn}"
    ]
  }
  statement {
    sid    = "Stmt2"
    effect = "Allow"
    principals {
      type        = "Service"
      identifiers = ["billingreports.amazonaws.com"]
    }
    actions = [
      "s3:PutObject"
    ]
    resources = [
      "${aws_s3_bucket.cost-report.arn}/*"
    ]
  }
}
resource "aws_s3_bucket" "cost-report" {
  bucket        = "cost-report-${data.aws_caller_identity.current.account_id}"
  acl           = "private"
  force_destroy = "false"
  region        = "ap-northeast-1"
}
resource "aws_s3_bucket_policy" "cost-report" {
  bucket = "${aws_s3_bucket.cost-report.bucket}"
  policy = "${data.aws_iam_policy_document.s3bucket-policy.json}"
}
resource "aws_cur_report_definition" "cost-report" {
  provider                   = "aws.virginia"
  report_name                = "〇〇〇"
  s3_bucket                  = aws_s3_bucket.cost-report.bucket
  s3_region                  = "ap-northeast-1"
  format                     = "textORcsv"
  compression                = "GZIP"
  additional_schema_elements = ["RESOURCES"]
  time_unit                  = "DAILY"
}

3.7. Billing管理専用IAMユーザ作成

3.7.1. 目的

  • 経理部門など、Billing設定以外は操作しない利用者用

3.7.2. CloudFormation

  • 概要
    • IAMグループ BillingUsers を作成
    • IAMグループに IAMポリシーの「AWS管理のジョブ機能」の「Billing」ポリシーをアタッチする。
    • IAMユーザ yamada-taro を作成して、IAMグループ BillingUsers へ所属させる
    • 初期パスワードを適当に設定
    • 初回ログイン時にパスワードを変更させる

※ MFA の設定忘れずに。

Resources:
  IAMGroupBillingUsers:
    Type: AWS::IAM::Group
    Properties: 
      GroupName: BillingUsers
      ManagedPolicyArns: 
        -
          "arn:aws:iam::aws:policy/job-function/Billing"
      Path: "/"

  IAMManagedPolicyIAMChangePassword:
    Type: AWS::IAM::ManagedPolicy
    Properties: 
      Description: "IAM Change Password"
      Groups: 
        - !Ref IAMGroupBillingUsers
      ManagedPolicyName: "IAMChangePassword"
      Path: "/"
      PolicyDocument:
        Version: "2012-10-17"
        Statement:
          -
            Effect: "Allow"
            Action: "iam:GetAccountPasswordPolicy"
            Resource: "*"
          -
            Effect: "Allow"
            Action: "iam:ChangePassword"
            Resource: "arn:aws:iam::397190037767:user/${aws:username}"

  IAMUserBilling:
    Type: AWS::IAM::User
    Properties: 
      UserName: "yamada-taro"
      Groups: 
        - !Ref IAMGroupBillingUsers
      LoginProfile: 
        Password: "z2854jBW!M(%3%dpJT-f"
        PasswordResetRequired: true
      Path: "/"
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした