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

Terraform批量创建EC2偶现‘Still creating’直至超时求助

Terraform并行创建EC2随机超时的解决办法

问题排查与解决思路

1. AWS API限流导致请求延迟

23台m5.12xlarge实例并行创建,极易触发EC2的API请求配额限制,部分请求被限流后延迟处理,最终超时。

  • 检查区域EC2配额:查看当前区域Running On-Demand m5.12xlarge的限额,若接近上限,直接在AWS控制台提交配额提升申请。
  • 降低Terraform并行度:限制并发创建数量,比如执行命令时添加参数terraform apply -parallelism=10,或者在配置文件中固定设置:
terraform {
  parallelism = 10
}

2. User Data脚本阻塞实例初始化

Shell脚本如果执行时间过长、卡住,会导致cloud-init无法完成初始化,Terraform会一直等待实例进入就绪状态,最终超时。

  • 优化脚本耗时操作:给大文件下载、无超时的命令添加超时限制,比如timeout 300s wget https://example.com/large-file.tar.gz。
  • 后台执行长任务:将非紧急初始化操作放到后台,避免阻塞cloud-init流程:
nohup /path/to/long-running-script.sh > /var/log/init.log 2>&1 &
  • 缩短Terraform等待时长:如果确认脚本不影响实例可用性,可调整等待超时时间:
resource "aws_instance" "genomic-etl-ec2" {
  # 保留原有配置
  wait_for_guest_timeout = "10m"
}

3. 大规格实例资源不足

m5.12xlarge属于大规格实例,部分可用区可能临时资源紧张,导致实例创建被延迟。

  • 切换可用区:将子网替换为同区域的其他可用区,或配置多个子网让Terraform自动轮选:
variable "subnet_ids" {
  type    = list(string)
  default = ["subnet-xxx", "subnet-yyy"]
}

resource "aws_instance" "genomic-etl-ec2" {
  # 保留原有配置
  subnet_id = element(var.subnet_ids, count.index % length(var.subnet_ids))
}
  • 改用Spot实例:若业务允许,Spot实例资源池更充足,创建成功率更高(需注意处理实例中断场景)。

4. 移除不必要的local-exec sleep

配置中的local-exec "sleep 40"完全冗余,23台实例并行时会占用Jenkins节点资源,间接影响Terraform与AWS的通信,直接删除该provisioner即可。

5. 修复RequestExpired通信超时

该错误源于Terraform与AWS API的通信超时,可通过以下配置调整:

  • 延长API请求超时:
provider "aws" {
  region = "us-east-1"
  request_timeout = "120s"
}
  • 增加重试次数:让Terraform对临时错误进行多次重试:
provider "aws" {
  region = "us-east-1"
  retry_max = 5
  retry_mode = "adaptive"
}

临时排查技巧

  • 查看CloudTrail日志:搜索失败实例的创建请求,确认是否存在InsufficientInstanceCapacity或Throttling等具体错误。
  • 检查EC2系统日志:卡在创建状态的实例,可在AWS控制台查看系统日志,定位cloud-init的执行断点。
  • 单实例测试:手动用Terraform创建1台实例并运行相同user_data,排除脚本本身的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 00:05:40