Последняя проверка: май 2026 г.
Разверните сервисы AWS для экзамена SOA-C03 с помощью чистого Terraform: пошаговое руководство с привязкой каждого блока к разделам экзамена. Код также совместим с OpenTofu.
К концу этой лабораторной работы вы настроите, используя обычный Terraform, полный цикл мониторинга и автоматического устранения проблем — группу журналов CloudWatch с фильтром метрик, тему SNS для оповещения человека, сценарий Systems Manager для автоматического исправления и правило EventBridge, которое направляет события высокой серьезности в этот сценарий, чтобы распространенные инциденты разрешались сами собой до того, как кто-либо проснется.
Каждый ресурс — это чистый Terraform — тот же код работает без изменений на OpenTofu. Никаких переменных, никаких модулей. Просто поместите фрагменты в один файл main.tf, выполните terraform init, затем terraform apply шаг за шагом.
>= 1.5 или OpenTofu >= 1.6.us-east-1.Все в этой лабораторной работе ничего не стоит в режиме ожидания:
Если автоматическое устранение проблемы фактически сработает (Шаг 5 запускает документ SSM), это не повлечет дополнительных затрат — Systems Manager Automation бесплатна для используемых здесь действий.
Стандартное начало. default_tags применяются ко всему стеку, чтобы команда операций могла позже фильтровать Cost Explorer, AWS Config и Tag Editor по Project = certlabpro-soa-c03, чтобы увидеть все, что было создано в этой лабораторной работе. Домен SOA-C03 Надежность и непрерывность бизнеса явно проверяет это — тегирование является основой для каждого сквозного операционного запроса.
terraform {
required_version = ">= 1.5"
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.60"
}
}
}
provider "aws" {
region = "us-east-1"
default_tags {
tags = {
Project = "certlabpro-soa-c03"
ManagedBy = "terraform"
}
}
}Каждая операционная история в AWS начинается в CloudWatch Logs. Мы создаем группу журналов с явным 30-дневным сроком хранения (по умолчанию никогда не истекает — это анти-паттерн стоимости SOA-C03, который встречается в каждом вопросе по оптимизации затрат) и фильтр метрик, который отслеживает поток журналов на наличие слова ERROR и публикует счетчик в CloudWatch Metrics.
Фильтры метрик превращают неструктурированные данные журналов в действенные метрики. Это ментальная модель SOA-C03 для мониторинга: журналы → фильтр → метрика → тревога → SNS → человек (или автоматизация). Мы будем строить эту цепочку по частям, начиная с этого шага.
resource "aws_cloudwatch_log_group" "app" {
name = "/certlabpro/soa-c03/app"
retention_in_days = 30
}
resource "aws_cloudwatch_log_metric_filter" "app_errors" {
name = "certlabpro-soa-c03-app-errors"
log_group_name = aws_cloudwatch_log_group.app.name
pattern = "ERROR"
metric_transformation {
name = "AppErrorCount"
namespace = "CertLabPro/SOA-C03"
value = "1"
default_value = "0"
}
}Теперь мы связываем метрику из Шага 2 с человеком. Мы создаем тему SNS, подписываем на нее адрес электронной почты и настраиваем тревогу CloudWatch, которая срабатывает, когда количество ошибок превышает наш порог. SOA-C03 проверяет именно эту цепочку — метрика → тревога → SNS → электронная почта — в рамках домена Мониторинг, логирование и устранение проблем (~20% экзамена).
После terraform apply AWS отправит электронное письмо с подтверждением на адрес, указанный в endpoint — нажмите Confirm subscription (Подтвердить подписку) один раз, и тревога будет фактически доходить до вас при срабатывании.
treat_missing_data = "notBreaching" — это небольшая, но важная для экзамена деталь: по умолчанию отсутствующая точка данных считается нарушением, что означает немедленное срабатывание совершенно новой тревоги без данных. Установка notBreaching соответствует конвенции SOA-C03 для метрик с низким объемом данных.
resource "aws_sns_topic" "ops_alerts" {
name = "certlabpro-soa-c03-ops-alerts"
}
resource "aws_sns_topic_subscription" "ops_email" {
topic_arn = aws_sns_topic.ops_alerts.arn
protocol = "email"
endpoint = "ops@example.com" # replace with your real email
}
resource "aws_cloudwatch_metric_alarm" "app_errors_spike" {
alarm_name = "certlabpro-soa-c03-app-errors-spike"
comparison_operator = "GreaterThanThreshold"
evaluation_periods = 1
metric_name = "AppErrorCount"
namespace = "CertLabPro/SOA-C03"
period = 300
statistic = "Sum"
threshold = 10
alarm_description = "More than 10 ERROR log lines in 5 minutes."
alarm_actions = [aws_sns_topic.ops_alerts.arn]
treat_missing_data = "notBreaching"
}Оповещение человека хорошо для новых инцидентов, но дорого для известных, повторяющихся. SOA-C03 сильно опирается на AWS Systems Manager Automation как на ответ на вопрос «как мне автоматически исправить то, что я уже знаю, как исправить?» — перезапустить нездоровую службу, обновить учетные данные, очистить дисковое пространство.
Мы создаем минимальный документ SSM, который выполняет шаг aws:sleep (один из управляемых AWS типов шагов) — в продакшене это был бы aws:executeAutomation для известного сценария восстановления или aws:runCommand для парка экземпляров. Структура та же: объявляем последовательность шагов, даем документу роль выполнения, регистрируем его как многоразовую автоматизацию.
Роль IAM, которую мы прикрепляем, дает SSM Automation разрешение принимать на себя эту роль и вызывать действия внутри документа. Домен SOA-C03 Надежность и непрерывность бизнеса проверяет именно этот шаблон: именованный, версионированный сценарий поддается аудиту; сообщение в Slack типа «Эй, можешь перезапустить эту штуку» — нет.
resource "aws_iam_role" "ssm_automation" {
name = "certlabpro-soa-c03-ssm-automation"
assume_role_policy = jsonencode({
Version = "2012-10-17"
Statement = [{
Effect = "Allow"
Principal = { Service = "ssm.amazonaws.com" }
Action = "sts:AssumeRole"
}]
})
}
resource "aws_iam_role_policy_attachment" "ssm_automation" {
role = aws_iam_role.ssm_automation.name
policy_arn = "arn:aws:iam::aws:policy/service-role/AmazonSSMAutomationRole"
}
resource "aws_ssm_document" "remediate_app_errors" {
name = "certlabpro-soa-c03-remediate-app-errors"
document_type = "Automation"
document_format = "YAML"
content = <<-EOT
schemaVersion: "0.3"
description: "Lab-only runbook — auto-acknowledges app-error spikes."
assumeRole: "${aws_iam_role.ssm_automation.arn}"
mainSteps:
- name: pause
action: aws:sleep
inputs:
Duration: PT5S
EOT
}Последняя часть цикла. Тревоги CloudWatch отправляют события в шину EventBridge по умолчанию при изменении их состояния — мы фильтруем тревогу, созданную на Шаге 3, переходящую в состояние ALARM, и нацеливаем документ SSM из Шага 4 в качестве ответа.
Правило EventBridge нуждается в собственной роли IAM для вызова SSM Automation от нашего имени — это тонкая, но часто встречающаяся деталь SOA-C03. Экзамен проверяет, помните ли вы, что вызов EventBridge целевого объекта от вашего имени является действием между службами, которое требует выделенной роли выполнения, отличной от собственной роли assume-role документа SSM.
Полная цепочка теперь выглядит так: строка журнала, содержащая ERROR → фильтр метрик публикует в CloudWatch Metrics → тревога срабатывает, когда счетчик > 10 за 5 минут → тревога публикует событие изменения состояния в EventBridge И отправляет электронное письмо команде операций через SNS → правило EventBridge соответствует изменению состояния → SSM Automation запускает сценарий устранения. Пейджер срабатывает и исправление запускается параллельно. Это операционный идеал SOA-C03.
resource "aws_iam_role" "eventbridge_invoke_ssm" {
name = "certlabpro-soa-c03-eventbridge-invoke-ssm"
assume_role_policy = jsonencode({
Version = "2012-10-17"
Statement = [{
Effect = "Allow"
Principal = { Service = "events.amazonaws.com" }
Action = "sts:AssumeRole"
}]
})
}
resource "aws_iam_role_policy" "eventbridge_invoke_ssm" {
name = "start-automation"
role = aws_iam_role.eventbridge_invoke_ssm.id
policy = jsonencode({
Version = "2012-10-17"
Statement = [{
Effect = "Allow"
Action = "ssm:StartAutomationExecution"
Resource = "*"
}]
})
}
resource "aws_cloudwatch_event_rule" "app_errors_alarm" {
name = "certlabpro-soa-c03-app-errors-alarm-fired"
description = "Fires the auto-remediation runbook when the app-errors alarm trips."
event_pattern = jsonencode({
source = ["aws.cloudwatch"]
"detail-type" = ["CloudWatch Alarm State Change"]
detail = {
alarmName = [aws_cloudwatch_metric_alarm.app_errors_spike.alarm_name]
state = { value = ["ALARM"] }
}
})
}
resource "aws_cloudwatch_event_target" "run_ssm_doc" {
rule = aws_cloudwatch_event_rule.app_errors_alarm.name
arn = "arn:aws:ssm:us-east-1::automation-definition/${aws_ssm_document.remediate_app_errors.name}"
role_arn = aws_iam_role.eventbridge_invoke_ssm.arn
}Команда terraform destroy удаляет все ресурсы, созданные в этой лабораторной работе. Одно замечание: подписка на электронную почту SNS остается в истории вашей учетной записи после удаления (AWS сохраняет запись об отмене подписки для соответствия требованиям). Никаких сборов, просто бумажный след. Все остальное завершается чисто в течение минуты.
SOA-C03 охватывает операционные области, которые не могут быть включены в эту лабораторную работу — правила AWS Config и пакеты соответствия для отклонений от стандартов, CloudTrail для аудита API, проверки Trusted Advisor, обнаружение отклонений CloudFormation и StackSets для операций с несколькими учетными записями, AWS Backup, события AWS Health, Resource Explorer, License Manager и Service Quotas.
Мы придерживаемся цикла тревога-автоматическое устранение (alarm-to-auto-remediate loop), потому что это самый часто проверяемый операционный шаблон на экзамене и тот, который связывает четыре наиболее часто используемых сервиса (CloudWatch, SNS, SSM, EventBridge). Другие операционные инструменты являются концептуальным охватом — см. разделы Просмотр и Editorial на этой странице сертификации.