使用文本文件指定脚本时使用 CloudFormation 内部函数'userdata'



在CloudFormation中,我可以使用内置函数!Sub将字符串中的变量替换为参数的值:

Parameters:
EnvironmentName:
Type: String
Default: Development
Resources:
Instance:
Type: AWS::EC2::Instance
Properties:
ImageId: ami-0194c3e07668a7e36
UserData:
Fn::Base64: !Sub
- |
#!/bin/bash
ENV_NAME=${my_env}
hostnamectl set-deployment $ENV_NAME
- {
my_env: !Ref EnvironmentName
}

当我尝试使用文本文件传递UserData脚本时,我得到以下错误:

util.py[WARNING]: Failed loading yaml blob. Invalid format at line 2 column 1: "could not determine a constructor for the tag '!Sub

用Fn::Sub:替换!Sub不会导致错误,但hostnamectl文件保持不变。

My CF template:

Parameters:
UserData:
Type: String
Resources:
Instance:
Type: AWS::EC2::Instance
Properties:
ImageId: ami-0194c3e07668a7e36
UserData: !Ref UserData

我的UserData文件:

#cloud-config
!Sub
- |
#!/bin/bash
ENV_NAME=${my_env}
hostnamectl set-deployment $ENV_NAME
- {
my_env: !Ref EnvironmentName
}

我的create-stack命令:

aws cloudformation create-stack --stack-name my-stack 
--template-body file://my-stack.yaml 
--parameters ParameterKey=UserData,ParameterValue=$(base64 userdata.txt) ParameterKey=EnvironmentName,ParameterValue=Development

我想知道当使用文本文件指定'userdata'时是否有使用CloudFormation固有函数的解决方案。

这只是模板中的语法错误。我已经为安装CodeDeploy代理做了类似的事情。我把它作为一个例子包含在下面:

UserData:
Fn::Base64: !Sub |
#!/bin/bash
sudo yum -y update
sudo yum -y install ruby wget
cd /home/ec2-user
wget https://aws-codedeploy-${AWS::Region}.s3.${AWS::Region}.amazonaws.com/latest/install
chmod +x ./install
sudo ./install auto

所以在你的情况下,我会把你的代码简化为:

UserData:
Fn::Base64: !Sub |
#!/bin/bash
ENV_NAME=${EnvironmentName}
hostnamectl set-deployment $ENV_NAME

最新更新