Как передать скрипт в поле UserData при создании EC2 на AWS Lambda?

Я пытаюсь передать сценарий в поле Userdata нового экземпляра EC2, созданного AWS Lambda (с использованием AWS SDK для Javascript, Node.js 6.10):

...
var paramsEC2 = {
   ImageId: 'ami-28c90151', 
   InstanceType: 't1.micro',
   KeyName: 'myawesomekwy',
   MinCount: 1,
   MaxCount: 1,
   SecurityGroups: [groupname],
   UserData:'#!/bin/sh \n echo "Hello Lambda"'
};

// Create the instance
ec2.runInstances(paramsEC2, function(err, data) {
   if (err) {
      console.log("Could not create instance", err);
      return;
   }
   var instanceId = data.Instances[0].InstanceId;
   console.log("Created instance", instanceId);
   // Add tags to the instance
   params = {Resources: [instanceId], Tags: [
      {
         Key: 'Name',
         Value: 'taggggg'
      }
   ]};
   ec2.createTags(params, function(err) {
      console.log("Tagging instance", err ? "failure" : "success");
   });
});
...

Я пробовал несколько вещей, например: - создать строку и передать ее в UserData - не работает - создать строку и закодировать ее в base64 и передать строку в UserData - не работает - вставить строку в кодировке base64 - не работает

Не могли бы вы помочь мне понять, как передать скрипт в UserData? Документация по AWS SDK немного отсутствует.

Можно ли также передать в UserData скрипт, помещенный в корзину S3?


person raffaeletalarico    schedule 29.09.2017    source источник
comment
Важно определить, что вы имеете в виду, говоря, что не работает. Мы знаем, что это не работает, но это мало что дает. Как это не удается?   -  person Michael - sqlbot    schedule 30.09.2017
comment
да, @Mark B, извините за то, что не стал более подробным: сначала он не удался из-за кодировки base64 ... что, как я обнаружил, требуется и не выполняется автоматически, как указано в документации. во-вторых, строка была определена неверно. с многострочной строкой теперь все работает.   -  person raffaeletalarico    schedule 06.10.2017


Ответы (1)


Во-первых, в вашем примере требуется кодировка base64. Хотя в документации указано, что это делается для вас автоматически, мне всегда это нужно в моих лямбда-функциях, создающих экземпляры ec2 с пользовательскими данными. Во-вторых, начиная с ES6, многострочные строки могут облегчить вашу жизнь, если вы добавляете скрипты в свою лямбда-функцию.

Итак, попробуйте следующее:

var userData= `#!/bin/bash
echo "Hello World"
touch /tmp/hello.txt
`

var userDataEncoded = new Buffer(userData).toString('base64');

var paramsEC2 = {
    ImageId: 'ami-28c90151',
    InstanceType: 't1.micro',
    KeyName: 'AWSKey3',
    MinCount: 1,
    MaxCount: 1,
    SecurityGroups: [groupname],
    UserData: userDataEncoded
};

// Create the instance
// ...
person Tim Gerlach    schedule 29.09.2017