如何实现Terraform创建的AWS基础设施控制台变更通知?
实现Terraform创建资源的控制台修改通知方案
方案一:CloudTrail + CloudWatch Events + SNS(实时通知)
这是最直接的实时监控方案,利用AWS的操作审计和事件触发机制:
步骤1:给Terraform创建的资源统一打标签
确保所有Terraform管理的资源都添加ManagedBy: Terraform标签(可以在Terraform的provider级别设置默认标签,避免逐个资源添加):provider "aws" { region = "us-east-1" default_tags { tags = { ManagedBy = "Terraform" } } }已创建的资源可通过Terraform的
import或AWS批量标签工具补打标签。步骤2:启用AWS CloudTrail
确保CloudTrail已启用并记录目标区域的管理事件,将事件日志存储到指定S3桶中。步骤3:创建CloudWatch Events规则
配置规则过滤符合以下条件的事件:- 操作来自AWS控制台(通过
userIdentity.type为IAMUser或Root过滤,排除Terraform使用的IAM角色/服务账号) - 操作类型为资源修改/删除(如
ModifyInstanceAttribute、UpdateBucketPolicy等,通过eventName包含Modify/Update/Delete匹配) - 目标资源带有
ManagedBy: Terraform标签
示例事件模式(JSON):
{ "source": ["aws.ec2", "aws.s3", "aws.rds"], // 按需添加需要监控的服务 "detail-type": ["AWS API Call via CloudTrail"], "detail": { "eventName": [{ "contains": "Modify" }, { "contains": "Update" }, { "contains": "Delete" }], "userIdentity": { "type": ["IAMUser", "Root"] }, "resources": [{ "tags": { "ManagedBy": "Terraform" } }] } }- 操作来自AWS控制台(通过
步骤4:配置SNS主题和订阅
创建SNS主题,添加订阅(如邮箱、Slack Webhook、短信等),将CloudWatch Events规则的目标设置为该主题。当符合条件的事件触发时,你会收到包含操作详情的实时通知。
方案二:AWS Config + SNS(配置漂移检测)
如果需要关注资源配置是否偏离Terraform定义的状态,可使用AWS Config:
步骤1:启用AWS Config
开启AWS Config的资源配置记录,选择需要监控的资源类型。步骤2:创建自定义Config规则
编写Lambda实现自定义规则,逻辑如下:- 检测资源是否带有
ManagedBy: Terraform标签 - 对比当前资源配置与Terraform状态文件中的配置(可将Terraform状态文件存储到S3,由Lambda读取后对比)
- 若发现配置漂移且修改来源非Terraform,触发合规失败
- 检测资源是否带有
步骤3:配置通知
在AWS Config中设置合规规则的通知目标为SNS主题,当规则触发合规失败时发送告警通知。
方案三:Terraform漂移检测(定期校验)
作为实时监控的补充,可定期运行terraform plan检测资源漂移并发送通知:
- 使用CI/CD工具(如GitHub Actions、GitLab CI)定期执行
terraform init+terraform plan - 解析
terraform plan的输出,若发现资源漂移(即控制台修改的内容),通过工具内置的通知功能发送告警 - 示例GitHub Actions片段:
name: Terraform Drift Check on: schedule: - cron: '0 0 * * *' # 每天凌晨执行 jobs: drift-check: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: hashicorp/setup-terraform@v3 - run: terraform init - run: terraform plan -out=plan.out - run: terraform show -json plan.out > plan.json - name: Check for drift run: | if terraform plan | grep -q "will be changed"; then echo "Resource drift detected!" # 这里添加通知逻辑,比如调用Slack API或发送邮件 fi
内容的提问来源于stack exchange,提问作者Bhavesh R
相关产品推荐
相关产品推荐

