我有一些变量,我想在cloudformation模板的userdata中替换,我不想把这些变量作为参数放在cloudformation中。我怎样才能做到这一点?似乎cloudformation希望总是包含任何需要作为参数替换的变量,但我觉得这不够灵活。所以不确定是否有其他人想出办法来做到这一点。
某些变量并不需要与基础架构绑定,但需要动态替换这些变量。
例如,我有这个用户数据
UserData:
"Fn::Base64":
!Sub |
#!/bin/bash -xe
cat >> /tmp/docker_compose.yaml << EOF
version: '3.5'
services:
ngnix:
container_name: nginx
image: nginx:$TAG
restart: always
ports:
- 80:80
environment:
SERVER_ID: $SERVER_ID
AWS_REGION: $AWS_REGION
EOF
我想在运行cloudformation命令的机器上设置env变量值
export TAG=1.9.9
export SERVER_ID=12
export AWS_REGION=us-east-1
如何在userdata中替换这些本地env值而不将这些变量作为参数。我已经尝试过所有我能想到的东西而且我无法做到这一点。
如果有人想到某种方式或黑客,那么想要利用互联网的力量。
谢谢
这是通过脚本执行此操作的一种方法,可能存在此脚本会出现问题的情况,但您必须进行测试和查看。
我不希望在准备我的cloudformation脚本之外可以使用环境变量 - 所以我在一个脚本文件中完成了所有操作;加载环境变量和替换。
注意:您需要在计算机上安装envsubst。
我有3个文件开始:文件一是我的cloudformation脚本,其中我的每个参数都有一个默认值,表示为bash变量:
cloudformation.yaml
Region
Default: $Region
InstanceType
Default: $InstanceType
Colour:
Default: $Colour
然后我有我的变量文件:
variables.txt
InstanceType=t2.micro
Colour=Blue
Region=eu-west-1
然后我有我的脚本进行替换:
script.是
#!/bin/bash
source variables.txt
export $(cut -d= -f1 variables.txt)
cat cloudformation.yaml | envsubst > subs_cloudformation.yaml
这是我的文件夹的内容:
cloudformation.yaml script.sh variables.txt
我确保我的script.sh具有正确的权限:
chmod +x script.sh
并运行我的脚本:
./script.sh
我的文件夹的内容现在是:
cloudformation.yaml script.sh variables.txt subs_cloudformation.yaml
如果我查看subs_cloudformation.yaml文件的内容:
Region
Default: eu-west-1
InstanceType
Default: t2.micro
Colour:
Default: Blue
我现在可以运行那个cloudformation脚本,而cloudformation将把这些默认值替换成我的模板 - 所以我们用上面的脚本做的就是给cloudformation提供默认值。
我当然只是给出了一个cloudformation模板的片段,你可以通过使用变量的dev.txt,qa.txt,production.txt文件来进一步改进它,并替换其中的任何一个。
编辑:虽然您的变量在文件中的位置并不重要,因此它可以在userdata或参数中作为默认值。无关紧要。您还需要注意,这不会检查您的cloudformation文件中的每个变量是否都有匹配的环境变量。如果它不在您的变量文件中,则替换值将为空。