Wie kann ich die Anzahl der Konfigurationselemente abrufen, die AWS Config jeden Monat aufzeichnet?

Lesedauer: 6 Minute
0

Ich möchte die Anzahl der CIs (configuration items, Konfigurationselemente) ermitteln, die AWS Config aufzeichnet, damit ich die Rechnungsstellung für mein AWS-Konto verstehen kann.

Lösung

Verwende Amazon Athena, um die Anzahl der CIs pro Monat für dein Konto zu ermitteln.

Überprüfen, ob dein Amazon S3-Bucket Konfigurationsdateien enthält

Vergewissere dich, dass AWS Config die Konfigurationsverlaufsdateien an den angegebenen Amazon Simple Storage Service (Amazon S3)-Bucket übermitteln kann. AWS Config übermittelt in der Regel alle 6 Stunden Konfigurationsverlaufsdateien an den Bucket.

Um zu überprüfen, ob dein S3-Bucket Konfigurationsdateien enthält, führe die folgenden Schritte aus:

  1. Öffne AWS Config-Konsole.
  2. Wähle im Navigationsbereich Einstellungen aus.
  3. Notiere dir im Abschnitt Amazon S3-Bucket den Bucket-Namen.
  4. Öffne die Amazon S3-Konsole und wähle dann deinen S3-Bucket aus.
  5. Stelle sicher, dass der S3-Bucket Konfigurationsdateien enthält.
    Hinweis: Wenn keine Konfigurationsdateien vorhanden sind, hat deine AWS Identity and Access Management (IAM)-Rolle möglicherweise nicht die erforderlichen Berechtigungen für Amazon S3.

Eine Tabelle in Athena erstellen

Verwende den Abfrage-Editor von Amazon Athena, um eine Tabelle zu erstellen. Gib im Abfrage-Editor die folgende Anweisung ein:

CREATE EXTERNAL TABLE awsconfig (         
         fileversion string,
         configSnapshotId string,
         configurationitems ARRAY < STRUCT < configurationItemVersion : STRING,
         configurationItemCaptureTime : STRING,
         configurationStateId : BIGINT,
         awsAccountId : STRING,
         configurationItemStatus : STRING,
         resourceType : STRING,
         resourceId : STRING,
         resourceName : STRING,
         ARN : STRING,
         awsRegion : STRING,
         availabilityZone : STRING,
         configurationStateMd5Hash : STRING,
         resourceCreationTime : STRING > >
)
ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe' LOCATION 's3://BUCKET-NAME/AWSLogs/ACCOUNT-ID/Config/REGION/';

Hinweis: Ersetze den Speicherort des S3-Beispiel-Buckets durch den deines S3-Buckets.

Wenn du Athena-Engine Version 2 verwendest, beträgt die maximale Zeilenlänge für Textdateien 100 MB. Wenn du über eine große Anzahl von Ressourcen verfügst, können die CIs, die im vorgesehenen AWS Config S3-Bucket gespeichert werden, das Kontingent überschreiten. Da AWS Config beispielsweise auch Konfigurations-Snapshot-Dateien im selben Bucket-Speicherort liefert, könnte die Konfigurations-Snapshot-Datei das Kontingent überschreiten.

Wenn du das Kontingent überschreitest, erhältst du eine Fehlermeldung, die der folgenden ähnelt, nachdem du die CI abgefragt hast:

„HIVE_BAD_DATA: Line too long in text file: s3_path_to_config_data_object“

Führe die folgende Tabellenanweisung aus, damit Athena direkt den S3-Pfad abfragt, in dem die Konfigurationsverlaufsdateien gespeichert sind, um dieses Problem zu vermeiden:

CREATE EXTERNAL TABLE awsconfig (         
         fileversion string,
         configSnapshotId string,
         configurationitems ARRAY < STRUCT < configurationItemVersion : STRING,
         configurationItemCaptureTime : STRING,
         configurationStateId : BIGINT,
         awsAccountId : STRING,
         configurationItemStatus : STRING,
         resourceType : STRING,
         resourceId : STRING,
         resourceName : STRING,
         ARN : STRING,
         awsRegion : STRING,
         availabilityZone : STRING,
         configurationStateMd5Hash : STRING,
         resourceCreationTime : STRING > >
)
PARTITIONED BY (`year` string,`month` string,`day` string)
ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe'
LOCATION 's3://BUCKET-NAME/AWSLogs/ACCOUNT-ID/Config/REGION/'
TBLPROPERTIES (
  'projection.enabled'='true',
  'projection.year.interval'='1',
  'projection.year.range'='2021,2121',
  'projection.year.type'='integer',
  'projection.month.interval'='1',
  'projection.month.range'='1,12',
  'projection.month.type'='integer',
  'projection.day.interval'='1',
  'projection.day.range'='1,31',
  'projection.day.type'='integer',
  'storage.location.template'='s3://BUCKET-NAME/AWSLogs/ACCOUNT-ID/Config/REGION/${year}/${month}/${day}/ConfigHistory/')

Hinweis: Ersetze den Speicherort des S3-Beispiel-Buckets durch den deines S3-Buckets.

Die vorangehende Tabellenanweisung partitioniert die Athena-Tabelle mit Partitionsprojektionen von /2021/1/1/ bis /2121/12/31/.

Hinweis: Das Datumsformat des S3-Pfads für AWS Config-Daten ist nicht mit dem Datumstypformat der Projektion von Athena-Partition kompatibel.

Beispiel für Athena-Abfragen

Die folgende Beispielabfrage ruft die Anzahl der CIs für jeden Tag im Februar 2021 ab:

SELECT result.configurationitemcapturetime,
         count(result.configurationitemcapturetime) AS NumberOfChanges
FROM
    (SELECT regexp_replace(configurationItem.configurationItemCaptureTime,
         '(.+)(T.+)', '$1') AS configurationitemcapturetime
    FROM default.awsconfig
    CROSS JOIN UNNEST(configurationitems) AS t(configurationItem)
    WHERE "$path" LIKE '%ConfigHistory%'
            AND configurationItem.configurationItemCaptureTime >= '2021-02-01T%'
            AND configurationItem.configurationItemCaptureTime <= '2021-02-28T%') result
GROUP BY  result.configurationitemcapturetime
ORDER BY  result.configurationitemcapturetime

Beispielausgabe:

configurationitemcapturetime    NumberOfChanges  
2021-02-02    7
2021-02-03    3
2021-02-07   11
...

Die folgende Beispielabfrage ruft die Anzahl der Änderungen für jede Ressource im Februar 2021 ab, sortiert nach den am häufigsten vorgenommenen Änderungen:

SELECT configurationItem.resourceType,           
         configurationItem.resourceId,
         COUNT(configurationItem.resourceId) AS NumberOfChanges
FROM default.awsconfig
CROSS JOIN UNNEST(configurationitems) AS t(configurationItem)
WHERE "$path" LIKE '%ConfigHistory%'
        AND configurationItem.configurationItemCaptureTime >= '2021-02-01T%'
        AND configurationItem.configurationItemCaptureTime <= '2021-02-28T%'
GROUP BY  configurationItem.resourceType, configurationItem.resourceId
ORDER BY  NumberOfChanges DESC

Beispielausgabe:

resourcetype              resourceid        NumberOfChanges  
AWS::EC2::VPC             vpc-9ed00bfa        7
AWS::EC2::Subnet          subnet-4472e248     5
AWS::EC2::SecurityGroup   sg-450c6531         4

Hinweis: Wenn du die Gesamtzahl der CIs zwischen Athena-Abfrageausgaben und AWS-Abrechnungsdaten für denselben Monat und dieselbe AWS-Region vergleichst, kann eine Diskrepanz auftreten. Die Daten, die von Athena abgefragt werden, können Tagesgrenzen überschreiten und auch CIs enthalten, die in den Folgemonaten fakturiert wurden. AWS Config misst CIs auf der Grundlage des Zeitpunkts, zu dem configurationItemCaptureTime initiiert wird.

Es ist ein bewährtes Verfahren, den Endtag vom Monatsende um einen Tag zu erhöhen.

In der folgenden Abfrage ist der Endtag zum Beispiel der 28. Februar:

AND configurationItem.configurationItemCaptureTime <= '2021-02-28T%') result

Aktualisiere das Ende des Tages auf den 1. März:

AND configurationItem.configurationItemCaptureTime <= '2021-03-01T%') result

AWS Config in einer Control Tower-Umgebung abfragen

Da Control Tower alle Konfigurationsprotokolle in demselben S3-Bucket ablegt, kannst du alle Konten in AWS Organizations abfragen.

Um eine Tabelle für die Einrichtung von Control Tower zu erstellen, führe eine Anweisung aus, die der folgenden ähnelt:

CREATE EXTERNAL TABLE awsconfig (
         fileversion string,
         configSnapshotId string,
         configurationitems ARRAY < STRUCT < configurationItemVersion : STRING,
         configurationItemCaptureTime : STRING,
         configurationStateId : BIGINT,
         awsAccountId : STRING,
         configurationItemStatus : STRING,
         resourceType : STRING,
         resourceId : STRING,
         resourceName : STRING,
         ARN : STRING,
         awsRegion : STRING,
         availabilityZone : STRING,
         configurationStateMd5Hash : STRING,
         resourceCreationTime : STRING > >
)
PARTITIONED BY (`account` string,`region` string,`year` string,`month` string,`day` string)
ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe'
LOCATION 's3://bucket-name/org-id/AWSLogs/'
TBLPROPERTIES (
  'projection.enabled'='true',
  'projection.account.type'='enum',
  'projection.account.values'='account-id1, accountid2',
  'projection.region.type'='enum',
  'projection.region.values'='us-east-1,us-east-2,us-west-2',
  'projection.year.interval'='1',
  'projection.year.range'='2021,2121',
  'projection.year.type'='integer',
  'projection.month.interval'='1',
  'projection.month.range'='1,12',
  'projection.month.type'='integer',
  'projection.day.interval'='1',
  'projection.day.range'='1,31',
  'projection.day.type'='integer',
  'storage.location.template'='s3://bucket-name/org-id/AWSLogs/${account}/Config/${region}/${year}/${month}/${day}/ConfigHistory/')

Hinweis: Füge die IDs für jedes Konto in deiner Organisation hinzu, und ersetze alle Regionen durch deine Regionen.

Die vorangehende Anweisung erstellt automatisch Partitionen für Konten, Jahr, Monat und Tag. Führe die folgende Anweisung aus, um die Anzahl der CIs eines bestimmten Monats abzufragen:

SELECT result.configurationitemcapturetime,
         count(result.configurationitemcapturetime) AS NumberOfChanges
FROM
    (SELECT regexp_replace(configurationItem.configurationItemCaptureTime,
         '(.+)(T.+)', '$1') AS configurationitemcapturetime
    FROM default.awsconfig
    CROSS JOIN UNNEST(configurationitems) AS t(configurationItem)
    WHERE "$path" LIKE '%ConfigHistory%'
            AND year='2024'
            AND month='9') result
GROUP BY  result.configurationitemcapturetime
ORDER BY  result.configurationitemcapturetime

Führe die folgende Anweisung aus, um die Anzahl der Änderungen für jede Ressource im selben Monat zu ermitteln:

SELECT configurationItem.resourceType,
         configurationItem.resourceId,
         COUNT(configurationItem.resourceId) AS NumberOfChanges
FROM default.awsconfig
CROSS JOIN UNNEST(configurationitems) AS t(configurationItem)
WHERE "$path" LIKE '%ConfigHistory%'
        AND year='2024'
        AND month='9'
GROUP BY  configurationItem.resourceType, configurationItem.resourceId
ORDER BY  NumberOfChanges DESC

Ähnliche Informationen

Anzeigen des Compliance-Verlaufs für deine AWS-Ressourcen mit AWS Config

Preise für AWS Config

Preise für Amazon Athena