在Amazon EC2中启动实例时传递脚本

时间:2012-10-25 22:40:31

标签: shell amazon-ec2 amazon-web-services cloud

在我启动实例时是否可以传递脚本?这样实例一旦初始化就会执行该脚本吗?

public static void startInstance(final String instanceId) {
    StartInstancesRequest startRequest = new StartInstancesRequest().withInstanceIds(instanceId);
    logger.info(String.format("Starting instance '%s':...", instanceId));
    ec2.startInstances(startRequest);       
}

有什么想法吗?脚本将是一种启动脚本,我需要在实例准备好后立即执行。提前谢谢。

2 个答案:

答案 0 :(得分:5)

我在2009年社区Ubuntu AMIs中引入了用户数据脚本的概念(来自RightScale的一些想法的简化版本):

  

http://alestic.com/2009/06/ec2-user-data-scripts

归结为:

  

如果实例用户数据以两个字符#!开头,则实例在第一次启动时以root用户身份运行。

此功能后来包含在CloudInit包中的官方Ubuntu AMI中:

  

https://help.ubuntu.com/community/CloudInit

Amazon现在在他们自己的Amazon Linux AMI中包含CloudInit包:

  

http://docs.amazonwebservices.com/AWSEC2/latest/UserGuide/AmazonLinuxAMIBasics.html

欢迎其他发行版(并且可能已经)在其AMI中包含此功能。

答案 1 :(得分:0)

您可以使用Userdata将脚本传递给新的EC2实例,但我不知道您是否可以启动预先存在的实例并将其传递给它。

我有一个预配置的AMI,它在根驱动器上保存了一个脚本,该脚本用于配置服务器并下载最新的源。

因此,您的请求可能如下所示:

var runInstance = new RunInstancesRequest();

        runInstance.WithImageId("{ami-id}")
            .WithInstanceType("{size}")
            .WithMaxCount(1)
            .WithMinCount(1)
            .WithSecurityGroup("{the security group}")
            .WithKeyName("{your key}")
            .WithUserData(Convert.ToBase64String(Encoding.ASCII.GetBytes(userData)));

        ec2.RunInstances(runInstance);

用户数据可以包含对脚本的引用或脚本本身。