私は、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ファイルに入れると、ユーザーデータ部分が正しく解析されません。
launch.json
という名前の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
引数を指定して実行すると、userdataスクリプトを除いて、すべて正常にロードされます。
スクリプトをbase64に変換して直接ロードしようとしましたが、機能しませんでした。私はファイル名だけを試しましたが、それもうまくいきませんでした。 ドキュメンテーション は、yamlファイルのuserdata部分のフォーマットについておかしいようです。
任意の提案をいただければ幸いです。
機能する1つのことは、スクリプトの実際の内容をjsonファイルのUserDataに割り当て、改行文字を使用してスクリプトの行を区切ることです。例として使用したテストスクリプトは次のとおりです。
"UserData": "#!/bin/bash\nyum install emacs -y\n",
これにより、起動時にインスタンスにemacsがインストールされます。 1行である限り、base64でエンコードされたバージョンも機能する可能性があります。
テストのため、次の点に注意してください。
curl http://169.254.169.254/latest/user-data
を使用して、UserDataに渡した値がどのように解釈されたかを確認します。私のテストでは、"UserData": "file://userdata.bash"
の場合、返される値はスクリプトの内容ではなくfile://userdata.bashでした。あなたが述べたように、これはあまり文書化されていません、そして私はリテラル値を使用する代わりにコマンドにファイルの内容を読む方法を得る方法があると思います、しかし私はそれがどこにも文書化されたのを見ませんでした。