如何通过AWS SDK在新创建的EC2实例上运行脚本?

时间:2017-11-06 12:21:30

标签: javascript amazon-web-services amazon-ec2

我目前正在使用AWS的Javascript SDK来启动自定义EC2实例,到目前为止一直很好。

但是现在,我需要这些实例在创建时能够运行某些任务,例如,从Github克隆一个repo,安装一个软件堆栈并配置一些服务。

这是为了模仿我对本地虚拟机部署的类似行为。在这种情况下,我使用Ansible运行一些配置脚本来完成工作。

对于我的用例,这是AWS的不同服务中使用AWS的Javascript SDK实现此目的的最佳选择?

无论如何我可能有一个模板脚本,我传递了一些运行时获取的变量来执行我刚刚创建的实例中的某些任务?我读到了user-data但我无法弄清楚如何使用AWS的SDK。此外,它似乎无法自定义。

在一天结束时,我想我需要一种方法来使用SDK来执行此操作:

  

"在新创建的实例上,运行存储在此类位置的此脚本,替换这些脚本   脚本中的占位符值与我们现在给你的#34;

任何提示?

2 个答案:

答案 0 :(得分:1)

当您启动新实例时,您可以在同一个AWS SDK / API调用中提供user-data。这是放置任何服务器初始化代码的最佳位置。

通过SDK启动实例脚本的唯一方法是通过SSM服务的运行命令功能。但这需要实例已安装AWS SSM代理。这非常适合远程服务器管理,但user-data更适合在首次启动时初始化实例。

答案 1 :(得分:1)

正如Mark B.所说,UserData是在实例启动时执行命令的方法。当您使用javascript标记问题时,这是一个关于在ec2.runInstances命令中传递此问题的示例:

let AWS = require('aws-sdk')
let ec2 = new AWS.EC2({region: 'YOUR_REGION'})
// Example commands to create a folder, a file and delete it
let commands = [
    '#!/usr/bin/env bash',
    'mkdir /home/ubuntu/test',
    'touch /home/ubuntu/test/examplefile',
    'rm -rf /home/ubuntu/test'
];
let params = {
    ...YOUR PARAMS HERE...
    UserData: new Buffer(commands.join("\n")).toString('base64')
}
// You need to encode it with Base64 for it to be executed by the userdata interpreter
ec2.runInstances(params).promise().then(res => { console.log(res); })