Ir para o conteúdo

Como posso usar o número de CIs registrados por mês para entender o faturamento do AWS Config?

7 minuto de leitura
0

Quero recuperar o número de itens de configuração (CIs) que o AWS Config registrou. Depois, quero usar essas informações para entender meu faturamento do AWS Config.

Resolução

Para ajudar a identificar as tendências de faturamento passadas e atuais, use o Amazon Athena para identificar o número de CIs por mês da conta.

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

O serviço AWS Config deve ser capaz de entregar arquivos de histórico de configuração ao seu bucket designado do Amazon Simple Storage Service (Amazon S3). O AWS Config entrega CIs ao bucket como arquivos de histórico de configuração a cada 6 horas. Para mais informações, consulte Viewing Compliance History for your AWS Resources with AWS Config (Visualizar o histórico de conformidade dos recursos da AWS com o AWS Config).

Conclua as etapas a seguir:

  1. Abra o console do AWS Config.
  2. No painel de navegação, selecione Configurações.
  3. Na seção Bucket do Amazon S3, anote o Nome do bucket.
  4. Abra o console do Amazon S3.
  5. No painel de navegação, escolha Buckets e, em seguida, escolha seu bucket do S3.
  6. Analise o bucket do S3 para ver os arquivos de configuração.
    Observação: se não houver arquivos de configuração, talvez seu perfil não tenha permissão. Para obter mais informações, consulte AWS Identity and Access Management (AWS IAM) para Amazon S3.

Criar uma tabela no Athena

Abra o console do Athena. Em seguida, crie uma tabela com a sintaxe do seu ambiente.

Importante: na sintaxe da tabela a seguir, substitua LOCATION pelo local e pela região da AWS para os itens do AWS Config armazenados em seu bucket do S3. Em BUCKET-NAME, ACCOUNT-ID, REGION e ORG-ID, use suas informações específicas.

Para implementação padrão do AWS Config

Use a seguinte sintaxe de tabela:

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 a versão 2 do mecanismo Athena

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 muitos recursos, os itens do AWS Config armazenados no bucket designado do S3 podem exceder esse limite. Por exemplo, 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 esse limite. Se você exceder o limite, receberá um erro semelhante ao seguinte ao consultar o item do AWS Config:

"HIVE_BAD_DATA: Line too long in text file: <s3_path_to_config_data_object>"

Nesse caso, use a sintaxe da tabela a seguir para que o Athena consulte diretamente o caminho do Amazon 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: o exemplo de tabela a seguir particiona a tabela Athena com projeção de partições de /2021/1/1/ a /2121/12/31/. Atualize essas partições com base em seus requisitos. O formato de data do caminho do Amazon S3 de dados do AWS Config não é compatível com o formato de data da projeção de partições do Athena.

Para ambientes da AWS Control Tower

Se você usa a AWS Control Tower, para acomodar a estrutura da conta, use a seguinte sintaxe de tabela para criar a tabela do 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

Exemplo de consultas do Athena

O exemplo de consulta a seguir recupera o número de alterações por 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

Quando você exclui certos tipos de recursos do AWS Config Recorder, este ainda registra a criação e a exclusão desses recursos. Essas gravações são feitas sem nenhum custo. Os CIs de recursos incluem os seguintes status para o campo configurationItemStatus:

  • ResourceNotRecorded
  • ResourceDeletedNotRecorded

As gravações também incluem metadados básicos, como resource-id, ARN e CI, mas não incluem informações de relacionamento e configuração de recursos.

Observação: essa consulta ainda conta as informações do ResourceNotRecorded. Para excluir essas informações, execute a seguinte 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

Os resultados são semelhantes ao exemplo a seguir:

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

O exemplo de consulta a seguir recupera o número de itens de configuração por dia em 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

Observação: para filtrar recursos não registrados, é possível adicionar a seguinte cláusula adicional antes da opção GROUP BY:

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

Os resultados são semelhantes ao exemplo a seguir:

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

Observação: ao comparar o número de CIs entre os resultados da consulta do Athena e os dados de faturamento da AWS para o mesmo mês e região, pode haver uma discrepância. Os dados consultados pelo Athena podem ultrapassar os limites do dia e incluir CIs faturados em meses próximos. Os CIs do AWS Config são medidos com base em quando você iniciou configurationItemCaptureTime.

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

Por exemplo, é possível alterar a consulta original para a consulta atualizada a seguir.

Consulta original:

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

Consulta atualizada:

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

Observação: o último dia do mês é incrementado em um dia.

Informações relacionadas

Preços do AWS Config

Preços do Amazon Athena

Recording AWS Resources with AWS Config (Registrar recursos AWS com o AWS Config)

AWS OFICIALAtualizada há 4 meses