Claude-skill-registry aws-ec2-deployment
Launch, configure, and manage EC2 instances with best practices
install
source · Clone the upstream repo
git clone https://github.com/majiayu000/claude-skill-registry
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/majiayu000/claude-skill-registry "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/data/aws-ec2-deployment" ~/.claude/skills/majiayu000-claude-skill-registry-aws-ec2-deployment && rm -rf "$T"
manifest:
skills/data/aws-ec2-deployment/SKILL.mdsource content
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
- AMI exists in target region?
- Subnet has available IPs?
- Security group allows traffic?
- Key pair exists?
- IMDSv2 configured?
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
- Sample user data scriptassets/ec2-userdata.sh