如何在AWS中通过ebp将本地环境变量传递给Packer?
嘿,我刚好遇到过类似的场景,给你几个实用的方案来解决这个问题——毕竟用ebp create的时候,Packer跑在远程EC2上,本地变量确实没法直接像本地运行Packer那样传递,咱们一步步来:
方案1:借助EB CLI自动传递环境变量
EB CLI本身会把本地的部分环境变量同步到远程构建环境里,你可以利用这一点来传递变量:
- 先在本地设置好要传递的变量,比如:
export MY_APP_VERSION="v1.2.3" export SALT_ENV="production" - 接着在你的Packer模板里直接引用这些环境变量就行,比如在shell provisioner中:
要是变量要用到Salt的配置里,也可以在Salt的state文件中通过provisioner "shell" { inline = [ "echo 当前应用版本:$MY_APP_VERSION", "salt-call state.apply saltenv=$SALT_ENV" ] }grains['env:变量名']来读取。
注意:EB CLI默认会传递常见的环境变量,如果你有自定义的特殊变量,最好确认下EB的配置没有过滤掉它们。
方案2:用Packer变量+EB CLI的
--packer-parameters参数 这种方式更灵活,能精准控制传递给Packer的变量:
- 先在Packer模板开头定义好需要的变量:
variable "app_version" { type = string default = "v1.0.0" } variable "salt_env" { type = string default = "dev" } - 然后在本地获取变量值(比如从本地配置文件、环境变量里读取),执行
ebp create时通过参数传递:
这样远程运行的Packer就能直接用# 从本地文件读取版本号 LOCAL_VERSION=$(cat ./version.txt) # 传递给Packer ebp create my-custom-platform --packer-parameters "-var app_version=$LOCAL_VERSION -var salt_env=production"var.app_version这类变量名,不管是在provisioner还是Salt配置里都能轻松引用。
方案3:上传本地配置文件到远程构建环境
如果变量比较多,或者需要结构化存储,把变量写到本地配置文件再上传是个不错的选择:
- 先在本地创建一个
local-vars.conf,内容比如:DB_HOST=my-db.example.com API_KEY=abc123xyz - 在Packer模板里添加一个file provisioner,把这个文件传到远程EC2:
provisioner "file" { source = "./local-vars.conf" destination = "/tmp/local-vars.conf" permissions = "0600" # 设置只读权限,避免敏感信息泄露 } - 之后在shell或者Salt配置里加载这个文件:
要是用Salt,也可以写个state来读取这个文件的内容,注入到pillar或者直接使用。provisioner "shell" { inline = [ "source /tmp/local-vars.conf", "echo 数据库地址:$DB_HOST" ] }
方案4:用AWS SSM参数存储传递敏感变量
如果是密码、API密钥这类敏感信息,绝对不能用明文传递,AWS SSM Parameter Store是更安全的选择:
- 先在本地把敏感变量存入SSM:
aws ssm put-parameter --name "/my-platform/db-password" --value "my-secure-pass" --type "SecureString" - 确保远程构建的EC2实例有访问这个参数的IAM权限(EB的默认实例角色需要添加
ssm:GetParameter权限) - 然后在Packer的provisioner里读取这个参数:
这种方式全程加密,敏感信息不会在本地或远程构建过程中暴露,安全性拉满。provisioner "shell" { inline = [ "DB_PASS=$(aws ssm get-parameter --name \"/my-platform/db-password\" --with-decryption --query \"Parameter.Value\" --output text)", "echo 数据库密码已获取" ] }
内容的提问来源于stack exchange,提问作者Andrei Dascalu
相关产品推荐
相关产品推荐

