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

Amazon ec2 使用本地环境替换cloudformation模板中的变量,amazon-ec2,amazon-cloudformation,user-data,Amazon Ec2,Amazon Cloudformation,User Data,我想在cloudformation模板的userdata中替换一些变量,我不想将这些变量作为参数放入cloudformation中。 我该怎么做? 似乎cloudformation希望始终包含任何需要替换为参数的变量,但我觉得这不够灵活。所以,我不确定是否有其他人想出了这样做的方法 某些变量实际上不需要绑定到基础设施,但需要动态替换这些变量 例如,我有这个userdata UserData: "Fn::Base64": !Sub | #

我想在cloudformation模板的userdata中替换一些变量,我不想将这些变量作为参数放入cloudformation中。 我该怎么做? 似乎cloudformation希望始终包含任何需要替换为参数的变量,但我觉得这不够灵活。所以,我不确定是否有其他人想出了这样做的方法

某些变量实际上不需要绑定到基础设施,但需要动态替换这些变量

例如,我有这个userdata

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
如何在不使用这些变量作为参数的情况下,在userdata中使用这些要替换的本地env值。我已经尝试了所有我能想到的,但我不能这样做

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


谢谢

这里有一种通过脚本实现的方法,在某些情况下,此脚本可能会出现问题,但您必须进行测试和查看

我不希望环境变量在准备cloudformation脚本之外可用,所以我在一个脚本文件中完成了所有工作;加载环境变量并进行替换

注意:您需要在计算机上安装envsubt

我有3个文件要开始: 文件1是我的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变量文件并替换其中的任何一个来进一步改进它


编辑:不过,变量在文件中的位置并不重要,因此它可以默认在userdata或parameters中。。没关系。您还需要小心,这不会检查cloudformation文件中的每个变量是否都有匹配的环境变量。如果它不在变量文件中,则替换的值将为空。

这就是像Ansible这样的部署工具的用武之地,您可以在cloudformation之外存储变量,并让Ansible替换变量。你愿意在bash中这样做吗?我知道ansible,但我现在更关注云信息。我非常了解ansible…bash在使用类似于
sed
?或者你在想什么?变量究竟来自哪个环境?它们是否在堆栈的“外部”,例如在从模板开始创建堆栈的机器上?或者其他地方?我不想安装任何东西或有一些特殊的先决条件..我可以很容易地使用
sed
,但只想检查可能有一些我不知道的cloudformation功能..如果这不是本机可能的,那么就使用类似
sed
Ok的东西-建议对您的问题进行编辑,因为您没有说明如果您不想安装任何应用程序或软件包,或者您知道如何使用
sed
并且正在寻找替代方案,那么请检查您的系统上是否尚未安装envsubst。我知道它在一些linux系统上。
Region
  Default: eu-west-1

InstanceType
  Default: t2.micro

Colour:
  Default: Blue