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

Posted

技术标签:

【中文标题】如何在 AWS Lambda 上创建 EC2 时将脚本传递给 UserData 字段?【英文标题】:How to pass script to UserData field in EC2 creation on AWS Lambda? 【发布时间】:2018-03-11 11:28:27 【问题描述】:

我正在尝试在由 AWS Lambda 创建的新 EC2 实例的 Userdata 字段中传递一个脚本(使用适用于 javascript 的 AWS 开发工具包,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 文档有点欠缺。

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

【问题讨论】:

重要的是定义“不工作”的含义。我们知道这是行不通的,但这给我们的余地很少。它以什么方式失败? 是的@Mark B 很抱歉没有更详细:它首先失败是因为 base64 编码..我发现它是必需的,而不是按照文档中的说明自动完成。其次,字符串的定义方式错误。使用多行字符串,现在一切正常。 【参考方案1】:

首先,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
// ...

【讨论】:

以上是关于如何在 AWS Lambda 上创建 EC2 时将脚本传递给 UserData 字段?的主要内容,如果未能解决你的问题,请参考以下文章

AWS 征文AWS Lambda 自动拷贝EC2 快照

通过 AWS Lambda 函数访问 EC2 实例服务

AWS Lambda - 在区域之间自动复制 EC2 快照?

SSH到位于VPC中的私有子网中的AWS EC2实例

通过AWS lambda在EC2实例上执行python脚本

AWS lambda 使用启动模板和 boto3 创建 ec2 实例,仅使用所需的权限