Cloud & Infraestrutura

CloudWatch Container Insights e Lambda Insights na Prática: Do Básico ao Avançado

9 min de leitura

CloudWatch Container Insights e Lambda Insights na Prática: Do Básico ao Avançado

CloudWatch Container Insights: Observabilidade para Contêineres Container Insights é a solução nativa da AWS para monitorar aplicações containerizadas em ECS e EKS. Diferentemente de métricas padrão, ele oferece visibilidade profunda sobre CPU, memória, I/O de disco e comportamento de rede no nível de container, task e cluster. O agente CloudWatch é implantado como sidecar ou DaemonSet, coletando métricas detalhadas e enviando-as para o CloudWatch Logs e Metrics. Para ativar Container Insights em um cluster ECS, você precisa configurar o task definition com o agente de monitoramento. Abaixo, um exemplo prático de task definition para uma aplicação Node.js com monitoramento habilitado: Consultando Métricas com Insights Após ativar o monitoramento, você pode consultar métricas usando CloudWatch Logs Insights. Este exemplo retorna o uso de memória médio por container: --- Lambda Insights: Monitoramento de Funções Serverless Lambda Insights oferece observabilidade automática para funções Lambda sem necessidade de instrumentação manual complexa. A extensão do CloudWatch é anexada à função, capturando métricas de performance, erros,

<h2>CloudWatch Container Insights: Observabilidade para Contêineres</h2>

<p>Container Insights é a solução nativa da AWS para monitorar aplicações containerizadas em ECS e EKS. Diferentemente de métricas padrão, ele oferece visibilidade profunda sobre CPU, memória, I/O de disco e comportamento de rede no nível de container, task e cluster. O agente CloudWatch é implantado como sidecar ou DaemonSet, coletando métricas detalhadas e enviando-as para o CloudWatch Logs e Metrics.</p>

<p>Para ativar Container Insights em um cluster ECS, você precisa configurar o task definition com o agente de monitoramento. Abaixo, um exemplo prático de task definition para uma aplicação Node.js com monitoramento habilitado:</p>

<pre><code class="language-json">{

&quot;family&quot;: &quot;minha-app-com-insights&quot;,

&quot;networkMode&quot;: &quot;awsvpc&quot;,

&quot;requiresCompatibilities&quot;: [&quot;FARGATE&quot;],

&quot;cpu&quot;: &quot;256&quot;,

&quot;memory&quot;: &quot;512&quot;,

&quot;containerDefinitions&quot;: [

{

&quot;name&quot;: &quot;app&quot;,

&quot;image&quot;: &quot;minha-conta.dkr.ecr.us-east-1.amazonaws.com/minha-app:latest&quot;,

&quot;portMappings&quot;: [{&quot;containerPort&quot;: 3000, &quot;protocol&quot;: &quot;tcp&quot;}],

&quot;logConfiguration&quot;: {

&quot;logDriver&quot;: &quot;awslogs&quot;,

&quot;options&quot;: {

&quot;awslogs-group&quot;: &quot;/ecs/minha-app&quot;,

&quot;awslogs-region&quot;: &quot;us-east-1&quot;,

&quot;awslogs-stream-prefix&quot;: &quot;ecs&quot;

}

}

},

{

&quot;name&quot;: &quot;cloudwatch-agent&quot;,

&quot;image&quot;: &quot;amazon/cloudwatch-agent:latest&quot;,

&quot;cpu&quot;: 64,

&quot;memory&quot;: 128,

&quot;logConfiguration&quot;: {

&quot;logDriver&quot;: &quot;awslogs&quot;,

&quot;options&quot;: {

&quot;awslogs-group&quot;: &quot;/ecs/cloudwatch-agent&quot;,

&quot;awslogs-region&quot;: &quot;us-east-1&quot;,

&quot;awslogs-stream-prefix&quot;: &quot;ecs&quot;

}

},

&quot;environment&quot;: [

{&quot;name&quot;: &quot;USE_DEFAULT_CONFIG&quot;, &quot;value&quot;: &quot;True&quot;},

{&quot;name&quot;: &quot;CW_CONFIG_CONTENT&quot;, &quot;value&quot;: &quot;{\&quot;metrics\&quot;: {\&quot;namespace\&quot;: \&quot;ContainerInsights\&quot;, \&quot;metrics_collected\&quot;: {\&quot;cpu\&quot;: {\&quot;measurement\&quot;: [{\&quot;name\&quot;: \&quot;cpu_usage_idle\&quot;, \&quot;rename\&quot;: \&quot;CPU_IDLE\&quot;}], \&quot;metrics_collection_interval\&quot;: 60}, \&quot;mem\&quot;: {\&quot;measurement\&quot;: [{\&quot;name\&quot;: \&quot;mem_used_percent\&quot;}], \&quot;metrics_collection_interval\&quot;: 60}}}}&quot;}

]

}

]

}</code></pre>

<h3>Consultando Métricas com Insights</h3>

<p>Após ativar o monitoramento, você pode consultar métricas usando CloudWatch Logs Insights. Este exemplo retorna o uso de memória médio por container:</p>

<pre><code class="language-sql">fields @timestamp, ContainerName, MemoryUtilized, MemoryReserved

stats avg(MemoryUtilized) as avg_memory_mb by ContainerName | sort avg_memory_mb desc</code></pre>

<p>---</p>

<h2>Lambda Insights: Monitoramento de Funções Serverless</h2>

<p>Lambda Insights oferece observabilidade automática para funções Lambda sem necessidade de instrumentação manual complexa. A extensão do CloudWatch é anexada à função, capturando métricas de performance, erros, duração e consumo de memória em tempo real. É essencial para identificar gargalos e otimizar custos em arquiteturas serverless.</p>

<p>Habilitar Lambda Insights é simples: você adiciona a camada da extensão e configura as permissões IAM. Aqui está uma função Python com Lambda Insights integrado:</p>

<pre><code class="language-python">import json

import logging

from aws_lambda_powertools import Logger, Tracer, Metrics

from aws_lambda_powertools.utilities.typing import LambdaContext

logger = Logger()

tracer = Tracer()

metrics = Metrics()

@logger.inject_lambda_context

@tracer.capture_lambda_handler

@metrics.log_cold_start_metric

def lambda_handler(event: dict, context: LambdaContext) -&gt; dict:

&quot;&quot;&quot;

Função com observabilidade automática via Powertools

&quot;&quot;&quot;

metrics.add_metric(name=&quot;ProcessedRecords&quot;, unit=&quot;Count&quot;, value=1)

try:

Simular processamento

records = event.get(&#039;Records&#039;, [])

processed = len(records)

logger.info(f&quot;Processando {processed} registros&quot;, extra={&quot;records&quot;: records})

metrics.add_metric(name=&quot;SuccessfulRecords&quot;, unit=&quot;Count&quot;, value=processed)

return {

&#039;statusCode&#039;: 200,

&#039;body&#039;: json.dumps({&#039;message&#039;: &#039;Sucesso&#039;, &#039;processed&#039;: processed})

}

except Exception as e:

logger.exception(&quot;Erro ao processar registros&quot;)

metrics.add_metric(name=&quot;FailedRecords&quot;, unit=&quot;Count&quot;, value=1)

raise</code></pre>

<p>Para ativar Lambda Insights via CloudFormation:</p>

<pre><code class="language-yaml">Resources:

MinhaFuncaoLambda:

Type: AWS::Lambda::Function

Properties:

FunctionName: minha-funcao-insights

Runtime: python3.11

Handler: index.lambda_handler

Code:

ZipFile: |

código aqui

Layers:

  • !Sub &quot;arn:aws:lambda:${AWS::Region}:580254703988:layer:LambdaInsightsExtension:21&quot;

Role: !GetAtt RoleExecucao.Arn

RoleExecucao:

Type: AWS::IAM::Role

Properties:

AssumeRolePolicyDocument:

Version: &#039;2012-10-17&#039;

Statement:

  • Effect: Allow

Principal:

Service: lambda.amazonaws.com

Action: sts:AssumeRole

ManagedPolicyArns:

  • arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
  • arn:aws:iam::aws:policy/CloudWatchLambdaInsightsExecutionRolePolicy</code></pre>

<h3>Analisando Dados de Lambda Insights</h3>

<p>Consulte métricas de execução com este comando AWS CLI:</p>

<pre><code class="language-bash">aws cloudwatch get-metric-statistics \

--namespace &quot;AWS/Lambda&quot; \

--metric-name &quot;Duration&quot; \

--dimensions Name=FunctionName,Value=minha-funcao-insights \

--start-time 2024-01-15T00:00:00Z \

--end-time 2024-01-15T23:59:59Z \

--period 300 \

--statistics Average,Maximum,Minimum</code></pre>

<p>---</p>

<h2>Integração Avançada: Alertas e Dashboards</h2>

<p>Combinar Container Insights e Lambda Insights em um dashboard centralizado amplifica o valor da observabilidade. Criar alarmes inteligentes que correlacionam eventos de múltiplos serviços permite detecção proativa de problemas.</p>

<p>Exemplo de alarme CloudWatch que monitora taxa de erro em Lambda combinada com memória crítica em containers:</p>

<pre><code class="language-python">import boto3

cw = boto3.client(&#039;cloudwatch&#039;)

Alarme para Lambda

cw.put_metric_alarm(

AlarmName=&#039;Lambda-HighErrorRate&#039;,

MetricName=&#039;Errors&#039;,

Namespace=&#039;AWS/Lambda&#039;,

Statistic=&#039;Sum&#039;,

Period=300,

EvaluationPeriods=1,

Threshold=10,

ComparisonOperator=&#039;GreaterThanThreshold&#039;,

Dimensions=[{&#039;Name&#039;: &#039;FunctionName&#039;, &#039;Value&#039;: &#039;minha-funcao-insights&#039;}],

AlarmActions=[&#039;arn:aws:sns:us-east-1:123456789:alertas-producao&#039;]

)

Alarme para Container

cw.put_metric_alarm(

AlarmName=&#039;Container-HighMemoryUsage&#039;,

MetricName=&#039;MemoryUtilized&#039;,

Namespace=&#039;ContainerInsights&#039;,

Statistic=&#039;Average&#039;,

Period=60,

EvaluationPeriods=2,

Threshold=400,

ComparisonOperator=&#039;GreaterThanThreshold&#039;,

Dimensions=[{&#039;Name&#039;: &#039;ClusterName&#039;, &#039;Value&#039;: &#039;meu-cluster&#039;}],

AlarmActions=[&#039;arn:aws:sns:us-east-1:123456789:alertas-producao&#039;]

)</code></pre>

<p>Dashboard unificado em JSON para visualizar ambos os serviços:</p>

<pre><code class="language-json">{

&quot;widgets&quot;: [

{

&quot;type&quot;: &quot;metric&quot;,

&quot;properties&quot;: {

&quot;metrics&quot;: [

[&quot;AWS/Lambda&quot;, &quot;Duration&quot;, {&quot;stat&quot;: &quot;Average&quot;}],

[&quot;AWS/Lambda&quot;, &quot;Errors&quot;, {&quot;stat&quot;: &quot;Sum&quot;}],

[&quot;ContainerInsights&quot;, &quot;MemoryUtilized&quot;, {&quot;stat&quot;: &quot;Average&quot;}],

[&quot;ContainerInsights&quot;, &quot;CPUUtilized&quot;, {&quot;stat&quot;: &quot;Average&quot;}]

],

&quot;period&quot;: 300,

&quot;stat&quot;: &quot;Average&quot;,

&quot;region&quot;: &quot;us-east-1&quot;,

&quot;title&quot;: &quot;Visão Geral: Lambda + Containers&quot;

}

}

]

}</code></pre>

<p>---</p>

<h2>Conclusão</h2>

<p><strong>Pontos-chave aprendidos nesta aula:</strong></p>

<ol>

<li><strong>Container Insights</strong> fornece observabilidade em nível de container/task através de um agente sidecar, essencial para detectar problemas de performance em aplicações containerizadas antes que afetem usuários.</li>

</ol>

<ol>

<li><strong>Lambda Insights</strong> automatiza a coleta de métricas serverless, e combinado com AWS Lambda Powertools, oferece observabilidade robusta sem overhead significativo de código.</li>

</ol>

<ol>

<li><strong>Integração e alertas</strong> transformam dados em ação — correlacionar eventos entre containers e funções Lambda permite identificar padrões complexos de falha e otimizar arquiteturas híbridas com precisão.</li>

</ol>

<p>---</p>

<h2>Referências</h2>

<ul>

<li><a href="https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/ContainerInsights.html" target="_blank" rel="noopener noreferrer">AWS CloudWatch Container Insights Documentation</a></li>

<li><a href="https://docs.aws.amazon.com/lambda/latest/dg/monitoring-insights.html" target="_blank" rel="noopener noreferrer">AWS Lambda Insights User Guide</a></li>

<li><a href="https://awslabs.github.io/aws-lambda-powertools-python/" target="_blank" rel="noopener noreferrer">AWS Lambda Powertools for Python</a></li>

<li><a href="https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CWL_QuerySyntax.html" target="_blank" rel="noopener noreferrer">CloudWatch Logs Insights Query Syntax</a></li>

<li><a href="https://docs.aws.amazon.com/wellarchitected/latest/operational-excellence-pillar/welcome.html" target="_blank" rel="noopener noreferrer">AWS Well-Architected Framework: Operational Excellence Pillar</a></li>

</ul>

Comentários

Mais em Cloud & Infraestrutura

Dominando EC2 em Profundidade: Instance Types, AMIs e Placement Groups em Projetos Reais
Dominando EC2 em Profundidade: Instance Types, AMIs e Placement Groups em Projetos Reais

Instance Types: Escolhendo a Máquina Correta Os tipos de instância EC2 são or...

Deploy automático e HTTPS: Nginx com GitHub Actions e Certbot
Deploy automático e HTTPS: Nginx com GitHub Actions e Certbot

Servidor configurado, agora automatize. Deploy com GitHub Actions, HTTPS grat...

O que Todo Dev Deve Saber sobre EBS e EFS: Block Storage vs File Storage em Casos Reais
O que Todo Dev Deve Saber sobre EBS e EFS: Block Storage vs File Storage em Casos Reais

O Que Todo Dev Deve Saber sobre EBS e EFS A escolha entre armazenamento em bl...