Detectar implantações e configurações do Lambda não compatíveis com o AWS Config
Além da avaliação proativa, o AWS Config também pode detectar de forma reativa implantações e configurações de recursos que não estejam em conformidade com suas políticas de governança. Isso é importante porque as políticas de governança evoluem à medida que a organização aprende e implementa novas melhores práticas.
Considere um cenário em que você define uma política totalmente nova ao implantar ou atualizar as funções do Lambda: todas as funções do Lambda devem sempre usar uma versão específica e aprovada da camada do Lambda. Você pode configurar o AWS Config para monitorar funções novas ou atualizadas para configurações de camadas. Se o AWS Config detectar uma função que não está usando uma versão de camada aprovada, ele sinalizará a função como um recurso fora de conformidade. Opcionalmente, você pode configurar o AWS Config para remediar automaticamente o recurso ao especificar uma ação de remediação usando um documento de automação do AWS Systems Manager. Por exemplo, você pode criar um documento de automação em Python usando o AWS SDK for Python (Boto3), que atualiza a função fora de conformidade para apontar para a versão da camada aprovada. Portanto, o AWS Config funciona como um controle de detecção e correção, automatizando o gerenciamento da conformidade.
Vamos detalhar esse processo em três fases importantes de implementação:
Fase 1: identificar os recursos de acesso
Comece ativando o AWS Config em todas as contas e configurando-o para registrar as funções do AWS Lambda. Isso permite que o AWS Config observe quando as funções do Lambda são criadas ou atualizadas. Em seguida, você pode configurar regras de política personalizadas para verificar violações de políticas específicas, que usam a sintaxe AWS CloudFormation Guard. As regras de proteção assumem a seguinte forma geral:
rule name when condition { assertion }
A seguir, é mostrado um exemplo de regra que verifica se uma camada não está configurada para uma versão antiga da camada:
rule desiredlayer when configuration.layers !empty { some configuration.layers[*].arn != CONFIG_RULE_PARAMETERS.OldLayerArn }
Vamos entender a sintaxe e a estrutura da regra:
-
Nome da regra: o nome da regra no exemplo fornecido é
desiredlayer
. -
Condição: essa cláusula especifica a condição segundo a qual a regra deve ser verificada. No exemplo fornecido, a condição é
configuration.layers !empty
. Isso significa que o recurso deve ser avaliado somente quando a propriedadelayers
na configuração não está vazia. -
Afirmação: após a cláusula
when
, uma declaração determina o que a regra verifica. A declaraçãosome configuration.layers[*].arn != CONFIG_RULE_PARAMETERS.OldLayerArn
verifica se algum dos ARNs de camada do Lambda não corresponde ao valorOldLayerArn
. Se não houver correspondência, a declaração será verdadeira e a regra será aprovada; caso contrário, ela será reprovada.
CONFIG_RULE_PARAMETERS
é um conjunto especial de parâmetros configurado com a regra AWS Config. Nesse caso, OldLayerArn
é um parâmetro dentro de CONFIG_RULE_PARAMETERS
. Isso permite que os usuários forneçam um ARN específico que considerem antigo ou desativado e, em seguida, a regra verifica se alguma função do Lambda está usando este ARN antigo.
Fase 2: visualizar e projetar
O AWS Config reúne os dados de configuração e os armazena em buckets do Amazon Simple Storage Service (Amazon S3). Você pode usar o Amazon Athena
Veja a seguir um exemplo de consulta do Athena para identificar todas as funções do Lambda que usam um ARN de camada específico:
WITH unnested AS ( SELECT item.awsaccountid AS account_id, item.awsregion AS region, item.configuration AS lambda_configuration, item.resourceid AS resourceid, item.resourcename AS resourcename, item.configuration AS configuration, json_parse(item.configuration) AS lambda_json FROM default.aws_config_configuration_snapshot, UNNEST(configurationitems) as t(item) WHERE "dt" = 'latest' AND item.resourcetype = 'AWS::Lambda::Function' ) SELECT DISTINCT region as Region, resourcename as FunctionName, json_extract_scalar(lambda_json, '$.memorySize') AS memory_size, json_extract_scalar(lambda_json, '$.timeout') AS timeout, json_extract_scalar(lambda_json, '$.version') AS version FROM unnested WHERE lambda_configuration LIKE '%arn:aws:lambda:us-east-1:111122223333:layer:AnyGovernanceLayer:24%'
Veja os resultados da consulta:
Com os dados do AWS Config agregados em toda a organização, você pode criar um painel usando o Amazon QuickSight
Fase 3: implementar e aplicar
Agora você pode, opcionalmente, emparelhar sua regra de versão de camada criada na fase 1 com uma ação de remediação por meio de um documento de automação do Systems Manager, que você cria como um script em Python escrito com o AWS SDK for Python (Boto3). O script chama a ação de API UpdateFunctionConfiguration para cada função do Lambda, atualizando a configuração da função com o novo ARN da camada. Como alternativa, você pode fazer com que o script envie uma solicitação pull para o repositório do código para atualizar o ARN da camada. Dessa forma, futuras implantações de código também serão atualizadas com o ARN correto da camada.