🤔

AWS Configを有効したらどのぐらい料金が発生するのか知りたい

2023/07/22に公開

こんにちは cacaca_came です。

みなさんはAWS Configを使っていますか?
AWS Configを有効にしたいけどどのぐらい料金かかるかわからないし、偉い人に説明しづらいなと思っていませんか?

私はめちゃくちゃ思っています。記録されたイベントに対して課金という性質と、アカウント内のすべてを把握していない私が、月にどれだけ構成変更があるかを事前に知ることはなかなか難しい。。。

そんなことを思っていたら(都合よく)運用中のアカウントでConfigを有効にしようという話が出たため、見積り方を調べてみます。

見積り方法

公式ブログでAWS Configを利用する際の料金を推定する方法が紹介されていました。
https://aws.amazon.com/jp/blogs/news/estimating-aws-config-recorder-costs-and-usage-using-aws-cloudtrail/

手順としては簡単で、CloudTrailのログから記録対象となりうるイベント件数を抽出して見積るというものです。

この記事の前提条件

  • すでに運用しているアカウントである
  • 1ヶ月分のCloudTrailログがある
  • CloudTrailのログはS3に保存されている

試してみる

今回は以下の流れで確認してみます。

  1. Athenaを使ってCloudTrailのログから課金対象となりうるイベント件数を調べる。
  2. イベント件数から料金を見積る。(今回はAWS Pricing Calculatorは使いません)

Athenaテーブルの作成

まずはAthenaのテーブルを作成します。
公式ドキュメントでテーブル作成のスクリプトが用意されていますが、件数を調べるのに必要なmanagementEventが含まれていないので、テーブルを作る際に追加しましょう。

https://docs.aws.amazon.com/ja_jp/athena/latest/ug/cloudtrail-logs.html

DDL
-- CloudTrailログのテーブル作成
-- S3バケットはご自身のCloudTrailログ格納先に変更してください。
CREATE EXTERNAL TABLE cloudtrail_logs_pp(
    eventVersion STRING,
    userIdentity STRUCT<
        type: STRING,
        principalId: STRING,
        arn: STRING,
        accountId: STRING,
        invokedBy: STRING,
        accessKeyId: STRING,
        userName: STRING,
        sessionContext: STRUCT<
            attributes: STRUCT<
                mfaAuthenticated: STRING,
                creationDate: STRING>,
            sessionIssuer: STRUCT<
                type: STRING,
                principalId: STRING,
                arn: STRING,
                accountId: STRING,
                userName: STRING>,
            ec2RoleDelivery:string,
            webIdFederationData:map<string,string>
        >
    >,
    eventTime STRING,
    eventSource STRING,
    eventName STRING,
    awsRegion STRING,
    sourceIpAddress STRING,
    userAgent STRING,
    errorCode STRING,
    errorMessage STRING,
    requestparameters STRING,
    responseelements STRING,
    additionaleventdata STRING,
    requestId STRING,
    eventId STRING,
    readOnly STRING,
    resources ARRAY<STRUCT<
        arn: STRING,
        accountId: STRING,
        type: STRING>>,
    eventType STRING,
    apiVersion STRING,
    recipientAccountId STRING,
    serviceEventDetails STRING,
    sharedEventID STRING,
    vpcendpointid STRING,
    tlsDetails STRUCT<
        tlsVersion:STRING,
        cipherSuite:STRING,
        clientProvidedHostHeader:STRING>,
    managementEvent STRING, -- これが追加で必要
    eventCategory STRING
  )
PARTITIONED BY (`timestamp` string)
ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe'
STORED AS INPUTFORMAT 'com.amazon.emr.cloudtrail.CloudTrailInputFormat'
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
  's3://bucket/AWSLogs/account-id/CloudTrail/aws-region'
TBLPROPERTIES (
  'projection.enabled'='true', 
  'projection.timestamp.format'='yyyy/MM/dd', 
  'projection.timestamp.interval'='1', 
  'projection.timestamp.interval.unit'='DAYS', 
  'projection.timestamp.range'='2023/01/01,NOW', 
  'projection.timestamp.type'='date', 
  'storage.location.template'='s3://bucket/AWSLogs/account-id/CloudTrail/aws-region/${timestamp}'
)

対象イベントの件数取得

AWS Configで記録される可能性のある設定項目の件数を取得します。今回は6月のログを確認してみます。
こちらは公式ブログで紹介されているものをそのまま使用します。

課金対象イベント抽出クエリ
SELECT
  recipientAccountId, awsRegion, eventSource, count(*) as TotalPossibleCI
FROM
  "cloudtrail_logs_pp"
WHERE
  (eventSource like 'eks%'
    or eventSource like 'ec2%'
    or eventSource like 'vpc%'
    or eventSource like 'ecs%'
    or eventSource like 'iam%'
    or eventSource like 'autoscaling%'
    or eventSource like 's3%'
    or eventSource like 'rds%'
    or eventSource like 'backup%'
    or eventSource like 'athena%'
    or eventSource like 'cloudtrail%'
    or eventSource like 'cloudfront%'
    or eventSource like 'cloudformation%'
    or eventSource like 'code%'
    or eventSource like 'ecr%'
    or eventSource like 'lambda%'
    or eventSource like 'efs%'
  )
  AND readonly = 'false'
  AND managementEvent = 'true'
  AND eventTime >= '2023-06-01 00:00:00'
  AND eventTime < '2023-07-01 00:00:00'
  AND "timestamp" between '2023/06/01' AND '2023/06/30'
GROUP BY recipientAccountId, awsRegion, eventSource
ORDER BY recipientAccountId desc, TotalPossibleCI desc;

結果は以下の通り、合計22,038イベントとなりました。
ECRのイベントが多いですね。。。

推定料金を見積る

AWS Configでは、記録された構成アイテムごとに、0.003ドルがかかります。(2023/07/22時点)
6月は22,038イベントでしたので、仮に有効にしていたとしたら $66 かかる計算です。
この金額で構成履歴を追えるようになると考えれば良いのではないでしょうか。

気になったこと

算出した料金はあくまでも推定値です。果たして全てのイベントが課金対象になるのでしょうか??
試しに一番イベント数が多かったECRでどんなイベントがあるのか確認してみます。

ECRのイベント抽出クエリ
SELECT recipientAccountId, awsRegion, eventSource, eventname, count(*) AS count
FROM "madirect_production"."cloudtrail_logs_pp"
WHERE "timestamp" between '2023/06/01' AND '2023/06/30'
AND readonly = 'false'
AND managementEvent = 'true'
AND "eventsource" like 'ecr%'
GROUP BY recipientAccountId, awsRegion, eventSource, eventname

それぞれがどんなイベントなのか確認してみます。

イベント名 イベントの詳細
InitiateLayerUpload イメージレイヤーをアップロードする予定であることを Amazon ECR に通知
UploadLayerPart Amazon ECRにイメージレイヤーをパートアップロード
CompleteLayerUpload イメージレイヤーのアップロードが完了したことを Amazon ECR に通知
PutImage Amazon ECRにイメージをプッシュ

なんだかどれも構成履歴として課金されなさそう。。。
実際どうなるんだ!!気になりすぎる!!!!
Configを有効にしたら、実際にどのくらいのイベントが課金対象になったか報告しようと思います!

終わりに

AWS Configにかかる料金の見積りを試してみました。公式ブログに沿って行えば簡単にできるのでみなさんも試してみてください。
もっと精度良く見積る方法をご存知の方がいれば教えていただけると嬉しいです!

追記 (2023/10/29)

先月分を計測してみました。
請求書の実績は8,287件、上記のAthenのクエリで取得できる件数は66,189件でした。
この差はサポートされていないリソースタイプが含まれているからかと思います。
以下を確認し、サポートされてなさそうなリソースを集計から除外したら請求書の件数に近づきました。
https://docs.aws.amazon.com/ja_jp/config/latest/developerguide/select-resources.html
私の環境の場合だと、logs.amazonaws.comecr.amazonaws.comの大半のイベントを削ると同じくらいに近づきました。参考になれば嬉しいです。

Discussion