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. やらないことリスト
-
AWS支払の円払いへの切り替え設定
-
現時点でこの機能を利用できるクレジットカードは、VISA と Master カード。
-
私が登録しているクレジットカードは JCB なので使えない。。ので、デフォルトの USD のままで。
-
Budgets Reports 作成
-
いまのところ予算管理は行ってないので。
-
現時点 Terraform に Budgets Reports のリソースがない。
-
請求アラートを受け取る設定と、請求アラーム設定
-
Budgets 設定へ移行したので。
-
有効期限が切れる予約(リザーブドインスタンス)のアラート通知設定
-
現時点では、メール通知のみ。
-
Slackへ通知したいので、自作した監視設定を入れている。
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) マイアカウント
(3) IAM ユーザー/ロールによる請求情報へのアクセス の箇所までスクロール
(ルートユーザー以外がサインインしたときには表示されない)
「IAM アクセスのアクティブ化」にチェックを入れて、更新
(4) 確認
「IAM ユーザー/ロールによる請求情報へのアクセスは有効になっています。」
と表示されていることを確認
(5) 設定が終わったら、速やかにルートユーザーをサインアウトする
3.2. Cost Explorer 有効化と設定
3.2.1. 目的
-
Cost Explorer は、コストと使用状況を表示および分析するために使用できるツール。メイングラフ、Cost Explorer コストと使用状況レポート、または Cost Explorer RI レポートを使用して、使用状況とコストを確認できる。
-
コスト配分タグを利用することで、より効率的なコスト管理ができる。
-
EC2 リソース最適化推奨を確認し、できることがあれば対応する
-
リザーブドインスタンスの利用状況を確認する。
3.2.2. 設定
(1) 「Billing」ポリシーをアタッチしたIAMユーザーでサインインする
(2) 「請求情報とコスト管理ダッシュボード」(Billing) コンソールへ
(3) Cost Explorer へ
(4) コストエクスプローラーを有効化 する
初めて Cost Explorer を有効にした後、コストと使用状況のデータが追加されるまで、最大 24 時間かかる
(5) コストエクスプローラーを起動 する
(6) 設定画面へ
(7) 「時間単位とリソースレベルのデータ」と「Amazon EC2 リソースの推奨事項を受け取る」にチェックを入れる
(8) リザーブドインスタンスの有効期限切れアラート設定を行う場合
※ 現時点では、メール通知のみ。私はSlackへ通知したいので、自作した監視設定を入れている。
3.3. コスト配分タグをアクティブ化
3.3.1. 目的
- Cost Explorer で効率的なコスト管理を行う。
3.3.2. 設定
(1) 「Billing」ポリシーをアタッチしたIAMユーザーでサインインする
(2) 「請求情報とコスト管理ダッシュボード」(Billing) コンソールへ
(3) コスト配分タグ へ
(4) 有効化 を押下で有効にする
(5) ユーザー定義のコスト配分タグ設定
コスト配分タグに設定したいタグにチェックを入れて、有効化 を押下する。
※ 設定したタグが Cost Explorer に表示されるまで最大 3 日かかることがある。
3.4. 電子メールで PDF 版請求書を受け取る設定
3.4.1. 目的
- 毎月3日か4日くらいに、前月分の請求書のPDFファイルを指定したメールアドレスへ送信する。
3.4.2. 設定
(1) 「Billing」ポリシーをアタッチしたIAMユーザーでサインインする
(2) 「請求情報とコスト管理ダッシュボード」(Billing) コンソールへ
(3) Billing の設定 へ
(4) 電子メールで PDF 版請求書を受け取る にチェックをいれて、設定を保存する
3.5. Budgets 設定
3.5.1. 目的
-
予算の管理を行う。
-
予算がアラートの閾値を超えた場合に通知(Eメール or SNSトピック)する。
-
実際のコストがアラートの閾値を超えた場合に通知(Eメール or SNSトピック)する。
-
従来の「請求書アラート」設定よりもきめ細かいアラート設定ができる。
3.5.2. Budgets 設定
※ ここでは、1ヶ月の実際のコストが閾値を超えた場合に通知する設定を行う。
※ 通知を SNS トピックで行う場合は、事前に SNS トピックを作成しておく。
(1) 「Billing」ポリシーをアタッチしたIAMユーザーでサインインする
(2) 「請求情報とコスト管理ダッシュボード」(Billing) コンソールへ
(3) Budgets へ
(4) 「Create a budget」へ}
(5) 「コスト予算」へ
(6) 予算の設定
名前:〇〇〇
間隔:月別
定期予算
開始月:〇〇〇
予算額:〇〇〇
※ 設定例
(7) アラートの設定
次に基づいてアラートを送信:実際のコスト
アラートの閾値:〇〇〇 金額
SNS トピックのARN:〇〇〇
※ 設定例
3.5.3. 従来の「請求書アラート」設定は止める
(1) 「Billing」ポリシーをアタッチしたIAMユーザーでサインインする
(2) 「請求情報とコスト管理ダッシュボード」(Billing) コンソールへ
(3) Billing の設定 へ
(4) 請求書アラートは、一度オンにするとオフに戻すことはできない・・
(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 にアップロードすることも出来ます。
-
参考
-
AWS のコストと使用状況レポートに、Amazon Athena との統合、Apache Parquet 形式での出力、レポートの上書きが追加
※ 個人的な目的
- 従来の 請求明細レポート(DBR: Detailed Billing Report)設定をなんとなく入れていたけど、結局、S3バケットに配信されたレポートをダウンロードして開くことは、最初の設定時くらいだけだった。。
- そして、請求明細レポート(DBR)はレガシーな存在となって、コストと使用状況レポート(CUR: Cost and Usage Report)へ移行することを強く勧めている。
- コストと使用状況レポート(CUR)では、レポート活用手段が増え、今後もしかしたら活用する機会があるかもしれないので、請求明細レポート(DBR)からコストと使用状況レポート(CUR)へ移行しておくことにする。
- 参考
- 請求明細レポートデータの AWS Cost and Usage Report への移行
- 請求明細レポートから AWS のコストと使用状況レポートに移行するにはどうすれば良いですか?
3.6.2. コストと使用状況レポート(CUR)設定
(1) 「Billing」ポリシーをアタッチしたIAMユーザーでサインインする
(2) 「請求情報とコスト管理ダッシュボード」(Billing) コンソールへ
(3) Cost & Usage Reports へ
(4) レポートの作成 へ
(5) レポートの明細項目
設定例
(6) 配信オプション
レポートを配信する S3 バケットを設定する
既存バケットを選択 あるいは 新規に作成する
ポリシーの確認にチェックを入れる
今回は、レポートデータ統合の有効化 はチェックしない
確認して完了
3.6.3. 請求明細レポート(DBR)を停止する
(1) 「Billing」ポリシーをアタッチしたIAMユーザーでサインインする
(2) 「請求情報とコスト管理ダッシュボード」(Billing) コンソールへ
(3) Billing の設定 へ
(4) 請求明細レポート(レガシー)設定を無効にする
「レガシー化した請求明細レポート機能を使って、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: "/"