使用 AWS CLI --cli-input-json 参数时如何设置用户数据?

使用 AWS CLI --cli-input-json 参数时如何设置用户数据?

我正在尝试创建一个脚本,该脚本将使用 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 编码版本可能也可以正常工作,只要它只有一行。

为了测试目的,请注意以下事项:

  1. 启动后,如果您使用 SSH 连接到实例,则可以使用它curl http://169.254.169.254/latest/user-data来查看传递给 UserData 的值是如何解释的。在我的测试中,如果我使用了 "UserData": "file://userdata.bash",则返回的值是 file://userdata.bash 而不是脚本的内容。
  2. 您还可以检查 /var/log/boot.log 文件中是否存在与您的用户数据脚本相关的消息。
  3. 您还可以通过控制台通过actions->instance settings->view/change userdata检查userdata的值。

正如您所说的,这并没有得到很好的记录,我怀疑有一种方法可以让命令读取文件的内容而不是使用文字值,但我没有在任何地方看到它的记录。

相关内容