在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