使用本地环境替换cloudformation模板中的变量

时间:2019-04-15 05:01:36

标签: amazon-ec2 amazon-cloudformation user-data

我有一些要在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值。我已经尝试了所有我能想到的,但我做不到。

因此,如果有人想到了一种方法或黑客手段,便想利用互联网的力量。

谢谢

1 个答案:

答案 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文件中的每个变量是否都有匹配的环境变量。如果不在变量文件中,则替换值将为空白。