Como faço para recuperar o número de itens de configuração que o AWS Config registra a cada mês?

6 minuto de leitura
0

Quero encontrar o número de itens de configuração (ICs) que o AWS Config registra para que eu possa entender o faturamento da minha conta da AWS.

Resolução

Use o Amazon Athena para identificar o número de ICs por mês da sua conta.

Verifique se seu bucket do Amazon S3 contém arquivos de configuração

Verifique se o AWS Config consegue entregar arquivos de histórico de configuração ao bucket designado do Amazon Simple Storage Service (Amazon S3). Normalmente, o AWS Config entrega ao bucket arquivos de histórico de configuração a cada 6 horas.

Para verificar se seu bucket do S3 contém arquivos de configuração, conclua as seguintes etapas:

  1. Abra o console do AWS Config.
  2. No painel de navegação, escolha Configurações.
  3. Na seção Bucket do Amazon S3, anote o nome do bucket.
  4. Abra o console do Amazon S3 e, em seguida, selecione seu bucket do S3.
  5. Verifique se o bucket do S3 contém arquivos de configuração.
    Observação: se não houver arquivos de configuração, o perfil do AWS Identity and Access Management (IAM) pode não ter as permissões necessárias para o Amazon S3.

Criar uma tabela no Athena

Use o editor de consultas do Amazon Athena para criar uma tabela. No editor de consultas, insira a seguinte instrução:

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

Observação: substitua o exemplo de localização do bucket do S3 pela localização do bucket do S3.

Se você estiver usando a versão 2 do mecanismo Athena, o comprimento máximo de linha para arquivos de texto é de 100 MB. Se você tiver um grande número de recursos, os ICs armazenados no bucket designado do AWS Config S3 podem exceder essa cota. Por exemplo, como o AWS Config também envia arquivos de snapshot de configuração na mesma localização do bucket, e o arquivo de snapshot de configuração pode exceder essa cota.

Se exceder essa cota, você receberá um erro semelhante ao seguinte depois de consultar o CI:

"HIVE_BAD_DATA: Linha muito longa no arquivo de texto: s3_path_to_config_data_object"

Para evitar esse problema, execute a instrução da tabela a seguir para que o Athena consulte diretamente o caminho do S3 que armazena os arquivos do histórico de configuração:

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

Observação: substitua o exemplo de localização do bucket do S3 pela localização do bucket do S3.

A instrução da tabela anterior particiona a tabela do Athena com projeções de partição de /2021/1/1/ a /2121/12/31/.

Observação: o formato de data do caminho S3 dos dados do AWS Config não é compatível com o formato do tipo de data de projeção das partições do Athena.

Exemplo de consultas do Athena

O exemplo de consulta a seguir recupera o número de ICs para cada dia de fevereiro 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

Exemplo de saída:

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

o exemplo de consulta a seguir recupera o número de alterações por cada recurso em fevereiro de 2021, classificadas pelas alterações mais frequentes:

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

Exemplo de saída:

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

Observação: ao comparar o número total de ICs entre as saídas da consulta do Athena e os dados de faturamento da AWS para o mesmo mês e região AWS, pode haver uma discrepância. Os dados consultados pelo Athena podem ultrapassar os limites do dia e também incluir ICs cobrados em meses próximos. O AWS Config mede os ICs com base no momento em que configurationItemCaptureTime é iniciado.

A prática recomendada é incrementar o dia final especificado a partir do final do mês em um.

Por exemplo, na consulta a seguir, o dia final é 28 de fevereiro:

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

Atualize o final do dia para 1.º de março:

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

Consultar o AWS Config em um ambiente do Control Tower

Como o Control Tower coloca todos os logs de configuração no mesmo bucket do S3, é possível consultar todas as contas nas AWS Organizations.

Para criar uma tabela para uma configuração do Control Tower, execute uma instrução semelhante à seguinte:

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

Observação: adicione os IDs de cada conta em sua organização e substitua todas as regiões por suas regiões.

A instrução anterior cria automaticamente partições para contas, ano, mês e dia. Para consultar o número de ICs de um mês específico, execute a seguinte instrução:

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 obter o número de alterações de cada recurso do mesmo mês, execute a seguinte instrução:

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

Informações relacionadas

Visualizar o histórico de conformidade dos recursos da AWS com o AWS Config

Preços do AWS Config

Preços do Amazon Athena

AWS OFICIAL
AWS OFICIALAtualizada há 4 meses