如何将本地环境变量值传递到EC2的user data脚本中
解决方案
方法1:通过Terraform模板插值直接传入(适合快速实现)
你当前使用的是Terraform的HCL配置定义EC2的user data,按以下步骤修改即可完成需求:
- 在你的Terraform代码中新增敏感变量,用于接收本地传入的密码
variable "vault_password" { type = string sensitive = true description = "Vault登录密码,从本地环境变量传入" }
- 本地导出环境变量时按照Terraform规则添加
TF_VAR_前缀,Terraform会自动读取该值:
export TF_VAR_vault_password=$PASSWORD
- 修改你的user_data块,通过模板插值替换变量,同时添加环境变量持久化逻辑,保证SSH登录后也能读取到变量:
# User Data for ASG user_data = <<EOF #!/usr/bin/env bash set -x -v exec > >(tee -i user-data.log 2>/dev/console) 2>&1 # 持久化PASSWORD变量到全局环境配置,所有用户登录都可读取 echo "export PASSWORD=${var.vault_password}" | sudo tee /etc/profile.d/custom_env.sh sudo chmod +x /etc/profile.d/custom_env.sh # 立即加载变量供当前user data脚本使用 source /etc/profile.d/custom_env.sh # 原有安装逻辑保持不变 # Install latest AWS cli curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" unzip awscliv2.zip sudo ./aws/install --update # Install VAULT cli sudo wget https://releases.hashicorp.com/vault/1.8.2/vault_1.8.2_linux_amd64.zip sudo unzip vault_1.8.2_linux_amd64.zip sudo mv vault /usr/local/bin/vault sudo chmod +x /usr/local/bin/vault vault -v # Vault env var export VAULT_ADDR=https://myvault.test export VAULT_SKIP_VERIFY=true export VAULT_NAMESPACE=test # 直接使用加载好的环境变量登录Vault vault login -namespace=test -method=userpass username=myuser password=$PASSWORD EOF
配置完成后执行terraform apply即可,实例启动后你SSH登录执行printenv PASSWORD就能获取到对应值,变量也会在user data运行时正常生效。
方法2:生产级安全方案(避免密码明文出现在user data中)
方法1会将密码明文写入EC2的user data,有权限访问实例元数据的进程都可读取,生产环境建议使用更安全的方案:
- 将PASSWORD值存入AWS Secrets Manager,密钥名称可设置为
prod/vault_password - 给EC2实例关联的IAM角色添加该密钥的读取权限
- 在user data脚本中通过AWS CLI拉取密钥值再配置环境变量,参考片段如下:
# 从Secrets Manager拉取密码 PASSWORD=$(aws secretsmanager get-secret-value --secret-id prod/vault_password --query SecretString --output text) # 后续持久化、使用逻辑和方法1完全一致 echo "export PASSWORD=${PASSWORD}" | sudo tee /etc/profile.d/custom_env.sh source /etc/profile.d/custom_env.sh
内容的提问来源于stack exchange,提问作者Tate_87
相关产品推荐
相关产品推荐

