web-dev-qa-db-ja.com

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ファイルに入れると、ユーザーデータ部分が正しく解析されません。

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部分のフォーマットについておかしいようです。

任意の提案をいただければ幸いです。

2
scuba_mike

機能する1つのことは、スクリプトの実際の内容をjsonファイルのUserDataに割り当て、改行文字を使用してスクリプトの行を区切ることです。例として使用したテストスクリプトは次のとおりです。

  "UserData":  "#!/bin/bash\nyum install emacs -y\n",

これにより、起動時にインスタンスにemacsがインストールされます。 1行である限り、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ファイルでuserdataスクリプトに関連するメッセージを確認することもできます。
  3. アクション->インスタンス設定->ユーザーデータの表示/変更を介して、コンソールからユーザーデータの値を確認することもできます。

あなたが述べたように、これはあまり文書化されていません、そして私はリテラル値を使用する代わりにコマンドにファイルの内容を読む方法を得る方法があると思います、しかし私はそれがどこにも文書化されたのを見ませんでした。

1
vjones