我正在尝试创建一个脚本,该脚本将使用 bash 脚本自动部署和安装 AWS EC2 实例。我有一个部署脚本看起来像这样:
#!/bin/bash
# Update apt-get
echo Updating apt-get repositories
apt-get update -yqq
# Install pre-requisits
echo Installing AWS CLI and Python 3
apt-get install -yqq awscli python3 python3-pip
# Set timezone to US/Eastern
# https://help.ubuntu.com/community/UbuntuTime
echo "US/Eastern" | sudo tee /etc/timezone
dpkg-reconfigure --frontend noninteractive tzdata
echo cloud-init userdata processed.
userdata.bash
当我通过参数部署实例时,部署脚本(让我们调用)运行良好:
aws ec2 run-instances \
--image-id ami-064a0193585662d74 \
--instance-type t3.micro \
--key-name "ssh key" \
--security-group-ids sg-abcdef01 sg-abcdef02 \
--user-data file://userdata.bash
实例启动,脚本运行,一切都很好!
但是当我将这些相同的选项放入 json 文件时,用户数据部分无法正确解析。
json 文件名为launch.json
:
{
"BlockDeviceMappings": [
{
"DeviceName": "/dev/sda1",
"Ebs": {
"DeleteOnTermination": true,
"VolumeType": "gp2",
"VolumeSize": 8
}
}
],
"ImageId": "ami-064a0193585662d74",
"InstanceType": "t3.micro",
"KeyName": "ssh key",
"SecurityGroupIds": ["sg-abcdef01", "sg-abcdef02"],
"Placement": {
"AvailabilityZone": "us-east-1a"
},
"IamInstanceProfile": {
"Arn": "arn:aws:iam::111111111111:instance-profile/some-role"
},
"UserData": "file://userdata.bash"
}
当我使用该参数运行时--cli-input-json
,除用户数据脚本外,所有内容均可正常加载。
我尝试将脚本转换为 base64 并直接加载,但没有成功。我尝试只加载文件名,也没有成功。 文档似乎对 yaml 文件的用户数据部分的格式保持沉默。
任何建议将不胜感激。
答案1
一个可行的方法是将脚本的实际内容分配给 json 文件中的 UserData,并使用换行符分隔脚本的行。这是我用作示例的测试脚本:
"UserData": "#!/bin/bash\nyum install emacs -y\n",
这会在启动时在我的实例上安装 emacs。base64 编码版本可能也可以正常工作,只要它只有一行。
为了测试目的,请注意以下事项:
- 启动后,如果您使用 SSH 连接到实例,则可以使用它
curl http://169.254.169.254/latest/user-data
来查看传递给 UserData 的值是如何解释的。在我的测试中,如果我使用了"UserData": "file://userdata.bash"
,则返回的值是 file://userdata.bash 而不是脚本的内容。 - 您还可以检查 /var/log/boot.log 文件中是否存在与您的用户数据脚本相关的消息。
- 您还可以通过控制台通过actions->instance settings->view/change userdata检查userdata的值。
正如您所说的,这并没有得到很好的记录,我怀疑有一种方法可以让命令读取文件的内容而不是使用文字值,但我没有在任何地方看到它的记录。