Saltar al contenido

¿Cómo puedo usar la cantidad de CI registrados por mes para entender la facturación de AWS Config?

7 minutos de lectura
0

Quiero recuperar la cantidad de elementos de configuración (CI) que registró AWS Config. A continuación, quiero usar esta información para entender mi facturación de AWS Config.

Resolución

Para ayudarte a identificar las tendencias de facturación anteriores y actuales, utiliza Amazon Athena para identificar la cantidad de elementos de configuración (CI) al mes para tu cuenta.

Comprobar que el bucket de Amazon S3 contenga archivos de configuración

El servicio AWS Config debe poder entregar correctamente los archivos del historial de configuración a tu bucket designado de Amazon Simple Storage Service (Amazon S3). AWS Config envía los CI al bucket como archivos de historial de configuración cada 6 horas. Para obtener más información, consulta Ver el historial de cumplimiento de los recursos de AWS con AWS Config.

Sigue estos pasos:

  1. Abra la consola de AWS Config.
  2. En el panel de navegación, selecciona Configuración.
  3. En la sección Bucket de Amazon S3, anota el nombre del bucket.
  4. Abre la consola de Amazon S3.
  5. En el panel de navegación, elige Buckets y, a continuación, elige tu bucket de S3.
  6. Revisa el bucket de S3 para ver los archivos de configuración.
    Nota: Si no hay archivos de configuración, es posible que a tu rol le falten permisos. Para obtener más información, consulta AWS Identity and Access Management (IAM) para Amazon S3.

Creación de una tabla en Athena

Abre la consola de Athena. A continuación, crea una tabla con la sintaxis de tu entorno.

Importante: En la siguiente sintaxis de la tabla, sustituye LOCATION por la ubicación y la región de AWS para los elementos de AWS Config almacenados en tu bucket de S3. En BUCKET-NAME, ACCOUNT-ID, REGION y ORG-ID, usa tu información específica.

Para la implementación estándar de AWS Config

Utiliza la siguiente sintaxis de tabla:

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

Para motor Athena versión 2

Si utilizas la versión 2 del motor de Athena, la longitud máxima de línea para los archivos de texto es de 100 MB. Si tienes muchos recursos, es posible que los elementos de AWS Config que estén almacenados en el bucket de S3 designado superen este límite. Por ejemplo, AWS Config también entrega archivos de instantáneas de configuración en la misma LOCATION del bucket, y el archivo de instantáneas de configuración podría superar este límite. Si superas el límite, recibirás un error similar al siguiente al consultar el elemento de AWS Config:

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

En este caso, utiliza la siguiente sintaxis de tabla para indicar a Athena que consulte directamente la ruta de Amazon S3 que almacena los archivos del historial de configuración:

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

Nota: La siguiente tabla de ejemplo divide la tabla de Athena con una proyección de particiones de /2021/1/1/ a /2121/12/31/. Actualiza estas particiones según tus necesidades. El formato de fecha de la ruta Amazon S3 de los datos de AWS Config no es compatible con el formato de fecha de la proyección de particiones de Athena.

Para entornos de AWS Control Tower

Si utilizas AWS Control Tower, para adaptarte a la estructura de la cuenta, utiliza la siguiente sintaxis de tabla para crear la tabla de 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

Ejemplos de consultas de Athena

El siguiente ejemplo de consulta recupera el número de cambios por recurso en febrero de 2021, ordenados por los cambios más frecuentes:

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

Cuando excluyes ciertos tipos de recursos del grabador de AWS Config, el grabador sigue registrando la creación y la eliminación de esos recursos. Estos registros se realizan sin coste alguno. Estos CI de recursos incluyen los siguientes estados para el campo configurationItemStatus:

  • ResourceNotRecorded
  • ResourceDeletedNotRecorded

Los registros también incluyen metadatos básicos, como el identificador del recurso, el ARN y el CI, pero no incluyen información sobre la configuración y la relación de los recursos.

Nota: Esta consulta sigue contando la información de ResourceNotRecorded. Para excluir esta información, ejecuta la siguiente consulta:

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

Los resultados son similares a los del ejemplo siguiente:

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

El siguiente ejemplo de consulta recupera la cantidad de elementos de configuración por día en febrero de 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

Nota: Para filtrar los recursos no registrados, puedes agregar la siguiente cláusula adicional antes de la opción GROUP BY:

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

Los resultados son similares a los del ejemplo siguiente:

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

Nota: Al comparar el número total de CI entre los resultados de las consultas de Athena y los datos de facturación de AWS para el mismo mes y región, puede producirse una discrepancia. Los datos que Athena consulta pueden superar los límites de un día e incluir los CI facturados en meses adyacentes. Los CI de AWS Config se miden en función del momento en que iniciaste configurationItemCaptureTime.

Como práctica recomendada, incrementa en uno el día de finalización especificado desde el final del mes.

Por ejemplo, puedes cambiar la consulta original por la siguiente consulta actualizada.

Consulta original:

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

Consulta actualizada:

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

Nota: El último día del mes se incrementa en un día.

Información relacionada

Precios de AWS Config

Precios de Amazon Athena

Registro de los recursos de AWS con AWS Config