| name | aws-ec2-deployment |
| description | Launch, configure, and manage EC2 instances with best practices |
| sasmp_version | 1.3.0 |
| bonded_agent | 02-aws-compute |
| bond_type | PRIMARY_BOND |
AWS EC2 Deployment Skill
Deploy and manage EC2 instances with production-ready configurations.
Quick Reference
| Attribute |
Value |
| AWS Service |
EC2 |
| Complexity |
Medium |
| Est. Time |
5-15 min |
| Prerequisites |
VPC, Security Group, Key Pair |
Parameters
Required
| Parameter |
Type |
Description |
Validation |
| instance_type |
string |
EC2 instance type |
Valid type (m6i.large) |
| ami_id |
string |
AMI ID |
ami-[a-z0-9]{17} |
| subnet_id |
string |
Target subnet |
subnet-[a-z0-9]{17} |
| security_group_ids |
array |
Security groups |
Non-empty array |
Optional
| Parameter |
Type |
Default |
Description |
| key_name |
string |
null |
SSH key pair name |
| iam_instance_profile |
string |
null |
IAM role ARN |
| user_data |
string |
null |
Base64 startup script |
| ebs_optimized |
bool |
true |
EBS optimization |
| monitoring |
bool |
true |
Detailed monitoring |
Implementation
Launch Instance
aws ec2 run-instances \
--image-id ami-0abcdef1234567890 \
--instance-type m6i.large \
--subnet-id subnet-12345678 \
--security-group-ids sg-12345678 \
--key-name my-key \
--iam-instance-profile Name=MyRole \
--ebs-optimized \
--monitoring Enabled=true \
--metadata-options HttpTokens=required \
--tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=MyServer}]'
User Data Script
#!/bin/bash
set -e
yum update -y
yum install -y docker
systemctl enable docker
systemctl start docker
Retry Logic
def launch_with_retry(params, max_retries=3):
for attempt in range(max_retries):
try:
return ec2.run_instances(**params)
except ec2.exceptions.InsufficientInstanceCapacity:
params['SubnetId'] = get_alternate_subnet()
time.sleep(2 ** attempt)
raise Exception("Failed to launch instance")
Troubleshooting
Common Issues
| Symptom |
Cause |
Solution |
| InsufficientInstanceCapacity |
AZ full |
Try different AZ |
| InvalidAMIID |
AMI not in region |
Copy AMI |
| Unauthorized |
IAM missing |
Check permissions |
| Pending forever |
ENI issue |
Check subnet IPs |
Debug Checklist
Instance Selection Guide
| Workload |
Family |
Key Feature |
| Web/API |
M6i, M7g |
Balanced |
| Compute |
C6i, C7g |
High CPU |
| Memory |
R6i, X2idn |
High memory |
| GPU/ML |
P4d, G5 |
NVIDIA GPU |
Cost Optimization
| Strategy |
Savings |
| Reserved Instances |
30-60% |
| Savings Plans |
30-72% |
| Spot Instances |
Up to 90% |
| Right-sizing |
10-50% |
Test Template
def test_ec2_launch():
# Arrange
params = {
"ImageId": get_latest_amazon_linux_ami(),
"InstanceType": "t3.micro",
"MaxCount": 1, "MinCount": 1
}
# Act
response = ec2.run_instances(**params)
instance_id = response['Instances'][0]['InstanceId']
# Assert
waiter = ec2.get_waiter('instance_running')
waiter.wait(InstanceIds=[instance_id])
# Cleanup
ec2.terminate_instances(InstanceIds=[instance_id])
Assets
assets/ec2-userdata.sh - Sample user data script
References