如何在 AWS Lambda 上创建 EC2 时将脚本传递给 UserData 字段?

raf*_*ico 6 amazon-ec2 amazon-web-services aws-sdk aws-lambda aws-sdk-nodejs

我正在尝试在由 AWS Lambda 创建的新 EC2 实例的 Userdata 字段中传递脚本(使用 AWS SDK for 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");
   });
});
...
Run Code Online (Sandbox Code Playgroud)

我尝试了几件事,例如: - 创建一个字符串并将该字符串传递给 UserData - 不起作用 - 创建一个字符串并将其编码为 base64 并将该字符串传递给 UserData - 不起作用 - 粘贴 base64 编码的字符串 - 不起作用

你能帮我理解如何在 UserData 中传递脚本吗?AWS SDK 文档有点缺乏。

是否也可以将放置在 S3 存储桶中的脚本传递给 UserData?

Tim*_*ach 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
// ...
Run Code Online (Sandbox Code Playgroud)