- AWS
AWS CLIでセキュリティグループ設定|ルール追加・削除・確認
AWS CLI でセキュリティグループを設定するときは、create-security-group で作成し、authorize-security-group-ingress でインバウンドルールを追加、describe-security-group-rules で確認、revoke-security-group-ingress で削除します。 ルールの中身だけを書き換えたいときは modify-security-group-rules が使えます。
この記事では、作成からグループ削除までの一連の流れを、実際に実行した出力つきで順番にたどります。短い書き方(--protocol --port --cidr)と --ip-permissions の JSON 書式の対応、用途別のコピペ用コマンド表、0.0.0.0/0 で開いているルールを探す --query、エラー文と直し方まで1ページにまとめました。
確認環境:Ubuntu 24.04、AWS CLI 1.46.1。AWS の API をローカルで再現するツール(moto 5.2.3)で実行しています。掲載するコマンドは、実際の AWS でそのまま使える形で書いています。
セキュリティグループ操作の早見表
| やりたいこと | コマンド | 要点 |
|---|---|---|
| グループを作る | aws ec2 create-security-group --group-name 名前 --description 説明 --vpc-id VPC |
返ってくる GroupId を以後の操作で使う |
| インバウンドを追加 | aws ec2 authorize-security-group-ingress --group-id SG --protocol tcp --port 443 --cidr 0.0.0.0/0 |
説明や IPv6 を付けるなら --ip-permissions |
| アウトバウンドを追加 | aws ec2 authorize-security-group-egress ... |
引数の形は ingress と同じ |
| ルールを一覧で確認 | aws ec2 describe-security-group-rules --filters Name=group-id,Values=SG |
1ルール1行。ルール ID(sgr-…)がわかる |
| グループ単位で確認 | aws ec2 describe-security-groups --group-ids SG |
IpPermissions にポートごとにまとまる |
| ルールを書き換える | aws ec2 modify-security-group-rules --group-id SG --security-group-rules ... |
ルール ID を指定して中身を置き換える |
| インバウンドを削除 | aws ec2 revoke-security-group-ingress --group-id SG --security-group-rule-ids sgr-… |
追加時と同じ引数でも消せる |
| アウトバウンドを削除 | aws ec2 revoke-security-group-egress ... |
既定の「全許可」を外すときにも使う |
| グループを削除 | aws ec2 delete-security-group --group-id SG |
使用中・参照中のものは先に外す |
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「AWS CLIでセキュリティグループ設定|ルール追加・削除・確認」
セキュリティグループのルールの基本
セキュリティグループは、インスタンスなどに出入りする通信を「許可するルール」の集まりです。公式ドキュメントで確認できる基本は次のとおりです。
| 項目 | 内容 |
|---|---|
| 書けるルール | 許可のみ(拒否ルールは書けない) |
| 作成直後のインバウンド | ルールなし(何も入ってこられない) |
| 作成直後のアウトバウンド | すべての通信を許可するルールが1つ |
| ルールの構成 | プロトコル、ポート範囲、送信元(または宛先)、説明(任意・255文字まで) |
| 送信元に書けるもの | IPv4/IPv6 の CIDR、別のセキュリティグループの ID、プレフィックスリストの ID |
| 反映 | ルールを変えると、そのグループを付けているリソースすべてに自動で反映 |
作成からグループ削除までを通しで実行する
1. セキュリティグループを作る
VPC の ID を変数に入れてから作成します。--query で GroupId だけを受け取っておくと、次のコマンドにつなげやすくなります。
VPC_ID=vpc-2ca69521e9cd280bc # 自分の VPC の ID に置き換える
aws ec2 create-security-group \
--group-name web-sg \
--description "web server" \
--vpc-id $VPC_ID \
--tag-specifications 'ResourceType=security-group,Tags=[{Key=Name,Value=web-sg}]' \
--query '{GroupId:GroupId}'
{
"GroupId": "sg-0013fdefaf448453b"
}
名前から ID を引き直したいときは、--filters で VPC と名前を指定します。
SG_ID=$(aws ec2 describe-security-groups \
--filters Name=vpc-id,Values=$VPC_ID Name=group-name,Values=web-sg \
--query 'SecurityGroups[0].GroupId' --output text)
echo $SG_ID
sg-0013fdefaf448453b
作成直後の状態を見ると、インバウンドは空、アウトバウンドは全許可(プロトコル -1、宛先 0.0.0.0/0) になっています。
aws ec2 describe-security-groups --group-ids $SG_ID \
--query 'SecurityGroups[0].{In:IpPermissions,Out:IpPermissionsEgress[].[IpProtocol,IpRanges[0].CidrIp]}'
{
"In": [],
"Out": [
[
"-1",
"0.0.0.0/0"
]
]
}
2. インバウンドルールを追加する(短い書き方)
もっとも短い形は --protocol・--port・--cidr の3つです。HTTPS(443番)をどこからでも受け付ける例です。
aws ec2 authorize-security-group-ingress \
--group-id $SG_ID --protocol tcp --port 443 --cidr 0.0.0.0/0
{
"Return": true,
"SecurityGroupRules": [
{
"SecurityGroupRuleId": "sgr-d957b8e8c2c50072b",
"GroupId": "sg-0013fdefaf448453b",
"IsEgress": false,
"IpProtocol": "tcp",
"FromPort": 443,
"ToPort": 443,
"CidrIpv4": "0.0.0.0/0",
"Tags": []
}
]
}
追加されたルールには sgr- で始まるルール ID が付きます。 変更や削除でこの ID を使うので、控えておくと便利です。公式リファレンスの出力例には、このほか GroupOwnerId(所有アカウントの ID)なども載っています。
3. JSON 書式(--ip-permissions)で追加する
説明(Description)を付けたい、IPv6 を書きたい、複数のルールを一度に入れたい、というときは --ip-permissions を使います。SSH(22番)を特定の IP アドレスだけに許可し、説明を付ける例です。
aws ec2 authorize-security-group-ingress --group-id $SG_ID \
--ip-permissions '[{"IpProtocol":"tcp","FromPort":22,"ToPort":22,"IpRanges":[{"CidrIp":"203.0.113.10/32","Description":"office"}]}]' \
--query 'SecurityGroupRules[].[SecurityGroupRuleId,IpProtocol,FromPort,CidrIpv4,Description]' --output text
sgr-6f1ac7dfaf7b0b70f tcp 22 203.0.113.10/32 office
同じ内容を、AWS CLI の省略記法(キー=値をカンマでつなぐ形)でも書けます。引用符が少なく、1行で書きやすい形です。
aws ec2 authorize-security-group-ingress --group-id $SG_ID \
--ip-permissions 'IpProtocol=tcp,FromPort=80,ToPort=80,IpRanges=[{CidrIp=0.0.0.0/0,Description=http}]' \
--query 'SecurityGroupRules[].[SecurityGroupRuleId,IpProtocol,FromPort,CidrIpv4,Description]' --output text
sgr-abf7a1a2766d640b5 tcp 80 0.0.0.0/0 http
ルールが増えてきたら、JSON をファイルに書いて file:// で渡すと読みやすくなります。次のファイルは、8080番を2つのサブネットから、443番を IPv6 の全アドレスから許可します。
[
{
"IpProtocol": "tcp", "FromPort": 8080, "ToPort": 8080,
"IpRanges": [
{"CidrIp": "10.0.1.0/24", "Description": "app-a"},
{"CidrIp": "10.0.2.0/24", "Description": "app-b"}
]
},
{
"IpProtocol": "tcp", "FromPort": 443, "ToPort": 443,
"Ipv6Ranges": [{"CidrIpv6": "::/0", "Description": "https-v6"}]
}
]
aws ec2 authorize-security-group-ingress --group-id $SG_ID \
--ip-permissions file://rules.json
短い書き方と JSON 書式の対応
| 短い書き方 | --ip-permissions のキー | 補足 |
|---|---|---|
--protocol tcp |
IpProtocol |
tcp / udp / icmp。すべてのプロトコルは -1 |
--port 443 |
FromPort と ToPort に同じ値 |
単一ポート |
--port 8000-8080 |
FromPort=8000、ToPort=8080 |
範囲 |
--cidr 203.0.113.10/32 |
IpRanges=[{CidrIp=...}] |
IPv4 |
| (短い書き方なし) | Ipv6Ranges=[{CidrIpv6=...}] |
IPv6 |
--source-group sg-… |
UserIdGroupPairs=[{GroupId=...}] |
別グループ参照 |
| (短い書き方なし) | 各要素の Description |
ルールの説明 |
説明なしの IPv4 ルールを1本だけ入れるなら短い書き方、それ以外は --ip-permissions、と使い分けると迷いません。
4. ルールを確認する
describe-security-group-rules は1ルールを1行で返します。--query で列を選び、--output table で表にします。
aws ec2 describe-security-group-rules \
--filters Name=group-id,Values=$SG_ID \
--query 'SecurityGroupRules[].[SecurityGroupRuleId,IsEgress,IpProtocol,FromPort,ToPort,CidrIpv4||CidrIpv6,Description]' \
--output table
------------------------------------------------------------------------------------------
| DescribeSecurityGroupRules |
+------------------------+--------+------+-------+-------+------------------+------------+
| sgr-278ea1fa215d3e0e7 | True | -1 | -1 | -1 | 0.0.0.0/0 | None |
| sgr-d957b8e8c2c50072b | False | tcp | 443 | 443 | 0.0.0.0/0 | None |
| sgr-6f1ac7dfaf7b0b70f | False | tcp | 22 | 22 | 203.0.113.10/32 | office |
| sgr-abf7a1a2766d640b5 | False | tcp | 80 | 80 | 0.0.0.0/0 | http |
| sgr-8a7857b8e4b4f3e98 | False | tcp | 8080 | 8080 | 10.0.1.0/24 | app-a |
| sgr-88e61dd4ddeb63ccb | False | tcp | 8080 | 8080 | 10.0.2.0/24 | app-b |
| sgr-ba1693f3d6ac0c5b7 | False | tcp | 443 | 443 | ::/0 | https-v6 |
+------------------------+--------+------+-------+-------+------------------+------------+
2列目の IsEgress が True の行がアウトバウンド、False の行がインバウンドです。CidrIpv4||CidrIpv6 は「IPv4 がなければ IPv6 を表示する」という JMESPath の書き方です。
インバウンドだけに絞るときは、?!IsEgress で条件を付けます。
aws ec2 describe-security-group-rules \
--filters Name=group-id,Values=$SG_ID \
--query 'SecurityGroupRules[?!IsEgress].[FromPort,ToPort,IpProtocol,CidrIpv4||CidrIpv6]' --output text
443 443 tcp 0.0.0.0/0
22 22 tcp 203.0.113.10/32
80 80 tcp 0.0.0.0/0
8080 8080 tcp 10.0.1.0/24
8080 8080 tcp 10.0.2.0/24
443 443 tcp ::/0
一方、describe-security-groups は 同じプロトコル・ポートのルールを1つの要素にまとめて 返します。443番を取り出すと、IPv4 と IPv6 が同じ要素に入っているのがわかります。
aws ec2 describe-security-groups --group-ids $SG_ID \
--query 'SecurityGroups[0].IpPermissions[?FromPort==`443`]'
[
{
"IpProtocol": "tcp",
"FromPort": 443,
"ToPort": 443,
"UserIdGroupPairs": [],
"IpRanges": [
{
"CidrIp": "0.0.0.0/0"
}
],
"Ipv6Ranges": [
{
"Description": "https-v6",
"CidrIpv6": "::/0"
}
],
"PrefixListIds": []
}
]
| コマンド | 返る形 | 向いている場面 |
|---|---|---|
| describe-security-group-rules | 1ルール1件(ルール ID つき) | 一覧表、変更・削除の対象探し |
| describe-security-groups | ポートごとにまとめた IpPermissions | グループ全体の把握、--ip-permissions の元データとして再利用 |
5. ルールを変更する(modify-security-group-rules)
送信元の IP アドレスが変わった、説明を直したい、というときは、ルール ID を指定して中身を置き換えます。まず22番のルール ID を取り出します。
RULE_ID=$(aws ec2 describe-security-group-rules \
--filters Name=group-id,Values=$SG_ID \
--query 'SecurityGroupRules[?FromPort==`22`].SecurityGroupRuleId' --output text)
echo $RULE_ID
sgr-6f1ac7dfaf7b0b70f
送信元を 198.51.100.0/24 に、説明を new-office に書き換えます。
aws ec2 modify-security-group-rules --group-id $SG_ID \
--security-group-rules "SecurityGroupRuleId=$RULE_ID,SecurityGroupRule={IpProtocol=tcp,FromPort=22,ToPort=22,CidrIpv4=198.51.100.0/24,Description=new-office}"
{
"Return": true
}
aws ec2 describe-security-group-rules --security-group-rule-ids $RULE_ID \
--query 'SecurityGroupRules[].[SecurityGroupRuleId,FromPort,ToPort,CidrIpv4,Description]' --output text
sgr-6f1ac7dfaf7b0b70f 22 22 198.51.100.0/24 new-office
ルール ID はそのままで、送信元と説明だけが変わりました。 SecurityGroupRule には、変えない項目(プロトコルやポート)も含めて、変更後の姿をまるごと書きます。
6. ルールを削除する(revoke)
削除の指定方法は3つあります。どれも成功すると Return が true で返ります。
# (a) 追加したときと同じ引数で消す
aws ec2 revoke-security-group-ingress --group-id $SG_ID \
--protocol tcp --port 80 --cidr 0.0.0.0/0 --query Return
# (b) ルール ID で消す
aws ec2 revoke-security-group-ingress --group-id $SG_ID \
--security-group-rule-ids $RULE_ID --query Return
# (c) 追加に使った JSON ファイルで消す
aws ec2 revoke-security-group-ingress --group-id $SG_ID \
--ip-permissions file://rules.json --query Return
true
true
true
削除後の一覧です。443番(IPv4)のインバウンドと、既定のアウトバウンドだけが残りました。
----------------------------------------------------------------------
| DescribeSecurityGroupRules |
+------------------------+--------+------+------+------+-------------+
| sgr-278ea1fa215d3e0e7 | True | -1 | -1 | -1 | 0.0.0.0/0 |
| sgr-d957b8e8c2c50072b | False | tcp | 443 | 443 | 0.0.0.0/0 |
+------------------------+--------+------+------+------+-------------+
| 指定方法 | 向いている場面 |
|---|---|
| 同じ引数(--protocol など) | 追加コマンドが手元に残っているとき |
| ルール ID | 一覧から選んで確実に1本だけ消したいとき |
| JSON ファイル | まとめて追加したルールを、まとめて戻したいとき |
7. アウトバウンドを絞る
アウトバウンドも同じ形で操作できます。既定の全許可を外し、443番だけを許可する例です。
# 既定の全許可を外す
aws ec2 revoke-security-group-egress --group-id $SG_ID \
--ip-permissions 'IpProtocol=-1,IpRanges=[{CidrIp=0.0.0.0/0}]' --query Return
# 443 番だけを許可する
aws ec2 authorize-security-group-egress --group-id $SG_ID \
--protocol tcp --port 443 --cidr 0.0.0.0/0 \
--query 'SecurityGroupRules[].[SecurityGroupRuleId,IsEgress,IpProtocol,FromPort,CidrIpv4]' --output text
true
sgr-9192bf939f202b85d True tcp 443 0.0.0.0/0
8. セキュリティグループを削除する
不要になったグループは delete-security-group で削除します。
aws ec2 delete-security-group --group-id $SG_ID
削除済みの ID にもう一度同じコマンドを実行すると、次のように InvalidGroup.NotFound が返ります。削除できたかどうかの確認にもなります。
An error occurred (InvalidGroup.NotFound) when calling the DeleteSecurityGroup operation: The security group 'sg-0013fdefaf448453b' does not exist
用途別のコピペ用コマンド一覧
$SG_ID は設定先のグループ、$WEB_SG_ID は送信元として参照するグループの ID です。ここでは新しく作った2つのグループ(設定先 sg-6a90b93352792a7cb、参照先 sg-3e97535a993c9c43f)で、すべて実行して確かめています。
| 用途 | コマンド(先頭に aws ec2 authorize-security-group-ingress --group-id $SG_ID を付ける) |
|---|---|
| SSH(自分の IP だけ) | --protocol tcp --port 22 --cidr 203.0.113.10/32 |
| HTTP | --protocol tcp --port 80 --cidr 0.0.0.0/0 |
| HTTPS | --protocol tcp --port 443 --cidr 0.0.0.0/0 |
| MySQL(別グループから) | --protocol tcp --port 3306 --source-group $WEB_SG_ID |
| PostgreSQL(別グループから) | --protocol tcp --port 5432 --source-group $WEB_SG_ID |
| ポート範囲 | --protocol tcp --port 8000-8080 --cidr 10.0.0.0/16 |
| DNS(UDP) | --protocol udp --port 53 --cidr 10.0.0.0/16 |
| ICMP すべて(ping など) | --protocol icmp --port -1 --cidr 10.0.0.0/16 |
| HTTPS(IPv6) | --ip-permissions 'IpProtocol=tcp,FromPort=443,ToPort=443,Ipv6Ranges=[{CidrIpv6=::/0}]' |
| 説明つき | --ip-permissions 'IpProtocol=tcp,FromPort=22,ToPort=22,IpRanges=[{CidrIp=198.51.100.7/32,Description=admin-home}]' |
| 別グループ参照+説明 | --ip-permissions "IpProtocol=tcp,FromPort=6379,ToPort=6379,UserIdGroupPairs=[{GroupId=$WEB_SG_ID,Description=from-web}]" |
上の11本を順に実行したときに返ってきたルールです(プロトコル、開始ポート、終了ポート、送信元の順)。3306・5432・6379番の送信元には、参照先のグループ ID が入っています。
tcp 22 22 203.0.113.10/32
tcp 80 80 0.0.0.0/0
tcp 443 443 0.0.0.0/0
tcp 3306 3306 sg-3e97535a993c9c43f
tcp 5432 5432 sg-3e97535a993c9c43f
tcp 8000 8080 10.0.0.0/16
udp 53 53 10.0.0.0/16
icmp -1 -1 10.0.0.0/16
tcp 443 443 ::/0
tcp 22 22 198.51.100.7/32
tcp 6379 6379 sg-3e97535a993c9c43f
自分の IP アドレスだけを許可するときは /32 を付けます。データベースのポートは CIDR ではなく別グループ参照にしておくと、アプリ側のサーバーが増えてもルールを書き足さずに済みます。
0.0.0.0/0 で開いているルールを探す
全グループを対象に、どこからでも入れるインバウンドルールを一覧にします。IPv4 の 0.0.0.0/0 と IPv6 の ::/0 の両方を拾います。
aws ec2 describe-security-group-rules \
--query 'SecurityGroupRules[?!IsEgress && (CidrIpv4==`0.0.0.0/0` || CidrIpv6==`::/0`)].[GroupId,SecurityGroupRuleId,IpProtocol,FromPort,ToPort,CidrIpv4||CidrIpv6]' \
--output table
-------------------------------------------------------------------------------------
| DescribeSecurityGroupRules |
+-----------------------+-------------------------+------+------+------+------------+
| sg-0013fdefaf448453b | sgr-d957b8e8c2c50072b | tcp | 443 | 443 | 0.0.0.0/0 |
| sg-0013fdefaf448453b | sgr-abf7a1a2766d640b5 | tcp | 80 | 80 | 0.0.0.0/0 |
| sg-0013fdefaf448453b | sgr-ba1693f3d6ac0c5b7 | tcp | 443 | 443 | ::/0 |
+-----------------------+-------------------------+------+------+------+------------+
(手順 6 で削除する前の状態で実行した結果です。)
グループ名だけ知りたいときは、サーバー側で絞り込む --filters が手軽です。
aws ec2 describe-security-groups \
--filters Name=ip-permission.cidr,Values=0.0.0.0/0 \
--query 'SecurityGroups[].[GroupId,GroupName]' --output text
sg-0013fdefaf448453b web-sg
SSH(22番)が 0.0.0.0/0 で開いているグループだけを探す式です。上の例では22番を特定の IP アドレスに限定していたので、結果は0件(何も表示されない)でした。
aws ec2 describe-security-groups \
--query 'SecurityGroups[?IpPermissions[?contains(IpRanges[].CidrIp, `0.0.0.0/0`) && FromPort==`22`]].[GroupId,GroupName]' \
--output text
エラー文と直し方
InvalidPermission.Duplicate(同じルールがすでにある)
同じルールをもう一度追加すると返ります。
aws ec2 authorize-security-group-ingress \
--group-id $SG_ID --protocol tcp --port 443 --cidr 0.0.0.0/0
An error occurred (InvalidPermission.Duplicate) when calling the AuthorizeSecurityGroupIngress operation: The specified rule already exists
目的の状態にはすでになっているので、設定としては完了しています。コロンより後ろのメッセージ部分は環境や版によって文面が変わることがあるため、判定には括弧の中のエラーコードを使います。スクリプトの中で繰り返し実行する場合は、このエラーだけを「登録済み」として扱うと、何度流しても同じ結果になります。
aws ec2 authorize-security-group-ingress \
--group-id $SG_ID --protocol tcp --port 443 --cidr 0.0.0.0/0 2>&1 \
| grep -q InvalidPermission.Duplicate && echo "既に登録済みです"
既に登録済みです
説明や送信元を変えたい場合は、追加し直すのではなく modify-security-group-rules を使います。なお公式リファレンスには、CIDR を正規化した結果が既存ルールと同じになる場合(例:100.68.0.18/18 と 100.68.0.0/18)も重複として扱われる、と書かれています。
InvalidGroup.NotFound(グループが見つからない)
aws ec2 authorize-security-group-ingress \
--group-id sg-0123456789abcdef0 --protocol tcp --port 443 --cidr 0.0.0.0/0
An error occurred (InvalidGroup.NotFound) when calling the AuthorizeSecurityGroupIngress operation: The security group 'sg-0123456789abcdef0' does not exist
| 確かめること | 方法 |
|---|---|
| ID の打ち間違い・変数が空 | echo $SG_ID で中身を見る |
| リージョンが違う | --region や AWS_DEFAULT_REGION を確認する |
| 作成直後 | 公式のエラーコード一覧には、作ったばかりの ID がまだ行き渡っていない場合にも起きるとある。少し待って再実行する |
InvalidPermission.NotFound(消そうとしたルールがない)
revoke の引数が、登録されているルールと一致しないときに返ります。
An error occurred (InvalidPermission.NotFound) when calling the RevokeSecurityGroupIngress operation: The specified rule does not exist in this security group
ポート・プロトコル・CIDR のどれかが少し違うことが多いので、describe-security-group-rules でルール ID を調べ、--security-group-rule-ids で消すのが確実です。
InvalidGroup.Duplicate(同じ名前のグループがある)
同じ名前で create-security-group をもう一度実行すると、InvalidGroup.Duplicate が返ります。同じ VPC の中では、グループ名を重ねて使えません。既存のグループをそのまま使うか、別の名前にします。
DependencyViolation(使用中・参照中で削除できない)
公式リファレンスによると、delete-security-group は次のどれかに当てはまると DependencyViolation で止まります。
- インスタンスまたはネットワークインターフェイスに関連付けられている
- 同じ VPC の別のセキュリティグループのルールから参照されている
- VPC の関連付けがある
直し方は、依存しているものを先に探して外し、そのあとで削除する ことです。探すコマンドは次の2つです。
# このグループを送信元として参照しているグループを探す
aws ec2 describe-security-groups \
--filters Name=ip-permission.group-id,Values=$SG_ID \
--query 'SecurityGroups[].[GroupId,GroupName]' --output text
sg-24a6b5f295fe41113 db-sg
(web-sg を送信元にしたルールを持つ db-sg を別に作って実行した結果です。)
# このグループを付けているネットワークインターフェイスを探す
aws ec2 describe-network-interfaces \
--filters Name=group-id,Values=$SG_ID \
--query 'NetworkInterfaces[].[NetworkInterfaceId,Description,Attachment.InstanceId]' --output text
参照しているグループが見つかったら、そのグループ側の該当ルールを revoke で消します。ネットワークインターフェイスが見つかったら、インスタンス側のセキュリティグループを別のものに付け替えてから削除します。
エラーコードのまとめ
| エラーコード | 起きる操作 | 直し方 |
|---|---|---|
| InvalidPermission.Duplicate | authorize | 登録済み。変更なら modify を使う |
| InvalidPermission.NotFound | revoke | ルール ID を調べて指定する |
| InvalidGroup.NotFound | 全般 | ID・リージョンを確認する |
| InvalidGroup.Duplicate | create | 別の名前にするか既存を使う |
| DependencyViolation | delete | 参照元ルールと関連付けを先に外す |
よくある質問
Q. --cidr と --ip-permissions は同時に使えますか?
A. 1回のコマンドではどちらか一方で書きます。説明・IPv6・複数ルールが必要になったら --ip-permissions にまとめるのがおすすめです。
Q. ルールを変えたら、インスタンスの再起動は必要ですか? A. 不要です。公式リファレンスには、ルールの変更は関連付けられたインスタンスへできるだけ早く伝わる(わずかな遅れが出ることがある)と書かれています。
Q. 拒否ルールは書けますか? A. セキュリティグループに書けるのは許可ルールだけです。許可していない通信は通りません。
Q. describe-security-groups と describe-security-group-rules はどちらを使えばよいですか? A. ルール ID が必要な変更・削除や一覧表づくりには describe-security-group-rules、グループ全体を JSON で把握したいときは describe-security-groups が向いています。
まとめ
- 作成は create-security-group、追加は authorize、削除は revoke、書き換えは modify-security-group-rules の4つを覚えれば一通り操作できる
- 短い書き方(--protocol --port --cidr)は説明なしの IPv4 ルール向け。説明・IPv6・複数ルールは
--ip-permissions - 確認は describe-security-group-rules を表形式で。ルール ID(sgr-…)がわかり、変更・削除につなげられる
- データベースのポートは別グループ参照(--source-group) にすると、サーバーの増減に強い
- 0.0.0.0/0 と ::/0 で開いたルールは --query で定期的に一覧にする
- InvalidPermission.Duplicate は登録済みの合図、DependencyViolation は参照元と関連付けを先に外す
参考・出典
- AWS CLI Command Reference: authorize-security-group-ingress(https://docs.aws.amazon.com/cli/latest/reference/ec2/authorize-security-group-ingress.html)
- AWS CLI Command Reference: modify-security-group-rules(https://docs.aws.amazon.com/cli/latest/reference/ec2/modify-security-group-rules.html)
- AWS CLI Command Reference: delete-security-group(https://docs.aws.amazon.com/cli/latest/reference/ec2/delete-security-group.html)
- Amazon VPC User Guide: Security group rules(https://docs.aws.amazon.com/vpc/latest/userguide/security-group-rules.html)
- Amazon EC2 API Reference: Error codes(https://docs.aws.amazon.com/AWSEC2/latest/APIReference/errors-overview.html)
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「AWS CLIでセキュリティグループ設定|ルール追加・削除・確認」
株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。
WE ARE HIRING
RJCで一緒に開発しながら、
成長を楽しみませんか?
RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!
- 127日年間休日
- 12時間平均残業時間
- 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!
ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。