Detectar implantações e configurações do Lambda não compatíveis com o AWS Config - AWS Lambda

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:

The three implementation phases are identify, notify, and deploy remediation.

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 propriedade layers 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ção some configuration.layers[*].arn != CONFIG_RULE_PARAMETERS.OldLayerArn verifica se algum dos ARNs de camada do Lambda não corresponde ao valor OldLayerArn. 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 para consultar esses dados diretamente nos buckets do S3. Com o Athena, você pode agregar esses dados no nível da organização, gerando uma visão holística das configurações dos recursos em todas as suas contas. Para definir a agregação de dados de configuração de recursos, consulte Visualizing AWS Config data using Athena and Amazon QuickSight no AWS Cloud Operations and Management Blog.

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:

Query results in Athena console.

Com os dados do AWS Config agregados em toda a organização, você pode criar um painel usando o Amazon QuickSight. Ao importar os resultados do Athena para o Amazon QuickSight, você pode visualizar até que ponto as funções do Lambda aderem à regra de versão da camada. Esse painel pode destacar recursos em conformidade e fora de conformidade, o que ajuda você a determinar sua política de aplicação, conforme descrito na próxima seção. A imagem a seguir é um exemplo de painel que relata a distribuição das versões de camadas aplicadas às funções dentro da organização.

Example Amazon QuickSight dashboard shows distribution of layer versions in Lambda functions.

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.