在 CloudFormation 中使用 Sub 函数会妨碍 bash 脚本的使用吗?

Posted

技术标签:

【中文标题】在 CloudFormation 中使用 Sub 函数会妨碍 bash 脚本的使用吗?【英文标题】:Does using the Sub function in CloudFormation hinder the use of bash scripts? 【发布时间】:2021-11-11 18:01:47 【问题描述】:

我在 Auto Scaling 组的 CloudFormation LaunchTemplate 中有以下 UserData。前两个命令没有问题,第三个没有被调用。没有 Sub 函数,一切顺利,但是我们的代码已经发展到需要将该 EBS 变量传递到某个地方(但不一定在 bash 脚本中)。我这样做的方式是不好的做法吗?如果没有,我如何确保最后一行被执行?

          Fn::Base64: 
            !Sub 
              - |
                #!/bin/bash
                echo $EBS > /home/ubuntu/test.txt
                aws s3 cp s3://s3url/script.sh /home/ubuntu
                bash script.sh "$(curl http://169.254.169.254/latest/meta-data/local-ipv4)" "$(cat /home/ubuntu/test.txt)"
              - EBS: !Ref DevEBS 

我使用过 cloud-boothook,但是在与 Sub 函数一起使用时,将其放在 #!/bin/bash 之前似乎会将用户锁定在创建的实例之外(密钥不被接受?)。

非常感谢您的帮助!

【问题讨论】:

使用set -x 这样你就可以得到错误的调试输出。 @jordanm 的语法是什么样的? 字面意思是set -x#!/bin/bash 之后。 【参考方案1】:

您正在将脚本复制到/home/ubuntu。但是您的用户数据在 根文件夹 中运行。因此,您的后续命令将不起作用。你必须 cd 进入 /home/ubuntu:

          Fn::Base64: 
            !Sub 
              - |
                #!/bin/bash
                echo $EBS > /home/ubuntu/test.txt
                aws s3 cp s3://s3url/script.sh /home/ubuntu
                cd  /home/ubuntu  
                bash script.sh "$(curl http://169.254.169.254/latest/meta-data/local-ipv4)" "$(cat /home/ubuntu/test.txt)"
              - EBS: !Ref DevEBS 

【讨论】:

以上是关于在 CloudFormation 中使用 Sub 函数会妨碍 bash 脚本的使用吗?的主要内容,如果未能解决你的问题,请参考以下文章

在 Cloudformation YAML 中,在多行字符串中使用 Ref(?使用 Fn:Sub)

如何在 cloudformation“Fn::Sub”中转义“$”

AWS CloudFormation:结合 ImportValue 和 Sub 函数会导致错误

在 Cloudformation 模板中引用动态角色名称

AWS:cloudformation CommaDelimitedList 和手动列表不匹配

模板格式错误:每个映射属性必须是字符串或列表