2012-10-25 113 views
2

在启动实例时是否可以传递脚本?因此,实例将在初始化后执行该脚本?在Amazon EC2中启动实例时传递脚本

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

有什么想法吗?脚本将是一种启动脚本,只要实例准备就绪,我需要执行它。提前致谢。

回答

5

我介绍的社区Ubuntu的AMI的用户数据脚本的概念在2009年(从RightScale的一些想法简化版本):

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

它归结为:

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

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

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

亚马逊现在包括CloudInit包在自己的亚马逊的Linux的AMI:

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

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

+0

我一直在Ubuntu规范映像中使用云初始化包。它通常效果很好,但是我已经看到了一些极少数情况,脚本因为某些原因而不执行,因此当您的应用程序首次开始运行时,您可能需要进行理智检查以确保您希望运行的脚本实际执行。例如,我有我的心跳脚本由弹性负载均衡器检查我的系统上的某些数据,这些数据只会在启动脚本中填充,然后才能将ELB健康状况检查返回200响应。 –

+0

太棒了!非常感谢Eric&Mike ... 还有一个问题,在快速搜索后发现,如果我们想通过AWS SDK来实现RunInstances,那么方法就是这样。现在问题是,RunInstances和StartInstances之间有什么区别?再次感谢 – dreamer

+0

@tanzir:在EC2上,“run”创建一个新的实例,“start”接受一个已经停止的实例并重新运行。 –

0

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

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

所以,你的请求可能如下所示:

VAR runInstance =新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); 

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

+0

可以在实例停止时更改实例的用户数据,但当实例再次启动时,CloudInit软件将不会运行它。用户数据脚本仅在实例的第一次启动时运行。 –

+0

因此,如果我们想在每次启动实例时都运行脚本,那么没有办法做到这一点? 再次感谢Eric – dreamer

+0

@tanzir:您的用户数据脚本可以安装在每次启动时运行的标准启动脚本。 –

相关问题