Comment puis-je récupérer le nombre d'éléments de configuration qu'AWS Config enregistre chaque mois ?

Lecture de 6 minute(s)
0

Je souhaite connaître le nombre d'éléments de configuration (CI) enregistrés par AWS Config afin de comprendre la facturation de mon compte AWS.

Résolution

Utilisez Amazon Athena pour identifier le nombre de CI associés à votre compte chaque mois.

Vérifier que votre compartiment Amazon S3 contient des fichiers de configuration

Assurez-vous qu'AWS Config peut fournir des fichiers d'historique de configuration au compartiment Amazon Simple Storage Service (Amazon S3) que vous avez désigné. AWS Config fournit généralement des fichiers d'historique de configuration au compartiment toutes les 6 heures.

Pour vérifier que votre compartiment S3 contient des fichiers de configuration, procédez comme suit :

  1. Ouvrez la console AWS Config.
  2. Dans le volet de navigation, sélectionnez Paramètres.
  3. Dans la section Compartiment Amazon S3, notez le nom du compartiment.
  4. Ouvrez la console Amazon S3, puis sélectionnez votre compartiment S3.
  5. Vérifiez que le compartiment S3 contient des fichiers de configuration.
    Remarque : S'il n'existe aucun fichier de configuration, votre rôle AWS Identity and Access Management (IAM) ne dispose peut-être pas des autorisations requises pour Amazon S3.

Créer une table dans Athena

Utilisez l'éditeur de requêtes Amazon Athena pour créer une table. Dans l'éditeur de requêtes, saisissez l'instruction suivante :

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

Remarque : Remplacez l'exemple d'emplacement du compartiment S3 par l'emplacement de votre compartiment S3.

Si vous utilisez le moteur Athena version 2, la longueur de ligne maximale pour les fichiers texte est de 100 Mo. Si vous disposez d'un grand nombre de ressources, les CI stockés dans le compartiment AWS Config S3 désigné peuvent dépasser cette limite. Par exemple, dans la mesure où AWS Config fournit également des fichiers d'instantanés de configuration au même emplacement de compartiment, le fichier d'instantané de configuration peut dépasser le quota.

Si vous dépassez le quota, une erreur similaire à l’erreur suivante s'affiche lorsque vous interrogez le CI :

« HIVE_BAD_DATA: Line too long in text file: s3_path_to_config_data_object »

Pour éviter ce problème, exécutez l'instruction de table suivante afin qu'Athena interroge directement le chemin S3 qui stocke les fichiers d'historique de configuration :

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

Remarque : Remplacez l'exemple d'emplacement du compartiment S3 par l'emplacement de votre compartiment S3.

L'instruction de table précédente partitionne la table Athena avec des projections de partition allant de /2021/1/1/ à /2121/12/31/.

Remarque : Le format de date de chemin S3 des données AWS Config n'est pas compatible avec le format de type de date de projection de partition Athena.

Exemples de requête Athena

L'exemple de requête suivant permet de récupérer le nombre de CI pour chaque jour de février 2021 :

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

Exemple de sortie :

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

L'exemple de requête suivant permet de récupérer le nombre de modifications pour chaque ressource en février 2021, triées selon les modifications les plus fréquentes :

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

Exemple de sortie :

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

Remarque : Lorsque vous comparez le nombre total de CI entre les sorties des requêtes Athena et les données de facturation AWS pour le même mois et la même région AWS, une divergence peut apparaître. Les données interrogées par Athena peuvent dépasser les limites du nombre de jours et inclure également des CI facturés les mois suivants. AWS Config mesure les CI en fonction de l'heure à laquelle configurationItemCaptureTime est lancé.

Il est recommandé d'augmenter d'un jour la date de fin de mois.

Par exemple, dans la requête suivante, le jour de fin est le 28 février :

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

Mettez à jour la fin de la journée au 1er mars :

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

Interroger AWS Config dans un environnement Control Tower

Étant donné que Control Tower place tous les journaux de configuration dans le même compartiment S3, vous pouvez interroger tous les comptes dans AWS Organizations.

Pour créer une table pour la configuration de Control Tower, exécutez une instruction similaire à l’instruction suivante :

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

Remarque : Ajoutez les ID de chaque compte de votre organisation et remplacez toutes les régions par vos régions.

L'instruction précédente crée automatiquement des partitions pour les comptes, l'année, le mois et le jour. Pour interroger le nombre de CI d'un mois donné, exécutez l'instruction suivante :

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

Pour obtenir le nombre de modifications apportées à chaque ressource au cours du même mois, exécutez l'instruction suivante :

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

Informations connexes

Consultation de l'historique de conformité de vos ressources AWS avec AWS Config

Tarification d'AWS Config

Tarification d'Amazon Athena

AWS OFFICIEL
AWS OFFICIELA mis à jour il y a 3 mois