使用CloudFormation创建和删除EC2实例

时间:2017-12-28 21:53:43

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

我是AWS的新手,想知道如何使用CloudFormation实现以下任务。

我想用tomcat启动EC2实例并在其上部署一个java应用程序。这个java应用程序将执行一些操作。操作完成后,我想删除此CloudFormation堆栈创建的所有资源。

所有这些活动都应该是自动的。例如 - 我将创建CloudFormation堆栈JSON文件。在一天的特定时间,应该开始工作(我不知道AWS在哪里配置这样的工作或如何)。但我知道通过Jenkins,我们可以创建一个可以创建所有资源的CloudFormation堆栈。

然后,过了一段时间(比如2小时),另一个工作应该开始并删除CloudFormation创建的所有资源。

这可能在AWS中实现吗?如果是的话,有关如何做到这一点的任何提示吗?

3 个答案:

答案 0 :(得分:0)

您可以使用Lambda在regular schedule上执行事件。

编写一个调用CloudFormation的Lambda函数来创建资源堆栈。您甚至可以考虑在CloudFormation堆栈中包含终止Lambda函数,并将其配置为按计划运行(创建堆栈后2小时),以删除终止Lambda函数本身所属的堆栈(尚未尝试过,但是相信它会起作用)。或者,您可以在运行Java应用程序的EC2实例上从cron触发堆栈删除。

答案 1 :(得分:0)

要确认,您打算做的是按计划创建EC2实例,然后在2小时后关闭它。实现这一目标的常用方法是使用Auto-Scaling Group (ASG) ScheduledAction来扩展,ScheduledAction缩小。

ASG具有“所需容量”(ASG中的实例数)。您希望默认情况下该值为“0”,在您所需的时间将其更改为“1”,然后在两小时后将其更改回“0”。该怎么做是自动启动并随后根据您的日程终止您的EC2实例。

他们还使用LaunchConfiguration,这是EC2实例的模板,它将按计划开始。

MyASG: 
  Type: AWS::AutoScaling::AutoScalingGroup
  Properties: 
    AvailabilityZones: !GetAZs !Ref "AWS::Region"
    LaunchConfigurationName: !Ref MyLaunchConfiguration
    MaxSize: 1
    MinSize: 0
    DesiredCapacity: 0

ScheduledActionUp: 
  Type: AWS::AutoScaling::ScheduledAction
  Properties:
    AutoScalingGroupName: !Ref MyASG
    DesiredCapacity: 1
    Recurrence: "0 7 * * *"

ScheduledActionDown: 
  Type: AWS::AutoScaling::ScheduledAction
  Properties:
    AutoScalingGroupName: !Ref MyASG
    DesiredCapacity: 0
    Recurrence: "0 9 * * *"

MyLaunchConfiguration:
  Type: AWS::AutoScaling::LaunchConfiguration
  Properties:
    ImageId:  ami-xxxxxxxxx # <-- Specify the AMI ID that you want
    InstanceType: t2.micro # <-- Chaneg the instance size if you want
    KeyName: my-key # <-- Change to the name of an EC2 SSH key that you've added
    UserData: 
      Fn::Base64: !Sub |
        #!/bin/bash
        yum install -y aws-cfn-bootstrap
        # ...
        # ... run some commands to set up the instance, if you need to
        # ...
  Metadata:
    AWS::CloudFormation::Init:
      config:
        files:
          "/etc/something/something.conf":
            mode: 000600
            owner: root
            group: root
            content: !Sub |
              #
              # Add the content of a config file, if you need to
              #

根据您希望实例与之互动的内容,您可能还需要添加Security Group和/或IAM Instance Profile以及IAM Role

如果您正在使用Jenkins部署将运行的程序,您可以添加一个步骤来烘焙AMI,构建并推送docker镜像,或采取您将应用程序部署到其所需的任何其他操作将由您的实例使用。

我注意到在您的问题中,您说要删除CloudFormation创建的所有资源。通常,在部署此类堆栈时,堆栈仍会部署。 ASG将保留在那里,直到您决定删除堆栈,但是当您没有运行EC2实例时,它将不会花费任何成本。我想我在这里理解你的意图,所以我给出的建议与之相符。

答案 2 :(得分:0)

如果你想要的只是一个EC2实例,那么简单地创建EC2实例而不是CloudFormation堆栈可能更容易。

  • 某些内容(例如由Amazon CloudWatch Events触发的AWS Lambda函数)调用EC2 API以创建实例
  • 将用户数据传递到EC2实例以安装所需软件 使用预先安装好所有软件的自定义AMI
  • 在完成处理后让实例自行终止 - 这可以像调用操作系统关闭机器一样简单,并设置 EC2关机行为终止。
相关问题