如何使用Terraform将本地.sh文件部署到EC2实例并运行
可行解决方案
以下是3种可直接落地的方案,按推荐优先级排序:
方案1:Terraform统一管理SSH密钥对(最常用,适合需要后续SSH操作的场景)
你可以直接在Terraform代码中完成密钥对的创建、关联、引用全流程,不需要手动复制私钥:
- 提前在本地生成SSH密钥对,或通过Terraform的
tls_private_key资源自动生成密钥对 - 通过
aws_key_pair资源将公钥导入到AWS,关联到目标EC2实例 - 在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
相关产品推荐
相关产品推荐

