CorribView
CorribView

Reputation: 741

CloudFormation to automate creation of a new EC2 instance & volume

I need to do the following actions in sequence and wondering if I should use CloudFormation to achieve this:

Launch a new EC2 instance (currently I'm manually doing it by selecting "Launch more like these" on a specific instance.

If this can't be done via CloudFormation would it be possible to automate it somehow?

Upvotes: 2

Views: 2193

Answers (3)

Jeremy Thompson
Jeremy Thompson

Reputation: 65712

Take Johns advice and use an AMI. This sample will get you started, it launches a single EC2 using an AMI (latest patched one) in an Auto Scale Group of Min 1 - Max 1 so one EC2 instance will always be on regardless of a power failure, AZ going down, etc.

Replace XYZ with your products name:

Parameters:
  KeyPairName:
    Description: >-
      Mandatory. Enter a Public/private key pair. If you do not have one in this region,
      please create it before continuing
    Type: 'AWS::EC2::KeyPair::KeyName'
  EnvType:
    Description: Environment Name
    Default: dev
    Type: String
    AllowedValues:  [dev, test, prod]
  Subnet1ID:
    Description: 'ID of the subnet 1 for auto scaling group into'
    Type: 'AWS::EC2::Subnet::Id'
  Subnet2ID:
    Description: 'ID of the subnet 2 for auto scaling group'
    Type: 'AWS::EC2::Subnet::Id'
  Subnet3ID:
    Description: 'ID of the subnet 3 for auto scaling group'
    Type: 'AWS::EC2::Subnet::Id'

Resources:
  XYZMainLogGroup:
    Type: 'AWS::Logs::LogGroup'
  SSHMetricFilter:
    Type: 'AWS::Logs::MetricFilter'
    Properties:
      LogGroupName: !Ref XYZMainLogGroup
      FilterPattern: ON FROM USER PWD
      MetricTransformations:
        - MetricName: SSHCommandCount
          MetricValue: 1
          MetricNamespace: !Join
            - /
            - - AWSQuickStart
              - !Ref 'AWS::StackName'
  XYZAutoScalingGroup:
    Type: 'AWS::AutoScaling::AutoScalingGroup'
    Properties:
      LaunchConfigurationName: !Ref XYZLaunchConfiguration
      AutoScalingGroupName:  !Join
            - '.'
            - - !Ref 'AWS::StackName'
              - 'ASG'
      VPCZoneIdentifier:
        - !Ref Subnet1ID
        - !Ref Subnet2ID
        - !Ref Subnet3ID
      MinSize: 1
      MaxSize: 1
      Cooldown: '300'
      DesiredCapacity: 1
      Tags:
        - Key: Name
          Value: 'The Name'
          PropagateAtLaunch: 'true'
  XYZLaunchConfiguration:
    Type: 'AWS::AutoScaling::LaunchConfiguration'
    Properties:
      AssociatePublicIpAddress: 'false'
      PlacementTenancy: default
      KeyName: !Ref KeyPairName
      ImageId: ami-123432164a1b23da1
      IamInstanceProfile: "BaseInstanceProfile"
      InstanceType: t2.small

      SecurityGroups:
        - Fn::If: [CreateDevResources, !Ref DevSecurityGroup, !Ref "AWS::NoValue"]

Upvotes: 1

John Rotenstein
John Rotenstein

Reputation: 270224

It sounds like you are wanting to launch an Amazon EC2 instance with the boot disk coming from an Amazon EBS Snapshot.

Might I suggest a simpler process?

Rather than creating a Snapshot of the Amazon EBS volume, instead create an Amazon Machine Image (AMI) of the original instance. Then, when launching the new Amazon EC2 instance, simply select the AMI. This will result in a new instance starting up with the desired boot disk.

Alternatively, you can create an AMI from an existing Amazon EBS Snapshot by selecting the Snapshot and choosing the Create Image command. (But I think this only works for Linux, not Windows.) Then, launch new EC2 instances from the AMI.

Behind-the-scenes, an AMI is actually just an Amazon EBS Snapshot with some additional information.

Upvotes: 3

Marcin
Marcin

Reputation: 238957

Yes, you can automated all these tasks using SSM Automation.

Specifically, your SSM Automation can consist of the following documents/actions:

  • AWS-AttachEBSVolume
  • AWS-DetachEBSVolume
  • AWS-StopEC2Instance
  • AWS-StartEC2Instance
  • AWS-RestartEC2Instance

Your SSM Automation can be triggered by CloudWatch Events. Also the SSM Automation can be constructed using CloudFormation.

Upvotes: 1

Related Questions