Shell 在AmazonEC2中启动实例时传递脚本

Shell 在AmazonEC2中启动实例时传递脚本,shell,amazon-ec2,amazon-web-services,cloud,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':...", i

是否可以在启动实例时传递脚本?使实例在初始化脚本后执行该脚本

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

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

您可以使用Userdata将脚本传递给新的EC2实例,尽管我不知道您是否可以启动一个预先存在的实例并传递它的数据

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

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

var runInstance=new runInstanceRequest()


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

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

归结起来是:

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

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

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


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

可以在实例停止时更改其用户数据,但当实例再次启动时,CloudInit软件将不会运行它。用户数据脚本只在实例的第一次启动时运行。因此,如果我们想在每次启动实例时运行脚本,那么没有办法做到这一点?再次感谢Eric@tanzir:您的用户数据脚本可以安装一个标准启动脚本,在每次启动时运行。我在Ubuntu规范映像中使用cloud init包已经有一段时间了。它通常工作得很好,但是我见过一些罕见的情况,脚本由于某种原因没有执行,因此当你的应用程序第一次开始运行时,你可能需要进行一次健全性检查,以确保你想要运行的脚本实际执行。例如,我的heartbeat脚本用于弹性负载平衡器检查系统上的某些数据,在返回ELB运行状况检查的200响应之前,这些数据只能由启动脚本填充。这太棒了!非常感谢埃里克和迈克。。。还有一个问题,在快速搜索后发现,如果我们想通过AWS SDK实现,RunInstances就是方法。现在的问题是,RunInstances和StartInstances之间有什么区别?谢谢again@tanzir:在EC2上,“run”创建一个新实例,“start”获取一个已停止的现有实例并使其再次运行。
        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);