我有一些要在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命令的机器上设置环境变量值
export TAG=1.9.9
export SERVER_ID=12
export AWS_REGION=us-east-1
如何在不使用这些变量作为参数的情况下,在用户数据中替换这些本地env值。我已经尝试了所有我能想到的,但我做不到。
因此,如果有人想到了一种方法或黑客手段,便想利用互联网的力量。
谢谢
答案 0 :(得分:0)
这是通过脚本执行此操作的一种方法,在某些情况下该脚本可能会产生问题,但您必须进行测试并查看。
我不希望在准备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.sh
#!/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文件并替换其中的任何一个来进一步改善它。
编辑:虽然变量在文件中的什么位置都无关紧要,所以默认情况下它可以位于用户数据或参数中。您还需要注意,这不会检查您的cloudformation文件中的每个变量是否都有匹配的环境变量。如果不在变量文件中,则替换值将为空白。