Cloud Intelligence™Cloud Intelligence™

Cloud Intelligence™

Gestão de custos do AWS Config: insights e estratégias

By Nikhil PawarDec 23, 20248 min read

Esta página também está disponível em English, Deutsch, Español, Français, Italiano e 日本語.

Foto de SuPatMaN no Shutterstock

Antes de mais nada, vale dizer que o AWS Config é um excelente serviço. Se você ainda não conhece, o AWS Config avalia, monitora e registra continuamente as alterações de configuração dos recursos. Não vou listar todos os recursos do AWS Config, mas você pode ler mais sobre ele aqui. A seção de preços do AWS Config mostra como o serviço é cobrado e traz bons exemplos para facilitar o entendimento. Em resumo, a cobrança do AWS Config se baseia no número de itens de configuração registrados, no número de avaliações ativas de regras do AWS Config e no número de avaliações de conformance packs na sua conta, além de custos adicionais como armazenamento no S3 e SNS. Se a sua infraestrutura é dinâmica e passa por muitas alterações de configuração, os custos do AWS Config podem disparar. Este blog tem o objetivo de destrinchar os custos do AWS Config, apresentar estratégias para reduzi-los e dar dicas para investigar picos inesperados de custo.

OBSERVAÇÃO — Por questões de privacidade, vou usar meu ambiente de testes da AWS para a demonstração. Não tenho muitos dados de config, mas é o suficiente para entender a estratégia que apliquei.

  • Itens de configuração registrados — Veja os itens de configuração registrados pelo AWS Config no dashboard do AWS Config (imagem1) ou as mesmas métricas disponíveis no CloudWatch Metrics (imagem2).

imagem1 — Itens de configuração registrados — dashboard do AWS Config

imagem2 — Itens de configuração registrados — AWS CloudWatch Metrics

  • Bom, isso por si só não diz muita coisa, certo? Mas esses itens registrados podem variar de algumas centenas a alguns milhares por dia, dependendo do que está acontecendo na sua conta. Para entender melhor o que está sendo registrado, usei os dados gravados pelo AWS Config no meu bucket S3 configurado (imagem3) e tentei analisá-los com o serviço AWS Athena. Você encontra essa opção em AWS Config > Settings > Delivery Method.

imagem3 — S3 usado como método de entrega dos registros do AWS Config

  • Agora, se você acessar o S3, vai ver vários arquivos JSON entregues pelo AWS Config, organizados por ID da organização, ID da conta, região, mês, data etc., como no exemplo abaixo. O tamanho dos arquivos pode variar conforme os itens registrados pelo AWS Config.

Arquivos entregues pelo Config no S3

  • Em seguida, tentei ler esses arquivos para ver o que tinha dentro deles. Por exemplo, peguei só os 2 primeiros.
nikhilpawar@MacBookPro Downloads % cat xxxxxxxxxx_Config_us-east-1_ConfigHistory_AWS__AppConfig__DeploymentStrategy_20241029T013419Z_20241029T013419Z_1.json
{"fileVersion":"1.0","configurationItems":[{"relatedEvents":[],"relationships":[],"configuration":{"Id":"AppConfig.AllAtOnce","ReplicateTo":"NONE","GrowthType":"LINEAR","Description":"Quick","DeploymentDurationInMinutes":0,"GrowthFactor":100.0,"FinalBakeTimeInMinutes":10,"Name":"AppConfig.AllAtOnce","Tags":[]},"supplementaryConfiguration":{},"tags":{},"configurationItemVersion":"1.3","configurationItemCaptureTime":"2024-10-29T01:34:19.420Z","configurationStateId":1730165659420,"awsAccountId":"xxxxxxxxxx","configurationItemStatus":"ResourceDiscovered","resourceType":"AWS::AppConfig::DeploymentStrategy","resourceId":"AppConfig.AllAtOnce","resourceName":"AppConfig.AllAtOnce","ARN":"arn:aws:appconfig:us-east-1:xxxxxxxxxx:deploymentstrategy/AppConfig.AllAtOnce","awsRegion":"us-east-1","availabilityZone":"Regional","configurationStateMd5Hash":""},{"relatedEvents":[],"relationships":[],"configuration":{"Id":"AppConfig.Canary10Percent20Minutes","ReplicateTo":"NONE","GrowthType":"EXPONENTIAL","Description":"AWS Recommended","DeploymentDurationInMinutes":20,"GrowthFactor":10.0,"FinalBakeTimeInMinutes":10,"Name":"AppConfig.Canary10Percent20Minutes","Tags":[]},"supplementaryConfiguration":{},"tags":{},"configurationItemVersion":"1.3","configurationItemCaptureTime":"2024-10-29T01:34:19.546Z","configurationStateId":1730165659546,"awsAccountId":"xxxxxxxxxx","configurationItemStatus":"ResourceDiscovered","resourceType":"AWS::AppConfig::DeploymentStrategy","resourceId":"AppConfig.Canary10Percent20Minutes","resourceName":"AppConfig.Canary10Percent20Minutes","ARN":"arn:aws:appconfig:us-east-1:xxxxxxxxxx:deploymentstrategy/AppConfig.Canary10Percent20Minutes","awsRegion":"us-east-1","availabilityZone":"Regional","configurationStateMd5Hash":""},{"relatedEvents":[],"relationships":[],"configuration":{"Id":"AppConfig.Linear20PercentEvery6Minutes","ReplicateTo":"NONE","GrowthType":"LINEAR","Description":"AWS Recommended","DeploymentDurationInMinutes":30,"GrowthFactor":20.0,"FinalBakeTimeInMinutes":30,"Name":"AppConfig.Linear20PercentEvery6Minutes","Tags":[]},"supplementaryConfiguration":{},"tags":{},"configurationItemVersion":"1.3","configurationItemCaptureTime":"2024-10-29T01:34:19.625Z","configurationStateId":1730165659625,"awsAccountId":"xxxxxxxxxx","configurationItemStatus":"ResourceDiscovered","resourceType":"AWS::AppConfig::DeploymentStrategy","resourceId":"AppConfig.Linear20PercentEvery6Minutes","resourceName":"AppConfig.Linear20PercentEvery6Minutes","ARN":"arn:aws:appconfig:us-east-1:xxxxxxxxxx:deploymentstrategy/AppConfig.Linear20PercentEvery6Minutes","awsRegion":"us-east-1","availabilityZone":"Regional","configurationStateMd5Hash":""},{"relatedEvents":[],"relationships":[],"configuration":{"Id":"AppConfig.Linear50PercentEvery30Seconds","ReplicateTo":"NONE","GrowthType":"LINEAR","Description":"Test/Demo","DeploymentDurationInMinutes":1,"GrowthFactor":50.0,"FinalBakeTimeInMinutes":1,"Name":"AppConfig.Linear50PercentEvery30Seconds","Tags":[]},"supplementaryConfiguration":{},"tags":{},"configurationItemVersion":"1.3","configurationItemCaptureTime":"2024-10-29T01:34:19.475Z","configurationStateId":1730165659475,"awsAccountId":"xxxxxxxxxx","configurationItemStatus":"ResourceDiscovered","resourceType":"AWS::AppConfig::DeploymentStrategy","resourceId":"AppConfig.Linear50PercentEvery30Seconds","resourceName":"AppConfig.Linear50PercentEvery30Seconds","ARN":"arn:aws:appconfig:us-east-1:xxxxxxxxxx:deploymentstrategy/AppConfig.Linear50PercentEvery30Seconds","awsRegion":"us-east-1","availabilityZone":"Regional","configurationStateMd5Hash":""}]}%                                                  nikhilpawar@MacBookPro Downloads % cat xxxxxxxxxx_Config_us-east-1_ConfigHistory_AWS__AppConfig__DeploymentStrategy_20241029T013419Z_20241029T013419Z_1.json | jq
{
  "fileVersion": "1.0",
  "configurationItems": [\
    {\
      "relatedEvents": [],\
      "relationships": [],\
      "configuration": {\
        "Id": "AppConfig.AllAtOnce",\
        "ReplicateTo": "NONE",\
        "GrowthType": "LINEAR",\
        "Description": "Quick",\
        "DeploymentDurationInMinutes": 0,\
        "GrowthFactor": 100.0,\
        "FinalBakeTimeInMinutes": 10,\
        "Name": "AppConfig.AllAtOnce",\
        "Tags": []\
      },\
      "supplementaryConfiguration": {},\
      "tags": {},\
      "configurationItemVersion": "1.3",\
      "configurationItemCaptureTime": "2024-10-29T01:34:19.420Z",\
      "configurationStateId": 1730165659420,\
      "awsAccountId": "xxxxxxxxxx",\
      "configurationItemStatus": "ResourceDiscovered",\
      "resourceType": "AWS::AppConfig::DeploymentStrategy",\
      "resourceId": "AppConfig.AllAtOnce",\
      "resourceName": "AppConfig.AllAtOnce",\
      "ARN": "arn:aws:appconfig:us-east-1:xxxxxxxxxx:deploymentstrategy/AppConfig.AllAtOnce",\
      "awsRegion": "us-east-1",\
      "availabilityZone": "Regional",\
      "configurationStateMd5Hash": ""\
    },\
    {\
      "relatedEvents": [],\
      "relationships": [],\
      "configuration": {\
        "Id": "AppConfig.Canary10Percent20Minutes",\
        "ReplicateTo": "NONE",\
        "GrowthType": "EXPONENTIAL",\
        "Description": "AWS Recommended",\
        "DeploymentDurationInMinutes": 20,\
        "GrowthFactor": 10.0,\
        "FinalBakeTimeInMinutes": 10,\
        "Name": "AppConfig.Canary10Percent20Minutes",\
        "Tags": []\
      },\
      "supplementaryConfiguration": {},\
      "tags": {},\
      "configurationItemVersion": "1.3",\
      "configurationItemCaptureTime": "2024-10-29T01:34:19.546Z",\
      "configurationStateId": 1730165659546,\
      "awsAccountId": "xxxxxxxxxx",\
      "configurationItemStatus": "ResourceDiscovered",\
      "resourceType": "AWS::AppConfig::DeploymentStrategy",\
      "resourceId": "AppConfig.Canary10Percent20Minutes",\
      "resourceName": "AppConfig.Canary10Percent20Minutes",\
      "ARN": "arn:aws:appconfig:us-east-1:xxxxxxxxxx:deploymentstrategy/AppConfig.Canary10Percent20Minutes",\
      "awsRegion": "us-east-1",\
      "availabilityZone": "Regional",\
      "configurationStateMd5Hash": ""\
    },\
    {\
      "relatedEvents": [],\
      "relationships": [],\
      "configuration": {\
        "Id": "AppConfig.Linear50PercentEvery30Seconds",\
        "ReplicateTo": "NONE",\
        "GrowthType": "LINEAR",\
        "Description": "Test/Demo",\
        "DeploymentDurationInMinutes": 1,\
        "GrowthFactor": 50.0,\
        "FinalBakeTimeInMinutes": 1,\
        "Name": "AppConfig.Linear50PercentEvery30Seconds",\
        "Tags": []\
      },\
      "supplementaryConfiguration": {},\
      "tags": {},\
      "configurationItemVersion": "1.3",\
      "configurationItemCaptureTime": "2024-10-29T01:34:19.475Z",\
      "configurationStateId": 1730165659475,\
      "awsAccountId": "xxxxxxxxxx",\
      "configurationItemStatus": "ResourceDiscovered",\
      "resourceType": "AWS::AppConfig::DeploymentStrategy",\
      "resourceId": "AppConfig.Linear50PercentEvery30Seconds",\
      "resourceName": "AppConfig.Linear50PercentEvery30Seconds",\
      "ARN": "arn:aws:appconfig:us-east-1:xxxxxxxxxx:deploymentstrategy/AppConfig.Linear50PercentEvery30Seconds",\
      "awsRegion": "us-east-1",\
      "availabilityZone": "Regional",\
      "configurationStateMd5Hash": ""\
    }\
  ]
}
  • Bom, vai ser difícil ler os dados desses arquivos JSON manualmente ou via script. O melhor caminho é usar o AWS Athena. Outro serviço poderoso.
  • Crie a tabela no Athena — Ao criar tabelas no Athena para os dados do AWS Config, você pode personalizar as consultas conforme diferentes períodos e escopos de dados. A sintaxe de criação da tabela varia conforme o que você quer analisar:
  • Snapshot de um único dia
  • Dados que abrangem vários dias
  • Mês ou ano específico
  • Histórico completo de dados do Config

OBSERVAÇÃO — Substitua ‘xxxxxxxxxx’ pelo ID da sua conta AWS nas consultas a seguir. Outra recomendação: em vez de varrer todos os dados, busque apenas os do período que você precisa. (Preços do Athena)

1. Snapshot de um único dia

1.1:- Crie a tabela no Athena: ex.: aws_config_table_single_day_2024_11_08

CREATE EXTERNAL TABLE aws_config_table_single_day_2024_11_08 (
  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://config-bucket-xxxxxxxxxxxx/AWSLogs/xxxxxxxxxxxx/Config/us-east-1/2024/11/8';

1.1:- Tabela do Athena — snapshot de um único dia

1.2:- Conte o total de registros: (Opcional. Você pode conferir o total de registros, e ele deve bater com as métricas do CloudWatch que vimos no início.)

SELECT
  COUNT(1) AS record_count
FROM
  default.aws_config_table_single_day_2024_11_08
CROSS JOIN
  UNNEST(configurationitems) AS t(configurationItem)
WHERE
  configurationItem.resourceType IS NOT NULL

1.2:- Total de registros do dia

1.3:- Obtenha o tipo de recurso e o número de alterações registradas: A consulta a seguir ajuda a identificar os tipos de recursos que geram o maior número de alterações de configuração, permitindo localizar os principais responsáveis pelos custos no monitoramento do AWS Config.

SELECT
  configurationItem.resourceType,
  COUNT(configurationItem.resourceId) AS NumberOfChanges
FROM
  default.aws_config_table_single_day_2024_11_08
CROSS JOIN
  UNNEST(configurationitems) AS t(configurationItem)
GROUP BY
  configurationItem.resourceType
ORDER BY
  NumberOfChanges DESC;

1.3:- Tipos de recursos e número de alterações registradas

1.4:- Obtenha os IDs dos recursos: Para aprofundar a análise dos tipos de recursos com muitas alterações, dá para descer ao nível de recursos específicos. Por exemplo, a consulta anterior mostrou que AWS:EC2:Subnet tem o maior número de alterações de configuração. A consulta a seguir ajuda a identificar quais IDs de sub-rede específicos estão por trás dessa frequência de alterações.

SELECT
  configurationItem.resourceType,
  configurationItem.resourceId,
  COUNT(configurationItem.resourceId) AS NumberOfChanges
FROM
  default.aws_config_table_single_day_2024_11_08
CROSS JOIN
  UNNEST(configurationitems) AS t(configurationItem)
GROUP BY
  configurationItem.resourceType,
  configurationItem.resourceId
ORDER BY
  NumberOfChanges DESC

1.4:- IDs de recursos identificados

Isso já dá uma ideia clara do que está acontecendo. Os mesmos padrões de consulta podem ser aplicados a diferentes intervalos de tempo. Seja para analisar tendências mensais, intervalos específicos de datas ou todo o histórico do Config, basta ajustar os parâmetros de tempo e manter a mesma abordagem analítica.

2. Mês específico

2.1:- Crie a tabela no Athena: ex.: aws_config_table_november_2024

CREATE EXTERNAL TABLE aws_config_table_november_2024 (
  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://config-bucket-xxxxxxxxxxxx/AWSLogs/xxxxxxxxxxxx/Config/us-east-1/2024/10/';

2.1:- Tabela do Athena — dados de um mês

2.2:- Conte o total de registros: Consulte o passo 1.2 (Conte o total de registros) e atualize o nome da tabela.

2.2:- Total de registros do mês

2.3:- Obtenha o tipo de recurso e o número de alterações registradas: Consulte o passo 1.3 (Obtenha o tipo de recurso e o número de alterações registradas) e atualize o nome da tabela.

2.3:- Tipos de recursos e número de alterações registradas

2.4:- Obtenha os IDs dos recursos: Consulte o passo 1.4 (Obtenha os IDs dos recursos) e atualize o nome da tabela.

2.4:- IDs de recursos identificados

3. Todos os dados do Config

3.1:- Crie a tabela no Athena: ex.: aws_config_table_all

CREATE EXTERNAL TABLE aws_config_table_all (
  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://config-bucket-XXXXXXXXXXXX/AWSLogs/XXXXXXXXXXXX/Config/us-east-1/';

3.1:- Tabela do Athena — todos os dados do config

3.2:- Total de registros: Consulte o passo 1.2 (Conte o total de registros) e atualize o nome da tabela.

3.2:- Total de registros

3.3:- Obtenha o tipo de recurso e o número de alterações registradas: Consulte o passo 1.3 (Obtenha o tipo de recurso e o número de alterações registradas) e atualize o nome da tabela.

3.3:- Tipos de recursos e número de alterações registradas

3.4:- Obtenha os IDs dos recursos: Consulte o passo 1.4 (Obtenha os IDs dos recursos) e atualize o nome da tabela.

3.4:- IDs de recursos identificados

4. Dados que abrangem vários dias

4.1 Crie a tabela no Athena: Nesse cenário, vamos particionar a tabela do Athena usando projeção de partições de 07/11/2024 a 10/11/2024. Personalize esse período conforme necessário.

CREATE EXTERNAL TABLE aws_config_table_period_2024_11_07to2024_11_10 (
  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://config-bucket-xxxxxxxxxxxx/AWSLogs/xxxxxxxxxxxx/Config/us-east-1'
TBLPROPERTIES (
  'projection.enabled'='true',
  'projection.year.interval'='1',
  'projection.year.range'='2024,2024',
  'projection.year.type'='integer',
  'projection.month.interval'='1',
  'projection.month.range'='10,11',
  'projection.month.type'='integer',
  'projection.day.interval'='1',
  'projection.day.range'='7,10',
  'projection.day.type'='integer',
  'storage.location.template'='s3://config-bucket-xxxxxxxxxxxx/AWSLogs/xxxxxxxxxxxx/Config/us-east-1/${year}/${month}/${day}/ConfigHistory/')

4.1:- Tabela do Athena — período selecionado

4.2:- Total de registros:

SELECT result.configurationitemcapturetime,
         count(result.configurationitemcapturetime) AS NumberOfChanges
FROM
    (SELECT regexp_replace(configurationItem.configurationItemCaptureTime,
         '(.+)(T.+)', '$1') AS configurationitemcapturetime
    FROM default.aws_config_table_period_2024_11_07to2024_11_10
    CROSS JOIN UNNEST(configurationitems) AS t(configurationItem)
    WHERE "$path" LIKE '%ConfigHistory%'
            AND configurationItem.configurationItemCaptureTime >= '2024-11-05T%'
            AND configurationItem.configurationItemCaptureTime <= '2024-11-12T%') result
GROUP BY  result.configurationitemcapturetime
ORDER BY  result.configurationitemcapturetime

4.2:- Total de registros

4.3:- Obtenha o tipo de recurso e o número de alterações registradas:

SELECT configurationItem.resourceType,
       configurationItem.resourceId,
       COUNT(configurationItem.resourceId) AS NumberOfChanges
FROM default.aws_config_table_period_2024_11_07to2024_11_10
CROSS JOIN UNNEST(configurationitems) AS t(configurationItem)
WHERE "$path" LIKE '%ConfigHistory%'
        AND configurationItem.configurationItemCaptureTime >= '2024-11-05T%'
        AND configurationItem.configurationItemCaptureTime <= '2024-11-12T%'
GROUP BY  configurationItem.resourceType, configurationItem.resourceId
ORDER BY  NumberOfChanges DESC

### ou ###

SELECT configurationItem.resourceType,
       configurationItem.resourceId,
       CAST(COUNT(configurationItem.resourceId) AS INTEGER) AS NumberOfChanges
FROM default.aws_config_table_period_2024_11_07to2024_11_10
CROSS JOIN UNNEST(configurationitems) AS t(configurationItem)
WHERE "$path" LIKE '%ConfigHistory%'
      AND configurationItem.configurationItemCaptureTime >= '2024-11-05T%'
      AND configurationItem.configurationItemCaptureTime <= '2024-11-12T%'
GROUP BY configurationItem.resourceType, configurationItem.resourceId
ORDER BY NumberOfChanges DESC

4.3:- Tipos de recursos e número de alterações registradas

4.4:- Obtenha os IDs dos recursos

SELECT configurationItem.resourceId,
       configurationItem.resourceType,
       COUNT(configurationItem.resourceId) AS NumberOfChanges
FROM default.aws_config_table_period_2024_11_07to2024_11_10
CROSS JOIN UNNEST(configurationitems) AS t(configurationItem)
WHERE "$path" LIKE '%ConfigHistory%'
      AND configurationItem.configurationItemCaptureTime >= '2024-11-05T%'
      AND configurationItem.configurationItemCaptureTime <= '2024-11-12T%'
GROUP BY
     configurationItem.resourceId,
     configurationItem.resourceType
ORDER BY NumberOfChanges DESC

4.4:- IDs de recursos identificados

  • Pronto, agora você já identificou o ID e o tipo do recurso com mais itens registrados no período desejado.

Desde junho de 2023, o AWS Config oferece suporte à exclusão do registro por tipo de recurso. Com isso, você pode reavaliar suas configurações por tipo de recurso e ajustá-las conforme necessário, ou investigar picos atípicos de custo em dias específicos.

Recursos registrados

Outro ponto que vale destacar é o período de retenção de dados. Você pode ajustá-lo conforme suas necessidades.

Período de retenção

Em resumo, o AWS Config é um serviço poderoso, mas pode ficar caro rapidamente, sobretudo em ambientes dinâmicos. Com abordagens estratégicas como analisar os registros de itens de configuração, usar o AWS Athena para investigações detalhadas, aproveitar a exclusão de registro de configuração e gerenciar com cuidado os períodos de retenção de dados, as organizações conseguem ter uma visão granular dos seus custos de AWS Config sem abrir mão de uma visibilidade robusta da infraestrutura. O segredo não é eliminar o monitoramento, e sim otimizar como e o que você acompanha. Ao entender os padrões de mudança dos seus recursos e registrar as configurações de forma seletiva, dá para equilibrar um monitoramento abrangente com uma gestão econômica.

Se você quer extrair o máximo do seu AWS Config ou tem interesse nos nossos serviços, fique à vontade para entrar em contato. Fale com a gente aqui.