mcpField
E
ec2

ec2

github.com/itsmostafaクラウド・DevOps1.2k135 回インストール2 日前に更新
リポジトリ

ec2 について

クラウド運用担当者や開発者向けの AWS EC2 リファレンススキルです。CLI と boto3 の例を交え、インスタンス運用やセキュリティ、コスト、信頼性、障害対応を扱います。

主な機能

  1. 01インスタンスタイプと購入方法
  2. 02インスタンスの起動と管理
  3. 03セキュリティグループと EBS の設定
  4. 04セキュリティ・コスト・信頼性の実践
  5. 05接続やインスタンス障害の診断

活用シーン

  1. 01インスタンスタイプや購入方法の選定
  2. 02CLI または boto3 でのインスタンス起動
  3. 03インスタンスの保護とコスト最適化
  4. 04SSH 接続や起動失敗の調査

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/itsmostafa/aws-agent-skills --skill ec2

インストール後、Claude Code で/ec2を入力して読み込まれたか確認します。

同梱ファイルevals/evals.jsoninstance-management.md

詳細

AWS EC2

Amazon Elastic Compute Cloud(EC2)は、クラウドでサイズ変更可能なコンピューティング容量を提供します。

高度なパターン(Auto Scaling、Spot Fleet、Session Manager、Instance Connect、IMDS、プレイスメントグループ、スケジュールされたスケーリング)については、instance-management.mdを参照してください。

目次

基本概念

インスタンスタイプ
カテゴリ例ユースケース
汎用t3、m6i、t4g(Graviton)Web サーバー、開発環境
コンピューティング最適化c6i、c7g(Graviton)バッチ処理、ゲーム
メモリ最適化r6i、r7g(Graviton)データベース、キャッシュ
ストレージ最適化i3、d3データウェアハウジング
高速化p4d、g5ML、グラフィックス

Graviton(ARM)インスタンス(t4g、m7g、c7g、r7g)は、同等のパフォーマンスの x86 インスタンスより約 20%安価なため、新しいワークロードで検討する価値があります。

購入オプション
オプション説明
オンデマンド時間単位/秒単位で支払います
リザーブド1~3 年の契約で、最大 72%割引
スポット未使用の容量を利用し、最大 90%割引 — 2 分前の通知で中断される場合があります
Savings Plans柔軟な契約に基づく割引
AMI(Amazon Machine Image)

インスタンスの起動に使用する OS、ソフトウェア、設定を含むテンプレートです。ID をハードコードするのではなく、SSM Parameter Store を使って最新の公式 AMI を検索してください。

# Latest Amazon Linux 2 AMI
aws ssm get-parameter \
  --name /aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2 \
  --query 'Parameter.Value' --output text

# Latest Amazon Linux 2023
aws ssm get-parameter \
  --name /aws/service/ami-amazon-linux-latest/al2023-ami-kernel-default-x86_64 \
  --query 'Parameter.Value' --output text

# Latest Ubuntu 22.04
aws ssm get-parameter \
  --name /aws/service/canonical/ubuntu/server/22.04/stable/current/amd64/hvm/ebs-gp2/ami-id \
  --query 'Parameter.Value' --output text
セキュリティグループ

インバウンドおよびアウトバウンドのトラフィックを制御する仮想ファイアウォールです。変更はすぐに反映され、再起動は不要です。

一般的なパターン

インスタンスを起動する
# Create key pair
aws ec2 create-key-pair \
  --key-name my-key \
  --query 'KeyMaterial' \
  --output text > my-key.pem
chmod 400 my-key.pem

# Create security group
aws ec2 create-security-group \
  --group-name web-server-sg \
  --description "Web server security group" \
  --vpc-id vpc-12345678

# Allow SSH and HTTP
aws ec2 authorize-security-group-ingress \
  --group-id sg-12345678 \
  --protocol tcp \
  --port 22 \
  --cidr 10.0.0.0/8

aws ec2 authorize-security-group-ingress \
  --group-id sg-12345678 \
  --protocol tcp \
  --port 80 \
  --cidr 0.0.0.0/0

# Launch instance
aws ec2 run-instances \
  --image-id ami-0123456789abcdef0 \
  --instance-type t3.micro \
  --key-name my-key \
  --security-group-ids sg-12345678 \
  --subnet-id subnet-12345678 \
  --associate-public-ip-address \
  --tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=web-server}]'

# Wait until running, then get IP
aws ec2 wait instance-running --instance-ids i-1234567890abcdef0
aws ec2 describe-instances \
  --instance-ids i-1234567890abcdef0 \
  --query 'Reservations[].Instances[].PublicIpAddress' --output text

boto3:

import boto3

ec2 = boto3.resource('ec2')

instances = ec2.create_instances(
    ImageId='ami-0123456789abcdef0',
    InstanceType='t3.micro',
    KeyName='my-key',
    SecurityGroupIds=['sg-12345678'],
    SubnetId='subnet-12345678',
    MinCount=1,
    MaxCount=1,
    TagSpecifications=[{
        'ResourceType': 'instance',
        'Tags': [{'Key': 'Name', 'Value': 'web-server'}]
    }]
)

instance = instances[0]
instance.wait_until_running()
instance.reload()
print(f"Instance ID: {instance.id}")
print(f"Public IP: {instance.public_ip_address}")
ユーザーデータスクリプト

OS のパッケージマネージャーに関する注意:

  • Amazon Linux 2:amazon-linux-extras install nginx1 -yを使用します。yum install nginxは、nginx がデフォルトの AL2 リポジトリにないため失敗します
  • Amazon Linux 2023:dnf install -y nginxを使用します
  • Ubuntu:apt-get install -y nginxを使用します
  • Amazon Linux 2 / RHEL:httpd(Apache)は常にyum install -y httpdでインストールできます
# Amazon Linux 2 — nginx via amazon-linux-extras
aws ec2 run-instances \
  --image-id ami-0123456789abcdef0 \
  --instance-type t3.micro \
  --key-name my-key \
  --security-group-ids sg-12345678 \
  --subnet-id subnet-12345678 \
  --user-data '#!/bin/bash
amazon-linux-extras install nginx1 -y
systemctl start nginx
systemctl enable nginx
'

# Amazon Linux 2 — httpd (Apache, simpler alternative)
# --user-data '#!/bin/bash
# yum install -y httpd
# systemctl start httpd
# systemctl enable httpd
# echo "<h1>Hello from $(hostname -f)</h1>" > /var/www/html/index.html
# '
IAM ロールをアタッチする
# Create instance profile
aws iam create-instance-profile \
  --instance-profile-name web-server-profile

aws iam add-role-to-instance-profile \
  --instance-profile-name web-server-profile \
  --role-name web-server-role

# Launch with profile
aws ec2 run-instances \
  --image-id ami-0123456789abcdef0 \
  --instance-type t3.micro \
  --iam-instance-profile Name=web-server-profile \
  ...
インスタンスから AMI を作成する
aws ec2 create-image \
  --instance-id i-1234567890abcdef0 \
  --name "my-custom-ami-$(date +%Y%m%d)" \
  --description "Custom AMI with web server" \
  --no-reboot
Spot を利用した Auto Scaling グループ(最新の方法)

Spot インスタンスを大規模に利用する場合は、従来のrequest-spot-instances API ではなく、混合インスタンスポリシーを使用する Auto Scaling グループを利用する方法が推奨されます。これにより、インスタンスを分散して中断を最小限に抑えられます。

設定の全手順については、instance-management.mdを参照してください。簡単な例:

# 1. Create launch template with IMDSv2
aws ec2 create-launch-template \
  --launch-template-name my-lt \
  --launch-template-data '{
    "ImageId": "ami-0123456789abcdef0",
    "SecurityGroupIds": ["sg-12345678"],
    "IamInstanceProfile": {"Name": "my-profile"},
    "MetadataOptions": {"HttpTokens": "required", "HttpEndpoint": "enabled"}
  }'

# 2. Create ASG with mixed-instances (Spot + On-Demand diversification)
aws autoscaling create-auto-scaling-group \
  --auto-scaling-group-name my-asg \
  --min-size 0 --max-size 20 --desired-capacity 2 \
  --vpc-zone-identifier "subnet-111,subnet-222" \
  --mixed-instances-policy '{
    "LaunchTemplate": {
      "LaunchTemplateSpecification": {"LaunchTemplateName": "my-lt", "Version": "$Latest"},
      "Overrides": [
        {"InstanceType": "c5.xlarge"},
        {"InstanceType": "c5.2xlarge"},
        {"InstanceType": "c5a.xlarge"}
      ]
    },
    "InstancesDistribution": {
      "OnDemandBaseCapacity": 0,
      "OnDemandPercentageAboveBaseCapacity": 0,
      "SpotAllocationStrategy": "capacity-optimized"
    }
  }'
EBS ボリュームの管理
# Create volume
aws ec2 create-volume \
  --availability-zone us-east-1a \
  --size 100 \
  --volume-type gp3 \
  --iops 3000 \
  --throughput 125 \
  --encrypted

# Attach to instance
aws ec2 attach-volume \
  --volume-id vol-12345678 \
  --instance-id i-1234567890abcdef0 \
  --device /dev/sdf

# Create snapshot
aws ec2 create-snapshot \
  --volume-id vol-12345678 \
  --description "Daily backup"

CLI リファレンス

インスタンス管理
コマンド説明
aws ec2 run-instancesインスタンスを起動する
aws ec2 describe-instancesインスタンスを一覧表示する
aws ec2 start-instances停止中のインスタンスを起動する
aws ec2 stop-instances実行中のインスタンスを停止する
aws ec2 reboot-instancesインスタンスを再起動する
aws ec2 terminate-instancesインスタンスを終了する
aws ec2 modify-instance-attributeインスタンスの設定を変更する
セキュリティグループ
コマンド説明
aws ec2 create-security-groupセキュリティグループを作成する
aws ec2 describe-security-groupsセキュリティグループを一覧表示する
aws ec2 authorize-security-group-ingressインバウンドルールを追加する
aws ec2 revoke-security-group-ingressインバウンドルールを削除する
aws ec2 authorize-security-group-egressアウトバウンドルールを追加する
AMI
コマンド説明
aws ec2 describe-imagesAMI を一覧表示する
aws ec2 create-imageインスタンスから AMI を作成する
aws ec2 copy-imageAMI を別のリージョンにコピーする
aws ec2 deregister-imageAMI を削除する
EBS ボリューム
コマンド説明
aws ec2 create-volumeEBS ボリュームを作成
aws ec2 attach-volumeインスタンスにアタッチ
aws ec2 detach-volumeインスタンスからデタッチ
aws ec2 create-snapshotスナップショットを作成
aws ec2 modify-volumeボリュームのサイズ変更/変更

ベストプラクティス

セキュリティ
  • インスタンスではアクセスキーの代わりに IAM ロールを使用
  • セキュリティグループを制限 — 最小権限の原則に従う
  • バックエンドインスタンスにはプライベートサブネットを使用
  • SSRF 攻撃を防ぐため IMDSv2 を有効化
  • EBS ボリュームを保存時に暗号化
# Require IMDSv2 on existing instance
aws ec2 modify-instance-metadata-options \
  --instance-id i-1234567890abcdef0 \
  --http-tokens required \
  --http-endpoint enabled
パフォーマンス
  • インスタンスのサイズを適切に設定 — 監視して調整する
  • EBS 最適化インスタンスを使用
  • 適切な EBS ボリュームタイプを選択(gp3 がデフォルトとして適しています。高い IOPS が必要な場合は io2 を使用)
  • 低レイテンシのネットワークにはプレイスメントグループを使用(instance-management.md を参照)
コストの最適化
  • 耐障害性が求められるワークロード(バッチ、ML トレーニング、CI)には Spot インスタンスを使用
  • 使用していないインスタンスを停止/終了
  • 安定したワークロードにはリザーブドインスタンスまたは Savings Plans を使用
  • 使用していない EBS ボリュームとスナップショットを削除
  • Graviton(t4g、m7g、c7g)を検討 — 同じパフォーマンスで約 20% 安価です
信頼性
  • 高可用性のために Auto Scaling グループを使用(instance-management.md を参照)
  • 複数の AZ にデプロイ
  • トラフィックの分散には Elastic Load Balancer を使用
  • ヘルスチェックを実装

トラブルシューティング

インスタンスに SSH 接続できない

まず、エラーの種類を特定してください。種類によって根本原因が異なります。

エラー意味主な原因
Connection refusedネットワークには到達できますが、SSH デーモンがリッスンしていませんsshd のクラッシュ、sshd が未インストール、OS のファイアウォール(ufw/iptables)によるブロック、ポートの誤り
Connection timed outパケットが到達していませんセキュリティグループによるポート 22 のブロック、NACL によるトラフィックのブロック、パブリック IP がない、IP アドレスの誤り
Permission denied接続できましたが、認証に失敗しましたキーファイルの誤り、ユーザー名の誤り、キーが承認されていない

OS ごとの一般的なユーザー名:

OSデフォルトの SSH ユーザー
Amazon Linux 2 / 2023ec2-user
Ubuntuubuntu
Debianadmin
CentOS / RHELec2-user または centos
WindowsAdministrator

診断コマンド:

# 1. Check instance state and public IP
aws ec2 describe-instances \
  --instance-ids i-1234567890abcdef0 \
  --query "Reservations[].Instances[].{State:State.Name,PublicIP:PublicIpAddress,StatusChecks:State.Name}"

# 2. Check instance status (system + instance checks)
aws ec2 describe-instance-status --instance-ids i-1234567890abcdef0

# 3. Check security group rules for port 22
aws ec2 describe-security-groups \
  --group-ids sg-12345678 \
  --query "SecurityGroups[].IpPermissions[?ToPort==\`22\`]"

# 4. Get console output to see boot logs, sshd errors, OOM events
aws ec2 get-console-output \
  --instance-id i-1234567890abcdef0 \
  --latest \
  --query Output --output text

接続が拒否された場合 — Session Manager で接続し、sshd を修復します:

# Requires SSM agent on instance + AmazonSSMManagedInstanceCore policy
aws ssm start-session --target i-1234567890abcdef0

# Once inside, diagnose:
systemctl status ssh        # Ubuntu
systemctl status sshd       # Amazon Linux
df -h                       # Check disk full
sudo sshd -t                # Test sshd config for syntax errors
sudo journalctl -u ssh -n 50  # Recent sshd logs

SSH の代わりに Session Manager を使用(ポートを開放する必要がなく、キーペアも不要です):

aws ssm start-session --target i-1234567890abcdef0

# Port forwarding via SSM
aws ssm start-session \
  --target i-1234567890abcdef0 \
  --document-name AWS-StartPortForwardingSession \
  --parameters '{"portNumber":["22"],"localPortNumber":["2222"]}'
インスタンスが起動しない

原因:

  • インスタンスの上限に達している
  • AZ のキャパシティが不足している
  • EBS ボリュームに問題がある
  • AMI が無効である
# Check instance state reason
aws ec2 describe-instances \
  --instance-ids i-1234567890abcdef0 \
  --query "Reservations[].Instances[].StateReason"
インスタンスに到達できない
# Check instance status
aws ec2 describe-instance-status \
  --instance-ids i-1234567890abcdef0

# Get console output
aws ec2 get-console-output \
  --instance-id i-1234567890abcdef0 \
  --latest

# Get screenshot (for Windows/GUI issues)
aws ec2 get-console-screenshot \
  --instance-id i-1234567890abcdef0
CPU/メモリ使用率が高い
# Enable detailed monitoring
aws ec2 monitor-instances \
  --instance-ids i-1234567890abcdef0

# Check CloudWatch metrics (cross-platform date command)
START=$(date -u -v-1H +%Y-%m-%dT%H:%M:%SZ 2>/dev/null || date -u --date='1 hour ago' +%Y-%m-%dT%H:%M:%SZ)
aws cloudwatch get-metric-statistics \
  --namespace AWS/EC2 \
  --metric-name CPUUtilization \
  --dimensions Name=InstanceId,Value=i-1234567890abcdef0 \
  --start-time "$START" \
  --end-time "$(date -u +%Y-%m-%dT%H:%M:%SZ)" \
  --period 300 \
  --statistics Average

参考資料

コメント