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

How to pass script to UserData field in EC2 creation on AWS Lambda?

我正在尝试在 AWS Lambda 创建的新 EC2 实例的 Userdata 字段中传递脚本(使用适用于 Javascript、Node.js 6.10 的 AWS SDK):

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

首先,base64 编码在您的示例中所必需的。尽管文档声明这是自动为您完成的,但我在使用用户数据创建 ec2 实例的 lambda 函数中始终需要它。其次,从 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
// ...