AWS EC2 Cheatsheet
Essential Commands
bash
# List instances
aws ec2 describe-instances
# Describe specific instance
aws ec2 describe-instances --instance-ids i-1234567890abcdef0
# Start instance
aws ec2 start-instances --instance-ids i-1234567890abcdef0
# Stop instance
aws ec2 stop-instances --instance-ids i-1234567890abcdef0
# Reboot instance
aws ec2 reboot-instances --instance-ids i-1234567890abcdef0
# Terminate instance
aws ec2 terminate-instances --instance-ids i-1234567890abcdef0
# Get instance state
aws ec2 describe-instance-status --instance-ids i-1234567890abcdef0Instance Management
bash
# Create instance
aws ec2 run-instances \
--image-id ami-0c55b159cbfafe1f0 \
--count 1 \
--instance-type t2.micro \
--key-name my-key-pair \
--security-group-ids sg-903004f8 \
--subnet-id subnet-6e7f829e
# Create with user data
aws ec2 run-instances \
--image-id ami-0c55b159cbfafe1f0 \
--instance-type t2.micro \
--user-data file://user-data.sh
# Create with tags
aws ec2 run-instances \
--image-id ami-0c55b159cbfafe1f0 \
--instance-type t2.micro \
--tag-specifications \
'ResourceType=instance,Tags=[{Key=Name,Value=my-instance}]'Key Pairs
bash
# Create key pair
aws ec2 create-key-pair --key-name my-key-pair --query 'KeyMaterial' --output text > my-key-pair.pem
# List key pairs
aws ec2 describe-key-pairs
# Delete key pair
aws ec2 delete-key-pair --key-name my-key-pair
# Import key pair
aws ec2 import-key-pair \
--key-name imported-key \
--public-key-material fileb://~/.ssh/id_rsa.pubSecurity Groups
bash
# Create security group
aws ec2 create-security-group \
--group-name my-sg \
--description "My security group"
# Add inbound rule
aws ec2 authorize-security-group-ingress \
--group-id sg-903004f8 \
--protocol tcp \
--port 22 \
--cidr 0.0.0.0/0
# Add outbound rule
aws ec2 authorize-security-group-egress \
--group-id sg-903004f8 \
--protocol tcp \
--port 80 \
--cidr 0.0.0.0/0
# List security groups
aws ec2 describe-security-groups
# Delete security group
aws ec2 delete-security-group --group-id sg-903004f8
# Revoke rule
aws ec2 revoke-security-group-ingress \
--group-id sg-903004f8 \
--protocol tcp \
--port 22 \
--cidr 0.0.0.0/0AMI Management
bash
# Create AMI from instance
aws ec2 create-image \
--instance-id i-1234567890abcdef0 \
--name "my-ami" \
--description "My custom AMI"
# List AMIs
aws ec2 describe-images --owners self
# Describe specific AMI
aws ec2 describe-images --image-ids ami-0c55b159cbfafe1f0
# Deregister AMI
aws ec2 deregister-image --image-id ami-0c55b159cbfafe1f0
# Copy AMI to another region
aws ec2 copy-image \
--source-region us-east-1 \
--source-image-id ami-0c55b159cbfafe1f0 \
--name my-copied-ami \
--region us-west-2Volumes and Snapshots
bash
# Create volume
aws ec2 create-volume \
--size 20 \
--availability-zone us-east-1a \
--volume-type gp3
# List volumes
aws ec2 describe-volumes
# Attach volume
aws ec2 attach-volume \
--volume-id vol-1234567890abcdef0 \
--instance-id i-1234567890abcdef0 \
--device /dev/sdf
# Detach volume
aws ec2 detach-volume --volume-id vol-1234567890abcdef0
# Delete volume
aws ec2 delete-volume --volume-id vol-1234567890abcdef0
# Create snapshot
aws ec2 create-snapshot \
--volume-id vol-1234567890abcdef0 \
--description "My snapshot"
# List snapshots
aws ec2 describe-snapshots --owner-ids self
# Delete snapshot
aws ec2 delete-snapshot --snapshot-id snap-1234567890abcdef0Elastic IPs
bash
# Allocate Elastic IP
aws ec2 allocate-address
# Associate with instance
aws ec2 associate-address \
--instance-id i-1234567890abcdef0 \
--allocation-id eipalloc-1234567890abcdef0
# Disassociate
aws ec2 disassociate-association-id \
--association-id eipassoc-1234567890abcdef0
# Release Elastic IP
aws ec2 release-address --allocation-id eipalloc-1234567890abcdef0Instance Types
bash
# List instance types
aws ec2 describe-instance-types
# List specific type
aws ec2 describe-instance-types \
--instance-types t2.micro,m5.large
# List available instance types
aws ec2 describe-instance-type-offerings \
--location-type region \
--filters Name=location,Values=us-east-1Auto Scaling
bash
# Create launch template
aws ec2 create-launch-template \
--launch-template-name my-template \
--launch-template-data file://template.json
# Create auto scaling group
aws autoscaling create-auto-scaling-group \
--auto-scaling-group-name my-asg \
--launch-template LaunchTemplateId=lt-1234567890abcdef0 \
--min-size 1 \
--max-size 10 \
--desired-capacity 2 \
--vpc-zone-identifier subnet-12345,subnet-67890
# Set scaling policy
aws autoscaling put-scaling-policy \
--auto-scaling-group-name my-asg \
--policy-name scale-up \
--scaling-adjustment 1 \
--adjustment-type ChangeInCapacity
# List ASGs
aws autoscaling describe-auto-scaling-groups
# Update desired capacity
aws autoscaling set-desired-capacity \
--auto-scaling-group-name my-asg \
--desired-capacity 5EC2 User Data Scripts
bash
#!/bin/bash
# user-data.sh
# Update system
yum update -y
# Install software
yum install -y nginx docker
# Start services
systemctl start nginx
systemctl enable nginx
# Clone repository
git clone https://github.com/user/repo.git /var/www/app
# Run Docker
docker run -d -p 80:80 myapp
# Send signal to CloudFormation
cfn-signal -e $? \
--stack my-stack \
--resource WebServer \
--region us-east-1Instance Metadata
bash
# Get instance ID
curl http://169.254.169.254/latest/meta-data/instance-id
# Get local IP
curl http://169.254.169.254/latest/meta-data/local-ipv4
# Get public IP
curl http://169.254.169.254/latest/meta-data/public-ipv4
# Get availability zone
curl http://169.254.169.254/latest/meta-data/placement/availability-zone
# Get instance type
curl http://169.254.169.254/latest/meta-data/instance-type
# Get IAM role credentials
curl http://169.254.169.254/latest/meta-data/iam/security-credentials/
# Get all metadata
curl http://169.254.169.254/latest/meta-data/Spot Instances
bash
# Request spot instance
aws ec2 request-spot-instances \
--spot-price 0.05 \
--instance-count 1 \
--launch-specification file://spot-spec.json
# List spot requests
aws ec2 describe-spot-instance-requests
# Cancel spot request
aws ec2 cancel-spot-instance-requests \
--spot-instance-request-ids sir-1234567890abcdef0
# Get spot price history
aws ec2 describe-spot-price-history \
--instance-types m5.large \
--product-descriptions "Linux/UNIX" \
--availability-zones us-east-1aMonitoring
bash
# Enable detailed monitoring
aws ec2 monitor-instances \
--instance-ids i-1234567890abcdef0
# Disable detailed monitoring
aws ec2 unmonitor-instances \
--instance-ids i-1234567890abcdef0
# Get console output
aws ec2 get-console-output \
--instance-id i-1234567890abcdef0
# Get instance status
aws ec2 describe-instance-status \
--instance-ids i-1234567890abcdef0 \
--include-all-instancesSSH Access
bash
# Connect using key pair
ssh -i my-key-pair.pem ec2-user@34.207.249.238
# Connect with specific user (Ubuntu)
ssh -i my-key-pair.pem ubuntu@34.207.249.238
# Connect with specific user (Amazon Linux)
ssh -i my-key-pair.pem ec2-user@34.207.249.238
# Connect through bastion
ssh -J bastion-user@bastion-ip -i my-key.pem ec2-user@private-ip
# Add to SSH config
Host my-instance
HostName 34.207.249.238
User ec2-user
IdentityFile ~/.ssh/my-key.pemCommon Use Cases
Web Server Setup
bash
# Create security group for web
aws ec2 create-security-group \
--group-name web-sg \
--description "Web server security group"
SG_ID=$(aws ec2 describe-security-groups \
--group-names web-sg \
--query 'SecurityGroups[0].GroupId' \
--output text)
# Allow HTTP and HTTPS
aws ec2 authorize-security-group-ingress \
--group-id $SG_ID \
--protocol tcp \
--port 80 \
--cidr 0.0.0.0/0
aws ec2 authorize-security-group-ingress \
--group-id $SG_ID \
--protocol tcp \
--port 443 \
--cidr 0.0.0.0/0
# Create instance
aws ec2 run-instances \
--image-id ami-0c55b159cbfafe1f0 \
--instance-type t2.micro \
--key-name my-key \
--security-group-ids $SG_ID \
--user-data file://web-server.shAuto Scaling Web Fleet
bash
# Create launch template
aws ec2 create-launch-template \
--launch-template-name web-template \
--version-description "Web server template" \
--launch-template-data \
'{
"ImageId": "ami-0c55b159cbfafe1f0",
"InstanceType": "t2.micro",
"KeyName": "my-key",
"SecurityGroupIds": ["sg-903004f8"],
"UserData": "'$(base64 -w0 web-server.sh)'"
}'
# Create target group
aws elbv2 create-target-group \
--name web-targets \
--protocol HTTP \
--port 80 \
--vpc-id vpc-1234567890abcdef0
# Create ASG
aws autoscaling create-auto-scaling-group \
--auto-scaling-group-name web-asg \
--launch-template LaunchTemplateId=lt-1234567890abcdef0 \
--target-group-arns arn:aws:elasticloadbalancing:us-east-1:123456789012:targetgroup/web-targets/abc123 \
--min-size 2 \
--max-size 10 \
--desired-capacity 3