Правильный синтаксис для bash-скрипта в качестве пользовательских данных для запуска AWS

Я пытаюсь запустить новый экземпляр ec2 через лямбду каждый раз, когда происходит определенное событие. У меня есть скрипт bash, который я хочу запускать каждый раз, когда запускается новый экземпляр ec2, и я хотел бы, чтобы он был присоединен с использованием параметра userdata для runinstances.

Я протестировал скрипт, и он хорошо работает, когда я запускаю экземпляр через консоль aws.

Я подозреваю, что это, вероятно, потому что мой синтаксис неправильный. Я понимаю, что вопрос очень простой, но я несколько раз пробовал разные варианты и не могу его запустить.

   function(next) {
        console.log("INITIALIZING EC2");

        var params = {
        ImageId: 'ami-b2c934d2',
        InstanceType: 't2.micro', //'c4.4xlarge',
        MinCount: 1, MaxCount: 1,
        KeyName: 'malpem2102'
        UserData : console.log(new Buffer('#!/bin/bash \n
            sudo apt-get install awscli -y \n
            echo alarm \n
            aws configure set default.region us-west-2 \n
            aws configure set aws_access_key_id AKIAIXXXXXXXXX \n
            aws configure set aws_secret_access_key U2fyRtyakG1kAXXXXXXXXXX \n
            instance=`curl -s http://169.254.169.254/latest/meta-data/instance-id/` \n
            aws cloudwatch put-metric-alarm --alarm-name $instance --alarm-description 
            "Terminate the instance when it is idle for 10mins" --namespace "AWS/EC2" 
            --dimensions Name=InstanceId,Value=$instance --statistic Average  
            --metric-name CPUUtilization --comparison-operator LessThanThreshold 
            --threshold 5 --period 120 --evaluation-periods 5 --alarm-actions 
            arn:aws:automate:us-west-2:ec2:terminate \n').toString('base64'));
        };

2 ответа

При использовании вызовов API вам нужно отправлять команды в виде кодированной строки base64.

Итак, вам нужно получить необработанные данные команд и кодировать в base64 для входа в UserData пары.

Например, если у вас есть следующие команды:

#!/bin/bash
curl --silent --location https://rpm.nodesource.com/setup_10.x | sudo bash -
sudo yum install -y nodejs
sudo yum install -y git
git clone https://github.com/user/repo
cd repo
npm i
npm run start

После того, как вы закодируете в base64 с помощью таких инструментов, как Base64 Decode и Encode, вы можете использовать в качестве параметров свои UseData следующим образом:

const params = {
    ImageId: 'ami-b2c934d2',
    InstanceType: 't2.micro', //'c4.4xlarge',
    MinCount: 1, MaxCount: 1,
    KeyName: 'malpem2102',
    UserData: 'IyEvYmluL2Jhc2gNCmN1cmwgLS1zaWxlbnQgLS1sb2NhdGlvbiBodHRwczovL3JwbS5ub2Rlc291cmNlLmNvbS9zZXR1cF8xMC54IHwgc3VkbyBiYXNoIC0NCnN1ZG8geXVtIGluc3RhbGwgLXkgbm9kZWpzDQpzdWRvIHl1bSBpbnN0YWxsIC15IGdpdA0KZ2l0IGNsb25lIGh0dHBzOi8vZ2l0aHViLmNvbS9jb2RlcmFkZS9hd3MtZWMyLWV4YW1wbGVzDQpjZCBoYmZsDQpucG0gaQ0KbnBtIHJ1biBzdGFydA=='
};

Вы также можете кодировать, используя собственный подход Javascript, с помощью следующего кода:

let commandsString = `#!/bin/bash
curl --silent --location https://rpm.nodesource.com/setup_10.x | sudo bash -
sudo yum install -y nodejs
sudo yum install -y git
git clone https://github.com/user/repo
cd repo
npm i
npm run start`;

UserData: new Buffer(commandsString).toString('base64');

Для получения дополнительной информации прочитайте документацию Запуск команд в вашем экземпляре Linux на Launch.

Я думаю, что вам просто нужно удалить инструкцию console.log из вашего кода.

Другие вопросы по тегам