Marketplace

aws-ec2-deployment

Launch, configure, and manage EC2 instances with best practices

$ 설치

git clone https://github.com/pluginagentmarketplace/custom-plugin-aws /tmp/custom-plugin-aws && cp -r /tmp/custom-plugin-aws/skills/aws-ec2-deployment ~/.claude/skills/custom-plugin-aws

// tip: Run this command in your terminal to install the skill


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

AttributeValue
AWS ServiceEC2
ComplexityMedium
Est. Time5-15 min
PrerequisitesVPC, Security Group, Key Pair

Parameters

Required

ParameterTypeDescriptionValidation
instance_typestringEC2 instance typeValid type (m6i.large)
ami_idstringAMI IDami-[a-z0-9]{17}
subnet_idstringTarget subnetsubnet-[a-z0-9]{17}
security_group_idsarraySecurity groupsNon-empty array

Optional

ParameterTypeDefaultDescription
key_namestringnullSSH key pair name
iam_instance_profilestringnullIAM role ARN
user_datastringnullBase64 startup script
ebs_optimizedbooltrueEBS optimization
monitoringbooltrueDetailed 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

SymptomCauseSolution
InsufficientInstanceCapacityAZ fullTry different AZ
InvalidAMIIDAMI not in regionCopy AMI
UnauthorizedIAM missingCheck permissions
Pending foreverENI issueCheck 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

WorkloadFamilyKey Feature
Web/APIM6i, M7gBalanced
ComputeC6i, C7gHigh CPU
MemoryR6i, X2idnHigh memory
GPU/MLP4d, G5NVIDIA GPU

Cost Optimization

StrategySavings
Reserved Instances30-60%
Savings Plans30-72%
Spot InstancesUp to 90%
Right-sizing10-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