使用 CloudFormation 创建和删除 EC2 实例

Create and delete EC2 instance with CloudFormation

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

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

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

然后,一段时间后(比如说 2 小时),另一个作业应该启动并删除 CloudFormation 创建的所有资源。

这在 AWS 中可行吗?如果是,关于如何执行此操作的任何提示?

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

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

确认一下,您打算按计划创建一个 EC2 实例,然后在 2 小时后将其关闭。实现这一点的常用方法是使用 Auto-Scaling Group (ASG) with a ScheduledAction to scale up and a ScheduledAction 缩小。

ASG 有一个 "desired capacity"(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 and/or an IAM Instance Profile along with an IAM Role.

如果您使用 Jenkins 来部署将 运行 的程序,您将添加一个步骤来烘焙 AMI、构建并推送 docker 图像,或者采取任何其他操作需要将您的应用程序部署到您的实例将使用它的地方。

我注意到在您的问题中您说您想要删除 CloudFormation 创建的所有资源。通常,当您像这样部署堆栈时,堆栈会保持部署状态。 ASG 将保留在那里,直到您决定移除堆栈,但当您没有 运行 EC2 实例时它不会花费任何费用。我想我理解你的意图,所以我给出的建议与此一致。

如果您只需要一个 EC2 实例,那么简单地创建 EC2 实例可能比创建 CloudFormation 堆栈更容易。

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