You need to enable JavaScript to run this app. 如何使用Terraform将本地.sh文件部署到EC2实例并运行
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Terraform将本地.sh文件部署到EC2实例并运行

可行解决方案

以下是3种可直接落地的方案,按推荐优先级排序:

方案1:Terraform统一管理SSH密钥对(最常用,适合需要后续SSH操作的场景)

你可以直接在Terraform代码中完成密钥对的创建、关联、引用全流程,不需要手动复制私钥:

  1. 提前在本地生成SSH密钥对,或通过Terraform的tls_private_key资源自动生成密钥对
  2. 通过aws_key_pair资源将公钥导入到AWS,关联到目标EC2实例
  3. 在provisioner的connection块中直接引用私钥内容即可完成身份认证

示例代码:

# 可选:用Terraform自动生成密钥对(测试环境用,生产建议提前生成私钥存在本地)
resource "tls_private_key" "ec2_key" {
  algorithm = "RSA"
  rsa_bits  = 4096
}

# 导入公钥到AWS
resource "aws_key_pair" "ec2_key" {
  key_name   = "ec2-ubuntu-key"
  public_key = tls_private_key.ec2_key.public_key_openssh
}

# 创建EC2实例,绑定密钥对
resource "aws_instance" "web" {
  ami           = "ami-0c55b159cbfafe1f0" # 替换为对应区域的Ubuntu官方AMI
  instance_type = "t2.micro"
  key_name      = aws_key_pair.ec2_key.key_name

  # 安全组要放通22端口入方向,允许运行Terraform的机器IP访问
  vpc_security_group_ids = [aws_security_group.ec2_sg.id]

  # 复制本地脚本到EC2
  provisioner "file" {
    source      = "./your_script.sh"
    destination = "/home/ubuntu/your_script.sh"

    connection {
      type        = "ssh"
      host        = self.public_ip
      user        = "ubuntu"
      private_key = tls_private_key.ec2_key.private_key_pem
      # 如果是提前生成的本地私钥,替换为:private_key = file("~/.ssh/your_private_key.pem")
    }
  }

  # 执行脚本
  provisioner "remote-exec" {
    inline = [
      "chmod +x /home/ubuntu/your_script.sh",
      "sudo /home/ubuntu/your_script.sh"
    ]
  }
}

注意:生产环境不要使用tls_private_key自动生成密钥,避免私钥明文存储在Terraform状态文件中带来泄露风险,建议使用提前生成好的本地私钥,仅将公钥导入AWS。

方案2:通过EC2 UserData直接执行脚本(最推荐,无需SSH连接)

如果你的需求仅为部署并执行.sh脚本,不需要后续手动SSH操作,可以完全跳过provisioner和SSH密钥配置:
直接将本地脚本内容通过templatefile渲染后,传入EC2的user_data参数,EC2实例启动时会自动以root权限执行该脚本,不需要任何身份认证。

示例代码:

resource "aws_instance" "web" {
  ami           = "ami-0c55b159cbfafe1f0"
  instance_type = "t2.micro"

  # 直接加载本地脚本作为user_data
  user_data = templatefile("./your_script.sh", {
    # 这里可以传入需要动态替换的变量
    custom_param = var.your_param
  })
}

该方案不需要配置SSH密钥、不需要放通22端口,执行成功率远高于provisioner方案,完全符合基础设施即代码的理念。

方案3:配置SSH密码登录(不推荐,仅测试环境使用)

如果必须使用密码登录,可以在user_data中配置Ubuntu用户密码并开启SSH密码登录:

resource "aws_instance" "web" {
  ami           = "ami-0c55b159cbfafe1f0"
  instance_type = "t2.micro"

  user_data = <<-EOF
              #!/bin/bash
              echo "ubuntu:你的自定义密码" | chpasswd
              sed -i 's/PasswordAuthentication no/PasswordAuthentication yes/' /etc/ssh/sshd_config
              systemctl restart sshd
              EOF
}

之后在provisioner的connection块中配置password = "你的自定义密码"即可登录。该方案安全性极低,生产环境禁止使用。


内容的提问来源于stack exchange,提问作者SCSI-9

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.16 04:06:06