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

基于Terraform创建的Windows EC2实例互Ping及结果输出方案问询

实现Windows EC2实例间互Ping并输出Terraform结果的方法

前提准备

  • 所有EC2实例需在同一子网内,安全组需双向允许ICMP(Ping)流量(入站/出站规则添加ICMP类型8、代码0)。
  • 实例需配置AWS SSM Agent(官方Windows AMI默认预装),并关联具备AmazonSSMManagedInstanceCore权限的IAM角色,用于远程执行命令。

步骤1:创建SSM权限角色及实例配置文件

先给EC2实例配置SSM访问权限,避免暴露WinRM端口:

# SSM访问角色
resource "aws_iam_role" "ec2_ssm_role" {
  name = "ec2-ssm-access-role"
  assume_role_policy = jsonencode({
    Version = "2012-10-17"
    Statement = [{
      Action = "sts:AssumeRole"
      Effect = "Allow"
      Principal = { Service = "ec2.amazonaws.com" }
    }]
  })
}

# 关联SSM管理权限策略
resource "aws_iam_role_policy_attachment" "ssm_core_policy" {
  role       = aws_iam_role.ec2_ssm_role.name
  policy_arn = "arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore"
}

# 实例配置文件,用于挂载到EC2
resource "aws_iam_instance_profile" "ec2_ssm_profile" {
  name = "ec2-ssm-profile"
  role = aws_iam_role.ec2_ssm_role.name
}

步骤2:更新EC2实例配置

把SSM实例配置文件加到你的EC2资源中,并确保使用带SSM Agent的Windows AMI:

resource "aws_instance" "machines" {
  count = 100
  instance_type = "t3.micro"
  subnet_id = var.subnetID
  iam_instance_profile = aws_iam_instance_profile.ec2_ssm_profile.name
  # 替换为你所在区域的Windows Server AMI ID(需预装SSM Agent)
  ami = "ami-0c55b159cbfafe1f0" # 示例:us-east-1的Windows Server 2022 AMI
  tags = {
    Name = "machine-${count.index}"
  }
}

步骤3:执行实例间互Ping测试

用null_resource结合本地执行命令,通过SSM远程在每个实例上执行Ping,并保存结果到本地文件:

resource "null_resource" "inter_instance_ping" {
  depends_on = [aws_instance.machines]

  provisioner "local-exec" {
    command = <<EOT
      # 清空结果文件
      > ping_test_results.txt

      # 遍历实例对,按需求执行Ping
      for ((i=99; i>=0; i--)); do
        # 确定目标实例索引:
        # machine-99 → machine-0(对应需求中的machine-100,因count=100无索引100)
        # machine-98 → machine-99
        # ...
        # machine-0 → machine-99(对应需求中的machine-100)
        if [ $i -eq 99 ]; then
          target_idx=0
        elif [ $i -eq 0 ]; then
          target_idx=99
        else
          target_idx=$((i+1))
        fi

        source_id="${aws_instance.machines[$i].id}"
        target_ip="${aws_instance.machines[$target_idx].private_ip}"

        # 记录测试信息
        echo "=== Ping from machine-$i to machine-$target_idx ===" >> ping_test_results.txt
        echo "Source Instance ID: $source_id" >> ping_test_results.txt
        echo "Target Private IP: $target_ip" >> ping_test_results.txt

        # 通过SSM执行PowerShell Ping命令
        aws ssm send-command \
          --instance-ids "$source_id" \
          --document-name "AWS-RunPowerShellScript" \
          --parameters commands="ping $target_ip -n 4" \
          --output text >> ping_test_results.txt

        echo -e "\n" >> ping_test_results.txt
      done
    EOT
    interpreter = ["bash", "-c"]
  }
}

步骤4:输出Ping测试结果

读取本地结果文件,通过Terraform输出展示:

resource "local_file" "ping_results" {
  depends_on = [null_resource.inter_instance_ping]
  filename = "ping_test_results.txt"
  content = file("ping_test_results.txt")
}

output "inter_instance_ping_results" {
  value = local_file.ping_results.content
  description = "详细的实例间Ping测试结果"
}

注意事项

  1. 本地环境需安装并配置AWS CLI,且拥有EC2和SSM的操作权限。
  2. 若你确实需要machine-0 Ping machine-100,需将EC2的count改为101(索引0-100),并调整target_idx逻辑:
    if [ $i -eq 99 ]; then
      target_idx=100
    elif [ $i -eq 0 ]; then
      target_idx=100
    else
      target_idx=$((i+1))
    fi
    
  3. 若Ping失败,优先检查安全组ICMP规则、实例私有网络连通性,以及SSM Agent状态。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 02:25:36