如何通过Bash脚本或Terraform向EC2实例传递本地文件?
两种实现文件部署的方案,按需选择
方案1:Terraform直接内嵌文件到User Data
不需要额外维护独立脚本,直接把本地XML文件内容嵌入到EC2的启动脚本里,通过Bash写入目标路径,适合配置文件不敏感、逻辑简单的场景。
配置示例
- 在Terraform的
aws_launch_template中引用模板文件:
resource "aws_launch_template" "ec2_template" { name_prefix = "app-server-template" image_id = "ami-xxxxxx" # 替换成你的AMI ID instance_type = "t2.micro" user_data = base64encode(templatefile("user_data.tpl", { server_xml_content = file("${path.module}/server.xml") dbconfig_xml_content = file("${path.module}/dbconfig.xml") server_target_path = "/opt/tomcat/conf/server.xml" dbconfig_target_path = "/opt/app/config/dbconfig.xml" })) }
- 创建
user_data.tpl模板文件:
#!/bin/bash # 先创建目标目录(避免目录不存在报错) mkdir -p $(dirname "${server_target_path}") mkdir -p $(dirname "${dbconfig_target_path}") # 写入server.xml到指定路径 cat > "${server_target_path}" << 'EOF' ${server_xml_content} EOF # 写入dbconfig.xml到指定路径 cat > "${dbconfig_target_path}" << 'EOF' ${dbconfig_xml_content} EOF # 可选:设置合理的文件权限 chmod 644 "${server_target_path}" "${dbconfig_target_path}"
方案2:Bash脚本拉取S3存储的文件
如果配置文件敏感、需要独立版本管理,或者文件体积较大,建议先把文件上传到S3,再通过启动脚本拉取,安全性和灵活性更高。
配置步骤
- Terraform上传本地文件到S3:
# 先创建S3桶(如果还没有) resource "aws_s3_bucket" "config_bucket" { bucket = "your-unique-config-bucket-name" # 替换成唯一桶名 } # 上传server.xml resource "aws_s3_bucket_object" "server_xml" { bucket = aws_s3_bucket.config_bucket.id key = "configs/server.xml" source = "${path.module}/server.xml" etag = filemd5("${path.module}/server.xml") } # 上传dbconfig.xml resource "aws_s3_bucket_object" "dbconfig_xml" { bucket = aws_s3_bucket.config_bucket.id key = "configs/dbconfig.xml" source = "${path.module}/dbconfig.xml" etag = filemd5("${path.module}/dbconfig.xml") } # 给EC2实例配置S3只读权限 resource "aws_iam_role_policy_attachment" "s3_read_access" { role = aws_iam_role.ec2_instance_role.name # 替换成你的EC2实例角色名 policy_arn = "arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess" }
- 修改
userdata.sh添加拉取逻辑:
#!/bin/bash # 安装AWS CLI(如果你的AMI默认没有) # Amazon Linux用yum,Ubuntu用apt-get install awscli yum install -y aws-cli # 创建目标目录 mkdir -p /opt/tomcat/conf /opt/app/config # 从S3拉取文件到指定路径 aws s3 cp s3://your-unique-config-bucket-name/configs/server.xml /opt/tomcat/conf/server.xml aws s3 cp s3://your-unique-config-bucket-name/configs/dbconfig.xml /opt/app/config/dbconfig.xml # 设置文件权限 chmod 644 /opt/tomcat/conf/server.xml /opt/app/config/dbconfig.xml
- 在
aws_launch_template中引用脚本:
resource "aws_launch_template" "ec2_template" { name_prefix = "app-server-template" image_id = "ami-xxxxxx" instance_type = "t2.micro" iam_instance_profile { name = aws_iam_instance_profile.ec2_profile.name # 替换成你的实例配置文件 } user_data = base64encode(file("${path.module}/userdata.sh")) }
选择建议
- 静态、非敏感配置:选方案1,步骤少,无额外依赖
- 敏感、需独立管理的配置:选方案2,权限可控,更新灵活
内容的提问来源于stack exchange,提问作者Legion_of_boom__
相关产品推荐
相关产品推荐

