最后审核时间:2026年5月
使用原生 Terraform 构建 SOA-C03 考试中的 AWS 服务——每次构建一个代码块,并紧扣考试领域。相同的代码可在 OpenTofu 上运行。
在本实验结束时,您将使用纯 Terraform 预置一个完整的监控和自动修复循环——一个带有指标筛选器的 CloudWatch 日志组、一个向人员发送通知的 SNS 主题、一个执行自动化修复的 Systems Manager 运行手册,以及一个将高严重性事件连接到运行手册的 EventBridge 规则,以便常见事件在任何人醒来之前自行解决。
所有资源都是纯 Terraform——相同的代码在 OpenTofu 上无需修改即可工作。没有变量,没有模块。将这些片段放入单个 main.tf 文件中,运行 terraform init,然后逐步运行 terraform apply。
>= 1.5 或 OpenTofu >= 1.6。us-east-1 区域进行身份验证的 AWS CLI。本实验中的所有内容在空闲时均不收费:
如果自动修复实际触发(步骤 5 触发一个 SSM 文档),不会产生额外费用——Systems Manager Automation 对于此处使用的操作是免费的。
标准开头。default_tags 应用于整个堆栈,以便运营团队以后可以通过 Project = certlabpro-soa-c03 筛选 Cost Explorer、AWS Config 和 Tag Editor,查看本实验创建的所有内容。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 在《监控、日志记录和修复》领域(约占考试的 20%)中测试了这一精确的链条——指标 → 警报 → SNS → 电子邮件。
terraform apply 之后,AWS 会向 endpoint 中的地址发送一封确认电子邮件——点击一次“确认订阅”,警报在触发时就会真正发送给您。
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 状态的事件,并将步骤 4 中的 SSM 文档作为响应目标。
EventBridge 规则需要自己的 IAM 角色才能代表我们调用 SSM Automation——这是一个细微但反复出现的 SOA-C03 细节。考试会测试您是否记得 EventBridge 代表您调用目标是一个服务间动作,需要一个专用的执行角色,这与 SSM 文档自己的代入角色不同。
现在完整的链条是:包含 ERROR 的日志行 → 指标筛选器发布到 CloudWatch Metrics → 当 5 分钟内计数 > 10 时警报触发 → 警报将状态更改事件发布到 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 规则和一致性包、用于 API 审计的 CloudTrail、Trusted Advisor 检查、用于多账户操作的 CloudFormation 漂移检测和 StackSets、AWS Backup、AWS Health 事件、Resource Explorer、License Manager 和 Service Quotas。
我们专注于警报到自动修复循环,因为它是考试中测试最多的运营模式,并且它将四个最高频的服务(CloudWatch、SNS、SSM、EventBridge)连接起来。其他运营工具属于概念性覆盖范围——请参阅此认证页面的浏览和 Editorial 部分。