Direkt zum Inhalt

Wie kann ich die Anzahl der pro Monat aufgezeichneten CIs verwenden, um die AWS-Config-Abrechnung nachzuvollziehen?

Lesedauer: 6 Minute
0

Ich möchte die Anzahl der Konfigurationselemente (CIs) abrufen, die AWS Config aufgezeichnet hat. Dann möchte ich diese Informationen verwenden, um meine AWS-Config-Abrechnung nachzuvollziehen.

Lösung

Verwende Amazon Athena, um die Anzahl der CIs pro Monat für dein Konto zu ermitteln, damit du frühere und aktuelle Abrechnungstrends leichter erkennen kannst.

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

Der AWS-Config-Service muss die Konfigurationsverlaufsdateien erfolgreich an den angegebenen Amazon Simple Storage Service (Amazon S3)-Bucket übermitteln. AWS Config übermittelt CIs alle 6 Stunden als Konfigurationsverlaufsdateien an den Bucket. Weitere Informationen findest du unter Compliance-Verlauf für deine AWS-Ressourcen mit AWS Config anzeigen.

Führe die folgenden Schritte aus:

  1. Öffne die AWS Config-Konsole.
  2. Wähle im Navigationsbereich Einstellungen aus.
  3. Notiere dir im Abschnitt Amazon-S3-Bucket den Bucket-Namen.
  4. Öffne dieAmazon-S3-Konsole.
  5. Wähle im Navigationsbereich Buckets und dann deinen S3-Bucket aus.
  6. Überprüfe den S3-Bucket auf Konfigurationsdateien.
    Hinweis: Wenn es keine Konfigurationsdateien gibt, fehlen deiner Rolle möglicherweise Berechtigungen. Weitere Informationen findest du unter AWS Identity and Access Management (IAM) für Amazon S3.

Eine Tabelle in Athena erstellen

Öffne die Athena-Konsole. Erstelle dann eine Tabelle mit der Syntax für deine Umgebung.

Wichtig: Ersetze in der folgenden Tabellensyntax LOCATION durch den Standort und die AWS-Region für die im S3-Bucket gespeicherten AWS-Config-Elemente. Verwende für BUCKET-NAME, ACCOUNT-ID, REGION und ORG-ID deine spezifischen Informationen.

Für die standardmäßige Implementierung von AWS Config

Verwende die folgende Tabellensyntax:

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/';

Für Athena-Engine Version 2

Wenn du Athena-Engine Version 2 verwendest, beträgt die maximale Zeilenlänge für Textdateien 100 MB. Wenn du über viele Ressourcen verfügst, überschreiten AWS-Config-Elemente, die im angegebenen S3-Bucket gespeichert sind, möglicherweise diesen Grenzwert. Beispielsweise liefert AWS Config auch Konfigurations-Snapshot-Dateien in derselben Bucket-LOCATION, und die Konfigurations-Snapshot-Datei könnte diesen Grenzwert überschreiten. Wenn du den Grenzwert überschreitest, erhältst du bei der Abfrage des AWS-Config-Elements eine Fehlermeldung, die der folgenden ähnelt:

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

Verwende in diesem Fall die folgende Tabellensyntax, um Athena zu veranlassen, direkt den Amazon-S3-Pfad abzufragen, in dem die Konfigurationsverlaufsdateien gespeichert sind:

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: Die folgende Beispieltabelle partitioniert die Athena-Tabelle mit einer Partitionsprojektion von /2021/1/1/ bis /2121/12/31/. Aktualisiere diese Partitionen entsprechend deinen Anforderungen. Das Datumsformat des Amazon-S3-Pfads für AWS-Config-Daten ist nicht mit dem Datumsformat der Athena-Partitionsprojektionen kompatibel.

Für AWS-Control-Tower-Umgebungen

Wenn du AWS Control Tower verwendest, verwende zur Anpassung an die Kontostruktur die folgende Tabellensyntax, um die Athena-Tabelle zu erstellen:

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/' -- Bucket name and org should be updated
TBLPROPERTIES (
 'projection.enabled'='true',
 'projection.account.type'='enum',
 'projection.account.values'='<account-id1, accountid2>', -- Enter all account ids
 'projection.region.type'='enum',
 'projection.region.values'='<region-1,region-2,region-3>', -- Enter all regions
 '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/') -- Bucket name and org should be updated

Beispiel für Athena-Abfragen

Die folgende Beispielabfrage ruft die Anzahl der Änderungen pro 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

Wenn du bestimmte Ressourcentypen aus dem AWS-Config-Recorder ausschließt, zeichnet der Recorder dennoch die Erstellung und Löschung dieser Ressourcen auf. Diese Aufzeichnungen werden gebührenfrei gemacht. Diese Ressourcen-CIs enthalten die folgenden Status für das Feld configurationItemStatus:

  • ResourceNotRecorded
  • ResourceDeletedNotRecorded

Die Aufzeichnungen enthalten auch grundlegende Metadaten wie Ressourcen-ID, ARN und CI, jedoch keine Informationen zur Ressourcenkonfiguration und zu den Beziehungen.

Hinweis: Diese Abfrage zählt immer noch die ResourceNotRecorded-Informationen. Führe die folgende Abfrage aus, um diese Informationen auszuschließen:

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-08T%'
        AND configurationItem.configurationItemCaptureTime <= '2021-02-28T%'
        AND configurationItem.configurationItemStatus NOT IN ('ResourceNotRecorded','ResourceDeletedNotRecorded')
GROUP BY  configurationItem.resourceType
ORDER BY  NumberOfChanges DESC

Die Ergebnisse ähneln dem folgenden Beispiel:

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

Die folgende Beispielabfrage ruft die Anzahl der Konfigurationselemente pro 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

Hinweis: Um nicht aufgezeichnete Ressourcen herauszufiltern, kannst du vor der Option GROUP BY die folgende zusätzliche Klausel hinzufügen:

„AND configurationItem.configurationItemStatus NOT IN ('ResourceNotRecorded','ResourceDeletedNotRecorded')“

Die Ergebnisse ähneln dem folgenden Beispiel:

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

Hinweis: Beim Vergleich der Zahl der CIs zwischen Athena-Abfrageergebnissen und AWS-Abrechnungsdaten für denselben Monat und dieselbe Region kann eine Diskrepanz auftreten. Die Daten, die von Athena abgefragt werden, können Tagesgrenzen überschreiten und CIs enthalten, die in den Folgemonaten fakturiert wurden. AWS-Config-CIs werden auf der Grundlage des Zeitpunkts gemessen, zu dem du configurationItemCaptureTime initiiert hast.

Es hat sich bewährt, den angegebenen Endtag um einen Tag nach Monatsende zu erhöhen.

Beispielsweise kannst du die ursprüngliche Abfrage in die folgende aktualisierte Abfrage ändern.

Ursprüngliche Abfrage:

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

Aktualisierte Abfrage:

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

Hinweis: Der letzte Tag des Monats wird um einen Tag erhöht.

Ähnliche Informationen

Preise für AWS Config

Preise für Amazon Athena

Aufzeichnen von AWS-Ressourcen mit AWS Config

AWS OFFICIALAktualisiert vor 6 Monaten