Skip to main content
Service Catalog Version 0.78.1

EC2 Instance

View SourceFiltered Release Notes

Overview

This service creates a single EC2 instance that includes server hardening, IAM role, EIP (optional), EBS Volume (optional), and CloudWatch metrics, logs, and alerts. Note that a single EC2 instance can be a single point of failure, so if you want to run multiple EC2 instances for high availability and scalability, see the asg-service.

Features

  • Build an AMI to run on the EC2 instance
  • Create EC2 instance for the host
  • Allocate an optional Elastic IP Address (EIP) and an associated DNS record
  • Create an IAM Role and IAM instance profile
  • Create a security group to manage ingress and egress traffic on desired ports
  • Harden the OS by installing fail2ban, ntp, auto-update, ip-lockdown, and more
  • Send all logs and metrics to CloudWatch
  • Configure alerts in CloudWatch for CPU, memory, and disk space usage
  • Manage SSH access with IAM groups using ssh-grunt
  • Create and mount optional EBS volumes
  • Allow ingress traffic on desired ports

Learn

note

This repo is a part of the Gruntwork Service Catalog, a collection of reusable, battle-tested, production ready infrastructure code. If you’ve never used the Service Catalog before, make sure to read How to use the Gruntwork Service Catalog!

Core concepts

The EC2 Instance AMI

The EC2 Instance AMI is defined using the Packer template at ec2-instance.json. This template configures the AMI to:

  1. Run the ssh-grunt module so that developers can upload their public SSH keys to IAM and use those SSH keys, along with their IAM user names, toSSH to the EC2 instance.

  2. Run the auto-update module so that the EC2 instance installs security updates automatically.

  3. Optionally run the syslog module to automatically rotate and rate limit syslog so that the EC2 instance doesn’t run out of disk space from large volumes of logs.

Deploy

Non-production deployment (quick start for learning)

If you just want to try this repo out for experimenting and learning, check out the following resources:

  • examples/for-learning-and-testing folder: The examples/for-learning-and-testing folder contains standalone sample code optimized for learning, experimenting, and testing (but not direct production usage).

Production deployment

If you want to deploy this repo in production, check out the following resources:

  • examples/for-production folder: The examples/for-production folder contains sample code optimized for direct usage in production. This is code from the Gruntwork Reference Architecture, and it shows you how we build an end-to-end, integrated tech stack on top of the Gruntwork Service Catalog, configure CI / CD for your apps and infrastructure.

Reference

  • alarms_sns_topic_arn The ARNs of SNS topics where CloudWatch alarms (e.g., for CPU, memory, and disk space usage) should send notifications.
  • ami The AMI to run on the EC2 instance. This should be built from the Packer template under ec2-instance.json. One of var.ami or ami_filters is required. Set to null if looking up the ami with filters.
  • ami_filters Properties on the AMI that can be used to lookup a prebuilt AMI for use with the EC2 instance. You can build the AMI using the Packer template ec2-instance.json. Only used if var.ami is null. One of var.ami or ami_filters is required. Set to null if passing the ami ID directly.
  • attach_eip Determines if an Elastic IP (EIP) will be created for this instance.
  • base_domain_name_tags Tags to use to filter the Route 53 Hosted Zones that might match the hosted zone's name (use if you have multiple public hosted zones with the same name)
  • cloudwatch_log_group_tags Tags to apply on the CloudWatch Log Group, encoded as a map where the keys are tag keys and values are tag values.
  • default_user The default OS user for the EC2 instance AMI. For AWS Ubuntu AMIs, which is what the Packer template in ec2-instance.json uses, the default OS user is 'ubuntu'.
  • dns_ttl DNS Time To Live in seconds.
  • ebs_volumes The EBS volumes to attach to the instance. This must be a map of key/value pairs.
  • enable_cloudwatch_alarms Set to true to enable several basic CloudWatch alarms around CPU usage, memory usage, and disk space usage. If set to true, make sure to specify SNS topics to send notifications to using alarms_sns_topic_arn.
  • enable_fail2ban Enable fail2ban to block brute force log in attempts. Defaults to true.
  • enable_ip_lockdown Enable ip-lockdown to block access to the instance metadata. Defaults to true.
  • external_account_ssh_grunt_role_arn If you are using ssh-grunt and your IAM users / groups are defined in a separate AWS account, you can use this variable to specify the ARN of an IAM role that ssh-grunt can assume to retrieve IAM group and public SSH key info from that account. To omit this variable, set it to an empty string (do NOT use null, or Terraform will complain).
  • instance_type The type of instance to run for the EC2 instance
  • keypair_name The name of a Key Pair that can be used to SSH to this instance. This instance may have ssh-grunt installed. The preferred way to do SSH access is with your own IAM user name and SSH key. This Key Pair is only as a fallback.
  • name The name of the EC2 instance and the other resources created by these templates
  • should_create_cloudwatch_log_group When true, precreate the CloudWatch Log Group to use for log aggregation from the EC2 instances. This is useful if you wish to customize the CloudWatch Log Group with various settings such as retention periods and KMS encryption. When false, the CloudWatch agent will automatically create a basic log group to use.
  • ssh_grunt_iam_group If you are using ssh-grunt, this is the name of the IAM group from which users will be allowed to SSH to this EC2 instance. To omit this variable, set it to an empty string (do NOT use null, or Terraform will complain).
  • ssh_grunt_iam_group_sudo If you are using ssh-grunt, this is the name of the IAM group from which users will be allowed to SSH to this EC2 instance. To omit this variable, set it to an empty string (do NOT use null, or Terraform will complain).
  • subnet_id The ID of the subnet in which to deploy the EC2 instance. Must be a subnet in vpc_id.
  • tags A map of tags to apply to the EC2 instance and the S3 Buckets. The key is the tag name and the value is the tag value.
  • tenancy The tenancy of this instance. Must be one of: default, dedicated, or host.
  • vpc_id The ID of the VPC in which to deploy the EC2 instance.