Passer au contenu

Comment puis-je utiliser le nombre de CI enregistrés par mois pour comprendre la facturation AWS Config ?

Lecture de 7 minute(s)
0

Je souhaite récupérer le nombre d'éléments de configuration (CI) enregistrés par AWS Config. Puis, je souhaite utiliser ces informations pour comprendre ma facturation AWS Config.

Résolution

Pour vous aider à identifier les tendances de facturation passées et actuelles, utilisez Amazon Athena pour identifier le nombre de CI par mois pour votre compte.

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

Le service AWS Config doit pouvoir être en mesure de transmettre correctement les fichiers d'historique de configuration au compartiment Amazon Simple Storage Service (Amazon S3) que vous avez désigné. AWS Config fournit des CI au compartiment sous forme de fichiers d'historique de configuration toutes les 6 heures. Pour plus d'informations, consultez la section Affichage de l'historique de conformité de vos ressources AWS avec AWS Config.

Procédez comme suit :

  1. Ouvrez la console AWS Config.
  2. Dans le volet de navigation, choisissez Paramètres.
  3. Dans la section Compartiment Amazon S3, notez le nom du compartiment.
  4. Ouvrez la console Amazon S3.
  5. Dans le volet de navigation, choisissez Compartiments, puis choisissez votre compartiment S3.
  6. Consultez le compartiment S3 pour les fichiers de configuration.
    Remarque : S'il n'existe aucun fichier de configuration, il est possible que votre rôle ne dispose pas de certaines autorisations. Pour plus d'informations, consultez la section Gestion des identités et des accès AWS (AWS IAM) pour Amazon S3.

Créer une table dans Athena

Ouvrez la console Athena. Puis, créez une table avec la syntaxe de votre environnement.

Important : Dans la syntaxe de la table suivante, remplacez LOCATION par l'emplacement et la région AWS pour les éléments AWS Config stockés dans votre compartiment S3. Dans BUCKET-NAME, ACCOUNT-ID, REGION et ORG-ID, utilisez vos informations spécifiques.

Pour la mise en œuvre standard d'AWS Config

Utilisez la syntaxe de table 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/';

Pour le moteur Athena version 2

Si vous utilisez le moteur Athena version 2, la longueur de ligne maximale pour les fichiers texte est de 100 Mo. Si vous disposez de nombreuses ressources, les éléments AWS Config stockés dans le compartiment S3 désigné peuvent dépasser cette limite. Par exemple, AWS Config fournit également des fichiers d'instantanés de configuration dans le même compartiment LOCATION, et le fichier d'instantané de configuration peut dépasser cette limite. Si vous dépassez la limite, vous pouvez recevoir une erreur similaire à l’erreur suivante lorsque vous interrogez l'élément AWS Config :

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

Dans ce cas, utilisez la syntaxe de table suivante pour indiquer à Athena d'interroger directement le chemin Amazon 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 : L'exemple de table suivant partitionne la table Athena avec une projection de partitions de /2021/1/1/ à /2121/12/31/. Mettez à jour ces partitions en fonction de vos besoins. Le format de date du chemin Amazon S3 des données AWS Config n'est pas compatible avec le format de date de la projection des partitions Athena.

Pour les environnements AWS Control Tower

Si vous utilisez AWS Control Tower, pour adapter la structure du compte, utilisez la syntaxe de table suivante pour créer la table Athena :

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

Exemples de requête Athena

L'exemple de requête suivant permet de récupérer le nombre de modifications par 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

Lorsque vous excluez certains types de ressources d'AWS Config Recorder, celui-ci enregistre toujours la création et la suppression de ces ressources. Ces enregistrements sont réalisés sans aucun frais. Ces CI de ressources incluent les états suivants pour le champ configurationItemStatus :

  • ResourceNotRecorded
  • ResourceDeletedNotRecorded

Les enregistrements incluent également des métadonnées de base, telles que l'identifiant de ressource, l'ARN et le CI, mais n'incluent pas la configuration des ressources et les informations de relation.

Remarque : Cette requête compte toujours les informations ResourceNotRecorded. Pour exclure ces informations, exécutez la requête 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 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

Les résultats sont similaires à ceux de l'exemple suivant :

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

L'exemple de requête suivant permet de récupérer le nombre d'éléments de configuration par jour en 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

Remarque : Pour filtrer les ressources non enregistrées, vous pouvez ajouter la clause supplémentaire suivante avant l'option GROUP BY :

« AND configurationItem.configurationItemStatus NOT IN ('ResourceNotRecorded','ResourceDeletedNotRecorded') »

Les résultats sont similaires à ceux de l'exemple suivant :

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

Remarque : Lorsque vous comparez le nombre de CI entre les résultats de requête Athena et les données de facturation AWS pour le même mois et la même région, 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. Les CI AWS Config sont mesurés en fonction de la date à laquelle vous avez lancé configurationItemCaptureTime.

Il est recommandé d'incrémenter d'un point le jour de fin spécifié à partir de la fin du mois.

Par exemple, vous pouvez remplacer la requête d'origine par la requête mise à jour suivante.

Requête initiale :

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

Requête mise à jour :

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

Remarque : Le dernier jour du mois est incrémenté d'un jour.

Informations connexes

Tarification d'AWS Config

Tarification d'Amazon Athena

Enregistrement des ressources AWS avec AWS Config

AWS OFFICIELA mis à jour il y a 3 mois