创建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
相关产品推荐
相关产品推荐

