如何将脚本传递到AWS Lambda上的EC2创建中的UserData字段?

6

我正在尝试通过 AWS SDK for Javascript (Node.js 6.10)创建的 AWS Lambda,在新的 EC2 实例用户数据字段中传递一个脚本:

...
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文档有点缺乏。
是否也可以将放置在S3存储桶中的脚本传递给UserData?

重要的是要“定义”您所说的“不工作”。我们知道它不起作用,但这给我们很少的线索。它在哪方面失败了? - Michael - sqlbot
抱歉 @Mark B ,我没有提供更详细的信息:它首先因为 base64 编码失败了。我发现文档中所述的自动处理并不正确。其次,字符串的定义方式错误。现在使用多行字符串后,一切工作正常。 - raffaeletalarico
1个回答

8

首先,在您的示例中需要进行base64编码。尽管文档中指出这是自动完成的,但我总是需要在我的lambda函数中创建带有用户数据的ec2实例时进行编码。其次,从ES6开始,多行字符串可以让您的生活更轻松,只要您在lambda函数中添加脚本即可。

因此,请尝试以下内容:

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
// ...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接