You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

创建Spot Instance/请求未收邮件通知,Terraform代码排查求助

Terraform代码问题排查及修复

以下是你的代码中导致无法收到Spot Instance通知邮件的核心问题及修复方案:

1. CloudWatch Event Rule 包含无关的EventSource

你的event_pattern里的eventSource包含了rds.amazonaws.com和s3.amazonaws.com,但Spot Instance相关事件仅来自ec2.amazonaws.com。多余的EventSource会过滤掉有效EC2事件,导致规则无法匹配触发。

修复后代码:

resource "aws_cloudwatch_event_rule" "spot_instance_creation_rule" {
  name = "SpotInstanceCreationRule"

  event_pattern = <<EOF
  {
    "source": ["aws.ec2"],
    "detail-type": ["AWS API Call via CloudTrail"],
    "detail": {
      "eventSource": ["ec2.amazonaws.com"],
      "eventName": ["RequestSpotInstances", "RunInstances"]
    }
  }
  EOF
}

注:添加RunInstances是为了覆盖通过该API直接创建Spot实例的场景,满足你"创建Spot Instance"的需求。

2. SNS邮件订阅未完成确认

使用email协议订阅SNS主题后,AWS会向myemail@gmail.com发送确认邮件,必须点击邮件中的链接完成订阅验证,否则无法接收任何通知。这是最容易遗漏的步骤。

3. 缺少CloudWatch Events到SNS主题的发布权限

默认情况下,CloudWatch Events没有权限向SNS主题推送消息,需要显式添加权限策略:

新增权限资源:

resource "aws_sns_topic_policy" "spot_notification_policy" {
  arn    = aws_sns_topic.spot_instance_notification.arn
  policy = jsonencode({
    Version = "2008-10-17"
    Id      = "CloudWatchEventsAccess"
    Statement = [
      {
        Sid    = "AllowCloudWatchEventsToPublish"
        Effect = "Allow"
        Principal = {
          Service = "events.amazonaws.com"
        }
        Action   = "sns:Publish"
        Resource = aws_sns_topic.spot_instance_notification.arn
      }
    ]
  })
}

4. 确认CloudTrail已启用并记录EC2事件

CloudWatch Event Rule依赖CloudTrail捕获API调用事件,需确保dev环境所在区域已启用CloudTrail,且配置了记录EC2服务的API操作。若CloudTrail未开启或未覆盖EC2事件,规则将无法触发。


内容的提问来源于stack exchange,提问作者user22667148

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 12:26:17