2026年7月9日
2026年7月9日
AWS EC2のセキュリティグループでポートを開放する方法(コンソール・CLI・つながらない時の確認)
EC2 インスタンスに Web ブラウザや SSH から接続するには、インスタンスに付いているセキュリティグループで、そのポートへの受信(インバウンド)を許可する必要があります。この記事では、WordPress などの Web サイトを想定して、HTTP(80)・HTTPS(443)・SSH(22)を開ける手順を、マネジメントコンソールと AWS CLI の両方で説明します。画面の表記やコマンドは 2026年10月時点のものです。
セキュリティグループの基本
- セキュリティグループは、インスタンス(正確にはネットワークインターフェース)単位で通信を許可する仮想ファイアウォールです。
- ルールは「許可」だけを書きます。受信ルールに書かれていない通信はすべて拒否されます。
- ステートフルなので、受信を許可した通信への応答は、送信ルールに関係なく返せます。
- 新しく作ったセキュリティグループは、受信ルールが空(すべて拒否)、送信ルールはすべて許可の状態です。
- ルールの変更は、そのセキュリティグループが付いているインスタンスにすぐ反映されます(わずかな遅れが出ることはあります)。インスタンスの再起動は不要です。
Web サイトでよく使うルールは次のとおりです。
| 用途 | プロトコル・ポート | 送信元の考え方 |
|---|---|---|
| HTTP | TCP 80 | 公開サイトなら 0.0.0.0/0(IPv6 も使うなら ::/0) |
| HTTPS | TCP 443 | 同上 |
| SSH | TCP 22 | 自分の IP アドレスだけ(例: 203.0.113.10/32) |
| データベース(MySQL など) | TCP 3306 | 開けない。必要なら同じ VPC 内の特定のセキュリティグループだけ |
マネジメントコンソールで開ける
- EC2 コンソールを開き、左のメニューで「ネットワーク & セキュリティ」の「セキュリティグループ」を選びます。
- 対象のセキュリティグループを選び、下に表示される「インバウンドルール」タブで「インバウンドのルールを編集」をクリックします。
- 「ルールを追加」をクリックし、「タイプ」で HTTP を選びます(プロトコルとポートは自動で入ります)。「ソース」で「Anywhere-IPv4」を選ぶと 0.0.0.0/0 が入ります。
- 同じように HTTPS のルールを追加します。
- SSH は「タイプ」で SSH を選び、「ソース」で「マイ IP」を選ぶと、いま使っているパソコンのグローバル IP アドレスが入ります。
- 必要なら「説明」欄に用途を書き、「ルールを保存」をクリックします。
どのセキュリティグループがインスタンスに付いているかは、インスタンスの詳細画面の「セキュリティ」タブで確認できます。
AWS CLI で開ける
AWS CLI(バージョン2)が設定済みで、EC2 を操作する権限があることを前提にします。以下の sg-… や i-… の ID は例なので、自分の環境の値に置き換えてください。
ステップ1:インスタンスに付いているセキュリティグループを調べる
aws ec2 describe-instances \
--instance-ids i-0123456789abcdef0 \
--query 'Reservations[].Instances[].SecurityGroups' \
--output table
ステップ2:(必要なら)セキュリティグループを作る
既定の VPC 以外で作る場合は --vpc-id を指定します。出力される GroupId(sg-…)を控えておきます。
aws ec2 create-security-group \
--group-name wordpress-web \
--description "Web server for WordPress" \
--vpc-id vpc-0123456789abcdef0
ステップ3:HTTP と HTTPS を開ける
aws ec2 authorize-security-group-ingress \
--group-id sg-0123456789abcdef0 \
--protocol tcp --port 80 --cidr 0.0.0.0/0
aws ec2 authorize-security-group-ingress \
--group-id sg-0123456789abcdef0 \
--protocol tcp --port 443 --cidr 0.0.0.0/0
--cidr は IPv4 だけです。IPv6 でも公開する場合は --ip-permissions で指定します。
aws ec2 authorize-security-group-ingress \
--group-id sg-0123456789abcdef0 \
--ip-permissions 'IpProtocol=tcp,FromPort=443,ToPort=443,Ipv6Ranges=[{CidrIpv6=::/0}]'
ステップ4:SSH は自分の IP アドレスだけに開ける
1つの IP アドレスだけを許可するときは、末尾に /32 を付けます。--ip-permissions を使うと、ルールに説明を付けられます。説明に使えるのは英数字と一部の記号だけで、日本語は使えません。
aws ec2 authorize-security-group-ingress \
--group-id sg-0123456789abcdef0 \
--ip-permissions 'IpProtocol=tcp,FromPort=22,ToPort=22,IpRanges=[{CidrIp=203.0.113.10/32,Description="SSH from office"}]'
SSH のポートを常に開けておきたくない場合は、ポート 22 を開けずに接続できる AWS Systems Manager の Session Manager や EC2 Instance Connect Endpoint を使う方法もあります。
ステップ5:ロードバランサーの後ろにある場合
Application Load Balancer(ALB)経由で公開する場合は、インスタンス側のセキュリティグループで、送信元を ALB のセキュリティグループに限定します。インターネットから直接インスタンスに届く経路を塞げます。
aws ec2 authorize-security-group-ingress \
--group-id sg-0123456789abcdef0 \
--protocol tcp --port 80 \
--source-group sg-0fedcba9876543210
ステップ6:ルールを確認・削除する
# ルールの一覧(ルール ID の sgr-… も表示される)
aws ec2 describe-security-group-rules \
--filters Name=group-id,Values=sg-0123456789abcdef0 \
--query 'SecurityGroupRules[].[SecurityGroupRuleId,IsEgress,IpProtocol,FromPort,ToPort,CidrIpv4,CidrIpv6,Description]' \
--output table
# 不要になったルールを ID で削除
aws ec2 revoke-security-group-ingress \
--group-id sg-0123456789abcdef0 \
--security-group-rule-ids sgr-0123456789abcdef0
ステップ7:インスタンスにセキュリティグループを付ける
新しく作ったセキュリティグループをインスタンスに付けるには、modify-instance-attribute を使います。--groups に書いた一覧で置き換わるため、今付いているものも残す場合は一緒に書きます。
aws ec2 modify-instance-attribute \
--instance-id i-0123456789abcdef0 \
--groups sg-0123456789abcdef0 sg-0aaaabbbbccccdddd
開けたのにつながらないときの確認順
セキュリティグループを開けても接続できない場合は、外側から順に確認します。
- パブリック IP アドレス:インスタンスにパブリック IPv4 アドレスまたは Elastic IP があるか。停止・起動するとパブリック IP は変わります(Elastic IP は変わりません)。
- 付いているセキュリティグループ:ルールを追加したセキュリティグループが、実際にそのインスタンスに付いているか(ステップ1)。
- ルートテーブル:サブネットのルートテーブルに、0.0.0.0/0 からインターネットゲートウェイへの経路があるか。
- ネットワーク ACL:サブネットのネットワーク ACL で拒否していないか。ネットワーク ACL はステートレスなので、戻りの通信(一時ポート)も許可が必要です。既定の ACL はすべて許可です。
- OS のファイアウォール:インスタンス内の firewalld や ufw でポートを閉じていないか。
- サービスが待ち受けているか:Web サーバーが起動して、そのポートで待ち受けているか。
1 のパブリック IP アドレスは次のコマンドで確認できます。
aws ec2 describe-instances \
--instance-ids i-0123456789abcdef0 \
--query 'Reservations[].Instances[].PublicIpAddress' \
--output text
6 はインスタンスの中で次のように確認します。
sudo ss -tlnp | grep -E ':(80|443)\s'
curl -I http://localhost/
経路の問題を切り分けたい場合は、VPC の Reachability Analyzer で、送信元から宛先までのどこで止まっているかを調べる方法もあります。
運用上の注意
- 0.0.0.0/0 で開けるのは、公開する Web のポート(80・443)だけにします。SSH やデータベース、管理画面用のポートは送信元を絞ります。
- 自宅や事務所のグローバル IP アドレスは変わることがあります。SSH につながらなくなったら、まず「マイ IP」のルールが今の IP アドレスと合っているか確認します。
- 使わなくなったルールは削除し、ルールの説明欄に用途を書いておくと、後から見直すときに判断しやすくなります。
まとめ
- セキュリティグループは許可ルールだけを書くステートフルなファイアウォールで、変更はすぐ反映される
- コンソールでは「インバウンドのルールを編集」から、CLI では
authorize-security-group-ingressで追加する - HTTP・HTTPS は 0.0.0.0/0、SSH は自分の IP アドレス(/32)だけに開ける
- ルールの確認は
describe-security-group-rules --filters Name=group-id,…、削除はrevoke-security-group-ingress - つながらないときは、パブリック IP、付いているセキュリティグループ、ルートテーブル、ネットワーク ACL、OS のファイアウォール、待ち受け状態の順に確認する