Open5

AWS Config記録コスト削減

dehio3dehio3

トップ 10 のリソースタイプを表示する CloudWatch数式

SORT(SEARCH('{AWS/Config,ResourceType}) MetricName="ConfigurationItemsRecorded" NOT ResourceType="All"', "Sum",86400),SUM, DESC, 10)

各関数の詳細説明

1. SEARCH関数(最内側)

SEARCH('{AWS/Config,ResourceType}) MetricName="ConfigurationItemsRecorded" NOT ResourceType="All"', "Sum",86400)

役割: 指定した条件に一致するメトリクスを検索

パラメータ解説:
• {AWS/Config,ResourceType}:
• AWS/Config 名前空間のメトリクス
• ResourceType ディメンションを持つメトリクスを対象
• MetricName="ConfigurationItemsRecorded":
• 構成項目が記録された数を表すメトリクス名
• NOT ResourceType="All":
• ResourceType が "All" でないものを対象(個別のリソースタイプのみ)
• "Sum":
• 統計タイプ(合計値を取得)
• 86400:
• 期間(秒)= 24時間(86400秒 = 24時間 × 60分 × 60秒)

結果: 各リソースタイプごとの24時間の構成項目記録数の配列

2. SORT関数(外側)

SORT(..., SUM, DESC, "10")

役割: SEARCH結果をソートし、上位を抽出

パラメータ解説:
• SUM:
• ソートの基準(合計値でソート)
• DESC:
• 降順ソート(値の大きい順)
• "10":
• 上位10件を取得

dehio3dehio3

過去24時間の記録数が1以上のリソースタイプの取得

command
aws cloudwatch get-metric-data \
  --metric-data-queries '[{"Id": "all_config_items", "Expression": "SORT(SEARCH(\"{AWS/Config,ResourceType} MetricName=\\\"ConfigurationItemsRecorded\\\" NOT ResourceType=\\\"All\\\"\", \"Sum\", 86400), SUM, DESC)"}]' \
  --start-time "$(date -u -v-24H +%Y-%m-%dT%H:%M:%SZ)" \
  --end-time "$(date -u +%Y-%m-%dT%H:%M:%SZ)" \
  --region ap-northeast-1 \
  --output json \
   | jq -r '.MetricDataResults[] | "\(.Label)|\(.Values[0] // 0)"' | awk -F'|' '
BEGIN {
    print "構成項目記録数 (1件以上)"
    print "========================================"
    total = 0
    count = 0
    filtered = 0
}
{
    count++
    label = $1
    gsub(/^[0-9]+ - /, "", label)
    value = int($2)
    total += value
    if(value >= 1) {
        filtered++
        printf "%2d. %-40s : %d\n", filtered, label, value
    }
}
END {
    print "========================================"
    printf "表示: %d件 (全%d件中) 合計: %d件\n", filtered, count, total
}'
output
構成項目記録数 (1件以上)
========================================
 1. AWS::Config::ResourceCompliance          : 3444
 2. AWS::EC2::NetworkInterface               : 2206
 3. AWS::EC2::SecurityGroup                  : 1981
 4. AWS::EC2::Subnet                         : 1739
 5. AWS::EC2::VPC                            : 1222
 6. AWS::SSM::ManagedInstanceInventory       : 503
 7. AWS::EC2::Instance                       : 347
 8. AWS::EC2::EC2Fleet                       : 297
 9. AWS::EC2::Volume                         : 194
10. AWS::SSM::AssociationCompliance          : 167
11. AWS::EC2::LaunchTemplate                 : 156
12. AWS::ECS::TaskDefinition                 : 59
13. AWS::RDS::DBClusterSnapshot              : 49
14. AWS::ECS::Service                        : 47
15. AWS::RDS::DBInstance                     : 36
16. AWS::RDS::DBCluster                      : 32
17. AWS::KMS::Key                            : 21
18. AWS::AutoScaling::AutoScalingGroup       : 2
19. AWS::CloudFormation::Stack               : 1
20. AWS::CloudWatch::Alarm                   : 1
21. AWS::CodeDeploy::DeploymentGroup         : 1
22. AWS::Lambda::Function                    : 1
========================================
表示: 22件 (全39件中) 合計: 12506件
dehio3dehio3

AWS Configのリソースタイプ数の取得

command
aws configservice get-discovered-resource-counts --region ap-northeast-1 --query 'length(resourceCounts)' --output text
output
100
dehio3dehio3

CEのコストとの比較

過去1週間の日次のコストを取得

command
aws ce get-cost-and-usage \
  --time-period Start=$(date -v-7d +%Y-%m-%d),End=$(date +%Y-%m-%d) \
  --granularity DAILY \
  --metrics BlendedCost UsageQuantity \
  --group-by Type=DIMENSION,Key=USAGE_TYPE \
  --filter '{"Dimensions":{"Key":"USAGE_TYPE","Values":["APN1-ConfigurationItemRecorded"],"MatchOptions":["EQUALS"]}}' \
  --region us-east-1 \
  --output json | jq -r '
    "日付,コスト(USD),使用量(件)",
    (.ResultsByTime[] |
      "\(.TimePeriod.Start),$\(.Groups[0].Metrics.BlendedCost.Amount),\(.Groups[0].Metrics.UsageQuantity.Amount)"
    )
  ' | column -t -s ','

日毎のConfigurationItemsRecorded の数値とコストの使用量(件)の数値はほぼ同じ
誤差は98、99%程度