以编程方式创建和部署按需 EC2

Posted

技术标签:

【中文标题】以编程方式创建和部署按需 EC2【英文标题】:Programmatically create and deploy On-Demand EC2 【发布时间】:2016-05-20 05:12:37 【问题描述】:

是否可以以编程方式获取/部署和启动 EC2 实例?基本上选择您的实例类型、AMI 并启动它?

我看到了StartInstance 方法,但这仅适用于已在您的帐户中创建和停止的实例。

http://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_StartInstances.html

基本上,发生的事情是我有一个需要多个 EC2 实例进行计算的自动化服务。我需要以编程方式创建一个新实例,选择实例类型,选择 AMI,启动它并运行一些部署脚本来让事情顺利进行。

我认为有一种方法可以使用 AWS 开发工具包做到这一点,但我只是没有看到它。

在相关说明中,还需要能够以编程方式销毁关闭实例。

【问题讨论】:

【参考方案1】:

您可以编写 SDK 脚本来完成这项工作(创建、更改和销毁 ec2 实例),这取决于您掌握的语言,例如 javascript、java、ruby、python 等。

但有更简单的跟进方式,我们称之为infrastructure as code,试试aws cloudformation或Hashicopy的terraform

使用他们的模板,您可以将整个基础架构(包括 ec2、rds、vpc、安全组、子网等)部署为分钟作业。

参考:

AWS CloudFormation templates

Terraform AWS PROVIDER

【讨论】:

+1 表示 CloudFormation 服务。我从来不知道它的存在。我需要看看它是否符合我们的需求,因为我们真正需要做的就是启动一个特定的 AMI 并运行一些脚本。谢谢! @JakeWilson 你最后做了什么?效果如何?【参考方案2】:

你可以试试这个..

   AmazonEC2Client amazonEc2client = GetAmazonClient(ConfigurationManager.AppSettings["AwsRegionEndPint"]);
     var launchRequest = new RunInstancesRequest()
                    
                        ImageId = YOUR IMAGE ID,
                        InstanceType = YOUR INSTANCE TYPE,
                        MinCount = 1,
                        MaxCount = 1,
                        KeyName = your keyPairName,
                        SecurityGroupIds =your  groups,
                        SubnetId = your subnet Id,

                    ;
                    RunInstancesResponse runInstancesResponse = amazonEc2client.RunInstances(launchRequest);

//用于分配标签名称的代码

var InstanceId = runInstancesResponse.Reservation.Instances[0].InstanceId;
                var trequest = new CreateTagsRequest();
                trequest.Resources=new List<string>()InstanceId;
                List<Tag> tags=new List<Tag>();
                Tag tag=new Tag("Name","TestCodeFinal");
                tags.Add(tag);
                trequest.Tags = tags;
                amazonEc2client.CreateTags(trequest);
                Reservation reservation = runInstancesResponse.Reservation;

【讨论】:

【参考方案3】:

是的,这是可能的。

您使用RunInstances API 方法。

使用您拥有权限的 AMI 启动指定数量的实例。

要完全摆脱实例,请使用TerminateInstance。

关闭一个或多个实例。这个操作是幂等的;如果您多次终止一个实例,则每次调用都会成功。

该语言有点令人困惑,因为它说“关闭一个或多个实例”,但实际上它完全删除了它们。

【讨论】:

谢谢,这与RequestSpotInstances 有何不同? RequestSpotInstance 允许您以当前现货市场价格为可用实例出价。如果您的出价至少等于市场价格,这将成功。如果当前的市场价格后来超过您愿意支付的价格,此类实例可以在不通知的情况下关闭。现货市场通常用于 CPU(或 GPU)密集型任务,其中需要尽可能便宜的多个实例,工作在所有可用实例之间分配,并且架构可以承受一些即将消失的实例。 好的,所以RunInstances 打算以当前的每小时 AWS 价格启动按需实例?如果是这样,那就是我正在寻找的,谢谢。

以上是关于以编程方式创建和部署按需 EC2的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Auto Scaling 按需动态增加和减少实例

在 Nodejs 中以编程方式连接到 Mongodb Amazon EC2 实例

通过 SSH 连接到 EBS 创建的 EC2 实例

在弹性 beantalk 部署上的 ec2 微型实例上创建交换文件/驱动器

在不活动的情况下以编程方式停止 AWS EC2

如何以编程方式更改 Elastic Beanstalk 环境中的 EC2 实例类型?