ec2 について
クラウド運用担当者や開発者向けの AWS EC2 リファレンススキルです。CLI と boto3 の例を交え、インスタンス運用やセキュリティ、コスト、信頼性、障害対応を扱います。
主な機能
- 01インスタンスタイプと購入方法
- 02インスタンスの起動と管理
- 03セキュリティグループと EBS の設定
- 04セキュリティ・コスト・信頼性の実践
- 05接続やインスタンス障害の診断
活用シーン
- 01インスタンスタイプや購入方法の選定
- 02CLI または boto3 でのインスタンス起動
- 03インスタンスの保護とコスト最適化
- 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、g5 | ML、グラフィックス |
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-images | AMI を一覧表示する |
aws ec2 create-image | インスタンスから AMI を作成する |
aws ec2 copy-image | AMI を別のリージョンにコピーする |
aws ec2 deregister-image | AMI を削除する |
EBS ボリューム
| コマンド | 説明 |
|---|---|
aws ec2 create-volume | EBS ボリュームを作成 |
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 / 2023 | ec2-user |
| Ubuntu | ubuntu |
| Debian | admin |
| CentOS / RHEL | ec2-user または centos |
| Windows | Administrator |
診断コマンド:
# 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