¿Cómo puedo recuperar el número de elementos de configuración que AWS Config registra cada mes?

6 minutos de lectura
0

Quiero saber la cantidad de elementos de configuración (CI) que registra AWS Config para poder entender la facturación de mi cuenta de AWS.

Resolución

Utilice Amazon Athena para identificar el número de CI de su cuenta cada mes.

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

Asegúrese de que AWS Config pueda entregar los archivos del historial de configuración a su bucket designado de Amazon Simple Storage Service (Amazon S3). AWS Config normalmente envía los archivos del historial de configuración al bucket cada 6 horas.

Para comprobar que el bucket de S3 contiene archivos de configuración, siga estos pasos:

  1. Abra la consola de AWS Config.
  2. En el panel de navegación, seleccione Configuración.
  3. En la sección Bucket de Amazon S3, anote el nombre del bucket.
  4. Abra la consola de Amazon S3 y, a continuación, seleccione su bucket de S3.
  5. Compruebe que el bucket de S3 contenga archivos de configuración.
    Nota: Si no hay archivos de configuración, es posible que su rol de AWS Identity and Access Management (IAM) no tenga los permisos necesarios para Amazon S3.

Creación de una tabla en Athena

Utilice el editor de consultas de Amazon Athena para crear una tabla. En el editor de consultas, introduzca la siguiente instrucció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 > >
)
ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe' LOCATION 's3://BUCKET-NAME/AWSLogs/ACCOUNT-ID/Config/REGION/';

Nota: Sustituya la ubicación del bucket de S3 de ejemplo por la ubicación de su bucket de S3.

Si utiliza 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 tiene una gran cantidad de recursos, es posible que los CI almacenados en el bucket de S3 de AWS Config designado superen esta cuota. Por ejemplo, dado que AWS Config también entrega archivos de instantáneas de configuración en la misma ubicación del bucket, el archivo de instantáneas de configuración podría superar esta cuota.

Si supera la cuota, recibirá un error similar al siguiente después de consultar el CI:

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

Para evitar este problema, ejecute la siguiente instrucción de tabla para que Athena consulte directamente la ruta de 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: Sustituya la ubicación del bucket de S3 de ejemplo por la ubicación de su bucket de S3.

La instrucción de la tabla anterior crea particiones de la tabla de Athena con proyecciones de partición de /2021/1/1/ a/2121/12/31/.

Nota: El formato de fecha de ruta S3 de los datos de AWS Config no es compatible con el formato de tipo de fecha de proyección de particiones de Athena.

Ejemplos de consultas de Athena

El siguiente ejemplo de consulta recupera la cantidad de CI de cada día de 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

Resultado de ejemplo:

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

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

Resultado de ejemplo:

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

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 la misma región de AWS, puede producirse una discrepancia. Los datos que Athena consulta pueden superar los límites de un día y también incluir los CI que se facturan en meses adyacentes. AWS Config mide los CI en función del momento en que se inicia configurationItemCaptureTime.

Se recomienda aumentar en uno el día de finalización respecto al final del mes.

Por ejemplo, en la siguiente consulta, el día de finalización es el 28 de febrero:

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

actualice al final del día al 1 de marzo:

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

Consulta de AWS Config en un entorno de Control Tower

Como Control Tower coloca todos los registros de configuración en el mismo bucket de S3, puede consultar todas las cuentas de AWS Organizations.

Para crear una tabla para una configuración de Control Tower, ejecute una instrucción similar a la siguiente:

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

Nota: Agregue los ID de cada cuenta de su organización y sustituya todas las regiones por sus regiones.

La instrucción anterior crea automáticamente particiones para las cuentas, el año, el mes y el día. Para consultar el número de CI de un mes específico, ejecute la siguiente instrucción:

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

Para obtener el número de cambios de cada recurso en el mismo mes, ejecute la siguiente instrucción:

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

Información relacionada

Visualización del historial de conformidad de sus recursos de AWS con AWS Config

Precios de AWS Config

Precios de Amazon Athena

OFICIAL DE AWS
OFICIAL DE AWSActualizada hace 3 meses