CloudWatch Logs
Lambda автоматически отправляет логи в CloudWatch. Каждое выполнение функции создаёт log stream.
Просмотр логов
# Последние логи
aws logs tail /aws/lambda/visitor-counter --follow
# Поиск ошибок
aws logs filter-log-events \
--log-group-name /aws/lambda/visitor-counter \
--filter-pattern "ERROR"
# Логи за последний час
aws logs filter-log-events \
--log-group-name /aws/lambda/visitor-counter \
--start-time $(date -d '1 hour ago' +%s000) \
--filter-pattern "Visitor count"
Структурированное логирование
import json
import logging
logger = logging.getLogger()
logger.setLevel(logging.INFO)
def lambda_handler(event, context):
# Structured logging
logger.info(json.dumps({
'action': 'increment_counter',
'requestId': context.aws_request_id,
'functionName': context.function_name,
'memoryLimitMB': context.memory_limit_in_mb,
'remainingTimeMs': context.get_remaining_time_in_millis()
}))
count = get_and_increment()
logger.info(json.dumps({
'action': 'counter_updated',
'count': count,
'requestId': context.aws_request_id
}))
return response({'count': count})
Log Retention
# Установите retention, чтобы не копить логи вечно
aws logs put-retention-policy \
--log-group-name /aws/lambda/visitor-counter \
--retention-in-days 7
# Для CRC 7 дней достаточно
# Стоимость хранения: $0.03/GB/месяц
CloudWatch Metrics
Встроенные метрики Lambda
| Метрика | Описание | Для CRC |
|---|---|---|
| Invocations | Количество вызовов | Трафик |
| Duration | Время выполнения | Производительность |
| Errors | Количество ошибок | Здоровье |
| Throttles | Количество throttled вызовов | Перегрузка |
| ConcurrentExecutions | Одновременные вызовы | Масштабирование |
Создание алармов
# Alarm: ошибки Lambda > 5 за 5 минут
aws cloudwatch put-metric-alarm \
--alarm-name crc-lambda-errors \
--metric-name Errors \
--namespace AWS/Lambda \
--statistic Sum \
--period 300 \
--threshold 5 \
--comparison-operator GreaterThanThreshold \
--evaluation-periods 1 \
--dimensions Name=FunctionName,Value=visitor-counter \
--alarm-actions arn:aws:sns:us-east-1:123456789012:crc-alerts
# Alarm: средняя длительность > 3 секунды
aws cloudwatch put-metric-alarm \
--alarm-name crc-lambda-duration \
--metric-name Duration \
--namespace AWS/Lambda \
--statistic Average \
--period 300 \
--threshold 3000 \
--comparison-operator GreaterThanThreshold \
--evaluation-periods 2 \
--dimensions Name=FunctionName,Value=visitor-counter
CloudWatch Dashboard
# Создаём dashboard
aws cloudwatch put-dashboard \
--dashboard-name CRC-Dashboard \
--dashboard-body '{
"widgets": [
{
"type": "metric",
"properties": {
"title": "Lambda Invocations",
"metrics": [
["AWS/Lambda", "Invocations", "FunctionName", "visitor-counter"]
],
"period": 300,
"stat": "Sum"
}
},
{
"type": "metric",
"properties": {
"title": "Lambda Duration",
"metrics": [
["AWS/Lambda", "Duration", "FunctionName", "visitor-counter"]
],
"period": 300,
"stat": "Average"
}
},
{
"type": "metric",
"properties": {
"title": "Lambda Errors",
"metrics": [
["AWS/Lambda", "Errors", "FunctionName", "visitor-counter"]
],
"period": 300,
"stat": "Sum"
}
},
{
"type": "metric",
"properties": {
"title": "API Gateway Requests",
"metrics": [
["AWS/ApiGateway", "Count", "ApiId", "API_ID"]
],
"period": 300,
"stat": "Sum"
}
}
]
}'
X-Ray Tracing
X-Ray показывает путь запроса через все сервисы:
# Включаем X-Ray для Lambda
aws lambda update-function-configuration \
--function-name visitor-counter \
--tracing-config Mode=Active
# В Lambda с X-Ray
import aws_xray_sdk.core
aws_xray_sdk.core.patch_all() # Patch boto3, requests, etc.
# Теперь каждый вызов DynamoDB виден в X-Ray trace
Мониторинг расходов
# Текущие расходы
aws ce get-cost-and-usage \
--time-period Start=$(date -d '30 days ago' +%Y-%m-%d),End=$(date +%Y-%m-%d) \
--granularity MONTHLY \
--metrics BlendedCost \
--group-by Type=DIMENSION,Key=SERVICE
# Free Tier использование
aws ce get-cost-and-usage \
--time-period Start=$(date -d '30 days ago' +%Y-%m-%d),End=$(date +%Y-%m-%d) \
--granularity MONTHLY \
--filter '{"Tags": {"Key": "project", "Values": ["crc"]}}'