AWS EC2 + VPC コマンド — 50+ コマンドを 8 カテゴリで
EC2 と VPC は AWS の基礎ネットワーク。サーバレス案件ですら VPC + Subnet + SG の理解は要求されます。 Console を使わず CLI で完結できると障害対応が早くなります。
目次
- EC2 インスタンス操作
- AMI / Snapshot / Volume
- Security Group
- VPC / Subnet / Route Table
- IGW / NAT / VPC Endpoint
- Elastic IP / Network Interface
- SSM / Session Manager
- EBS / Tag
- 運用レシピ
- 用語集
1. EC2 インスタンス操作
# 一覧
aws ec2 describe-instances
aws ec2 describe-instances --instance-ids i-xxx
aws ec2 describe-instances --filters 'Name=instance-state-name,Values=running'
aws ec2 describe-instances --filters 'Name=tag:Env,Values=prod' \
--query 'Reservations[].Instances[].[InstanceId,InstanceType,PrivateIpAddress,State.Name]' \
--output table
# 起動 / 停止 / 再起動 / 終了
aws ec2 start-instances --instance-ids i-xxx
aws ec2 stop-instances --instance-ids i-xxx
aws ec2 stop-instances --instance-ids i-xxx --hibernate # ヒバネート(要設定)
aws ec2 reboot-instances --instance-ids i-xxx
aws ec2 terminate-instances --instance-ids i-xxx # 終了 (削除)
# 状態待機
aws ec2 wait instance-running --instance-ids i-xxx
aws ec2 wait instance-stopped --instance-ids i-xxx
# 起動 (run-instances)
aws ec2 run-instances \
--image-id ami-xxx \
--instance-type t3.micro \
--key-name my-key \
--subnet-id subnet-xxx \
--security-group-ids sg-xxx \
--tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=web-01},{Key=Env,Value=prod}]' \
--user-data file://user-data.sh \
--iam-instance-profile Name=my-instance-profile
# インスタンスタイプ変更(停止中のみ)
aws ec2 modify-instance-attribute --instance-id i-xxx --instance-type 't3.medium'
# コンソール出力(起動失敗の調査)
aws ec2 get-console-output --instance-id i-xxx --output text
2. AMI / Snapshot / Volume
# AMI 一覧(自分所有)
aws ec2 describe-images --owners self \
--query 'Images[].[ImageId,Name,CreationDate]' --output table
# 公式 Amazon Linux 2023 を検索
aws ec2 describe-images --owners amazon \
--filters 'Name=name,Values=al2023-ami-*-x86_64' 'Name=state,Values=available' \
--query 'sort_by(Images, &CreationDate)[-1].[ImageId,Name]' --output text
# AMI 作成(実行中インスタンスから)
aws ec2 create-image --instance-id i-xxx --name 'my-ami-2026-04-26' \
--no-reboot
# AMI 削除(紐づくスナップショットも忘れず)
aws ec2 deregister-image --image-id ami-xxx
aws ec2 delete-snapshot --snapshot-id snap-xxx
# EBS Volume
aws ec2 describe-volumes
aws ec2 describe-volumes --filters 'Name=status,Values=available' # 未アタッチ(コスト発生)
aws ec2 create-volume --availability-zone ap-northeast-1a --size 30 --volume-type gp3
aws ec2 attach-volume --volume-id vol-xxx --instance-id i-xxx --device /dev/sdf
aws ec2 detach-volume --volume-id vol-xxx
aws ec2 delete-volume --volume-id vol-xxx
# Snapshot
aws ec2 create-snapshot --volume-id vol-xxx --description 'backup'
aws ec2 describe-snapshots --owner-ids self
aws ec2 delete-snapshot --snapshot-id snap-xxx
3. Security Group
# 一覧
aws ec2 describe-security-groups
aws ec2 describe-security-groups --filters 'Name=vpc-id,Values=vpc-xxx'
aws ec2 describe-security-groups --group-ids sg-xxx \
--query 'SecurityGroups[].IpPermissions' --output json
# 作成
aws ec2 create-security-group --vpc-id vpc-xxx \
--group-name web-sg --description 'web servers'
# Inbound 追加
aws ec2 authorize-security-group-ingress --group-id sg-xxx \
--protocol tcp --port 443 --cidr 0.0.0.0/0
aws ec2 authorize-security-group-ingress --group-id sg-xxx \
--protocol tcp --port 22 --cidr 10.0.0.0/8 # SSH を社内から
aws ec2 authorize-security-group-ingress --group-id sg-xxx \
--protocol tcp --port 5432 --source-group sg-app # 別 SG からの参照(推奨パターン)
# Inbound 削除
aws ec2 revoke-security-group-ingress --group-id sg-xxx \
--protocol tcp --port 22 --cidr 0.0.0.0/0
# Outbound
aws ec2 authorize-security-group-egress --group-id sg-xxx \
--protocol tcp --port 443 --cidr 0.0.0.0/0
# 削除
aws ec2 delete-security-group --group-id sg-xxx
SG への
0.0.0.0/0 付き 22/3389 開放は事故の元。SSM Session Manager か bastion + ProxyJump で代替を。
4. VPC / Subnet / Route Table
# VPC
aws ec2 describe-vpcs
aws ec2 create-vpc --cidr-block 10.0.0.0/16 --tag-specifications 'ResourceType=vpc,Tags=[{Key=Name,Value=main}]'
aws ec2 modify-vpc-attribute --vpc-id vpc-xxx --enable-dns-hostnames
aws ec2 delete-vpc --vpc-id vpc-xxx
# Subnet
aws ec2 describe-subnets --filters 'Name=vpc-id,Values=vpc-xxx'
aws ec2 create-subnet --vpc-id vpc-xxx --cidr-block 10.0.10.0/24 \
--availability-zone ap-northeast-1a
aws ec2 modify-subnet-attribute --subnet-id subnet-xxx --map-public-ip-on-launch # public sub
aws ec2 delete-subnet --subnet-id subnet-xxx
# Route Table
aws ec2 describe-route-tables --filters 'Name=vpc-id,Values=vpc-xxx'
aws ec2 create-route-table --vpc-id vpc-xxx
aws ec2 create-route --route-table-id rtb-xxx --destination-cidr-block 0.0.0.0/0 --gateway-id igw-xxx
aws ec2 create-route --route-table-id rtb-xxx --destination-cidr-block 0.0.0.0/0 --nat-gateway-id nat-xxx
aws ec2 associate-route-table --route-table-id rtb-xxx --subnet-id subnet-xxx
aws ec2 delete-route --route-table-id rtb-xxx --destination-cidr-block 0.0.0.0/0
5. IGW / NAT / VPC Endpoint
# Internet Gateway
aws ec2 create-internet-gateway
aws ec2 attach-internet-gateway --internet-gateway-id igw-xxx --vpc-id vpc-xxx
aws ec2 detach-internet-gateway --internet-gateway-id igw-xxx --vpc-id vpc-xxx
aws ec2 delete-internet-gateway --internet-gateway-id igw-xxx
# NAT Gateway(プライベート Subnet からの outbound)
aws ec2 allocate-address --domain vpc # EIP 確保
aws ec2 create-nat-gateway --subnet-id subnet-public-xxx --allocation-id eipalloc-xxx
aws ec2 describe-nat-gateways
aws ec2 delete-nat-gateway --nat-gateway-id nat-xxx
# VPC Endpoint(S3 / DynamoDB は Gateway、その他は Interface)
aws ec2 create-vpc-endpoint --vpc-id vpc-xxx --vpc-endpoint-type Gateway \
--service-name com.amazonaws.ap-northeast-1.s3 \
--route-table-ids rtb-xxx
aws ec2 create-vpc-endpoint --vpc-id vpc-xxx --vpc-endpoint-type Interface \
--service-name com.amazonaws.ap-northeast-1.ssm \
--subnet-ids subnet-xxx --security-group-ids sg-xxx
aws ec2 describe-vpc-endpoints
aws ec2 delete-vpc-endpoints --vpc-endpoint-ids vpce-xxx
6. Elastic IP / Network Interface
aws ec2 allocate-address --domain vpc # EIP 確保
aws ec2 associate-address --instance-id i-xxx --allocation-id eipalloc-xxx
aws ec2 disassociate-address --association-id eipassoc-xxx
aws ec2 release-address --allocation-id eipalloc-xxx # 解放(未使用は時間課金)
aws ec2 describe-addresses
aws ec2 describe-network-interfaces --filters 'Name=status,Values=available'
7. SSM / Session Manager(鍵不要 SSH 代替)
# SSM Agent が動いていれば鍵不要で shell に入れる(推奨)
aws ssm start-session --target i-xxx
aws ssm start-session --target i-xxx --document-name AWS-StartPortForwardingSession \
--parameters '{"portNumber":["80"],"localPortNumber":["8080"]}'
# 一時的に SSH キーを注入(EC2 Instance Connect)
aws ec2-instance-connect send-ssh-public-key \
--instance-id i-xxx --availability-zone ap-northeast-1a \
--instance-os-user ec2-user --ssh-public-key file://~/.ssh/id_ed25519.pub
# Run Command(複数インスタンスにスクリプト実行)
aws ssm send-command \
--document-name 'AWS-RunShellScript' \
--targets 'Key=tag:Env,Values=prod' \
--parameters 'commands=["uptime","df -h"]'
8. EBS / Tag
# 全リソースに Tag
aws ec2 create-tags --resources i-xxx vol-xxx --tags Key=Env,Value=prod Key=Owner,Value=iigtn
# Tag 削除
aws ec2 delete-tags --resources i-xxx --tags Key=Env
# Tag によるリソース検索
aws resourcegroupstaggingapi get-resources \
--tag-filters 'Key=Env,Values=prod' \
--resource-type-filters 'ec2:instance'
運用レシピ
レシピ 1 — 全リージョン横断で running インスタンス確認
for r in $(aws ec2 describe-regions --query 'Regions[].RegionName' --output text); do
count=$(aws ec2 describe-instances --region $r \
--filters 'Name=instance-state-name,Values=running' \
--query 'length(Reservations[].Instances[])' --output text)
echo "$r running=$count"
done
レシピ 2 — 未アタッチ EBS(コスト食い)一覧
aws ec2 describe-volumes --filters 'Name=status,Values=available' \
--query 'Volumes[].[VolumeId,Size,CreateTime]' --output table
レシピ 3 — EIP の課金確認(未使用は $4/月)
aws ec2 describe-addresses \
--query 'Addresses[?AssociationId==null].[PublicIp,AllocationId]' --output table
レシピ 4 — SG 設定がガバガバ(0.0.0.0/0 への 22 開放)を検出
aws ec2 describe-security-groups \
--query 'SecurityGroups[?IpPermissions[?ToPort==`22` && IpRanges[?CidrIp==`0.0.0.0/0`]]].[GroupId,GroupName]' \
--output table
レシピ 5 — Tag 一括追加
for id in $(aws ec2 describe-instances --filters 'Name=tag:Env,Values=prod' \
--query 'Reservations[].Instances[].InstanceId' --output text); do
aws ec2 create-tags --resources $id --tags Key=Project,Value=iigtn-platform
done
コマンド早見表
aws ec2 describe-instances --filters 'Name=tag:Env,Values=prod'
aws ec2 start/stop/reboot/terminate-instances --instance-ids i-xxx
aws ec2 wait instance-running --instance-ids i-xxx
aws ec2 describe-volumes --filters 'Name=status,Values=available'
aws ec2 describe-addresses
aws ec2 authorize-security-group-ingress --group-id sg-xxx --protocol tcp --port 443 --cidr 0.0.0.0/0
aws ec2 describe-route-tables --filters 'Name=vpc-id,Values=vpc-xxx'
aws ssm start-session --target i-xxx
aws ec2-instance-connect send-ssh-public-key ...
用語集
- EC2 (Elastic Compute Cloud)
- AWS の仮想マシンサービス。t3/m6i/c6g などの Instance Type で CPU・メモリ・ネットワーク性能を選ぶ。
- AMI (Amazon Machine Image)
- EC2 起動のテンプレート。OS + 初期設定 + 必要ソフトを含むスナップショット。
- EBS (Elastic Block Store)
- EC2 にアタッチするブロックストレージ。gp3 / io2 / st1 / sc1。インスタンス停止しても残るが、未アタッチでも課金。
- Snapshot
- EBS の時点コピー。S3 にバックアップされる。
- VPC (Virtual Private Cloud)
- AWS の仮想プライベートネットワーク。CIDR ブロック (10.0.0.0/16 等) を持つ。
- Subnet
- VPC を AZ 単位で分割した小ネットワーク。Public / Private で分けるのが定番。
- Route Table
- 「この CIDR への通信はどのゲートウェイへ送るか」のルール集。Subnet ごとに紐付ける。
- IGW (Internet Gateway)
- VPC をインターネットに接続する出入口。Public Subnet の Route Table に
0.0.0.0/0 → igwを書く。 - NAT Gateway
- Private Subnet からインターネット方向に出るためのマネージド NAT。EIP と組み合わせて使う。時間課金 + データ転送課金。
- VPC Endpoint
- AWS サービスへの接続を VPC 内から直接行う仕組み。Gateway 型 (S3/DynamoDB) と Interface 型 (その他) がある。NAT 不要化 / セキュリティ向上。
- Security Group (SG)
- EC2 に紐付けるステートフルなネットワーク ACL。Inbound/Outbound ルールを書く。SG 同士の参照(source-group)が推奨パターン。
- NACL (Network ACL)
- Subnet レベルのステートレス ACL。SG より粒度が粗い、補助的に使う。
- EIP (Elastic IP)
- 静的なパブリック IPv4 アドレス。確保したら未使用でも時間課金。終了後の release 忘れに注意。
- Instance Profile / IAM Role
- EC2 に IAM Role を渡す仕組み。EC2 内で
awsコマンドが鍵なしで動く。 - SSM Session Manager
- SSM Agent + IAM 経由で EC2 のシェルに入る機能。SSH 鍵・SG の 22 開放が不要。
- EC2 Instance Connect
- SSH 公開鍵を 60 秒だけインスタンスに注入する機能。鍵紛失時の救済に有効。