ちょっと話題の記事

[アップデート] セキュリティグループの各ルールにリソース識別子が付く様になりました

合わせてタグ付けもできる様になってます
2021.07.10

しばたです。

先日よりセキュリティグループの各ルールにリソース識別子(Security group rule ID)が付く様になり、同時に各ルールに対してタグ付けもできる様になりました。

AWSからのアナウンスはこちらになります。

本記事ではこの更新について解説します。

どういうこと?

内容としてはそのままでセキュリティグループのルール一つ一つに対しIDが付いただけです。

従来はセキュリティグループそのものに対してだけIDが付いており、各ルールにはIDはありませんでした *1
このためAWS CLIなどでセキュリティグループの各ルールを特定するにはプロトコルやポート、Source/Destinaionの各属性がすべて一致してるかで判断するしかなかったのですが、今回の更新によりIDで直接各ルールを特定できる事になりAWS CLIなどの使い勝手が向上しています。

加えて各ルールにタグ付けもできる様になったため、これまではDescriptionを工夫して使っていたところに対しユーザーが自由に属性を付けることができる様になっています。
こちらもAWS CLIなどを使った自動化処理で役に立つでしょう。

確認してみた

今回はマネジメントコンソールとAWS CLIでの操作を確認してみます。
AWS CLIは現在最新のVer.2.2.18 (および Ver.1.19.107)以降でこの更新に対応しています。

マネジメントコンソール

マネジメントコンソールから適当なセキュリティグループを選びインバウンドルールを表示すると一目瞭然です。

(上図は私の検証環境で使ってるRDP接続許可用ルール)

各ルールの表にこれまでなかった

  • Name列 (Nameタグ)
  • Security group rule id列

が増えており、sgr-で始まるIDが増えていることがわかります。

そして表の右上には「Manage tags」とタグ管理のためのボタンも増えています。
更新したいルールを選びこのボタンをクリックすると編集画面に遷移し自由にタグを付けることができます。

結果こんな感じでNameタグもちゃんと反映されています。

なお「アウトバウンドルール」も同様です。

AWS CLI

今回はAWS CLI Ver.2.2.18を使います。

C:\> aws --version
aws-cli/2.2.18 Python/3.8.8 Windows/10 exe/AMD64 prompt/off

セキュリティグループのルール一覧を確認するのにaws ec2 describe-security-group-rulesコマンドが新規に増えています。

このコマンドでは個別のルールIDを指定する--security-group-rule-idsパラメーターか、戻り値の最大数を指定する--max-resultsパラメーターのどちらかが必須パラメーターとなっています。
(※現時点のAWS CLIのドキュメントでは--max-results--max-itemsと誤記されているので注意。そのうち直ると思いますGitHubでIssue上げておきました。)

特定のセキュリティグループに紐づくルールの一覧を取得するには--filtersパラメーターを使い以下の様にしてやればOKです。

# JSON output をデフォルト設定にしています
C:\> aws ec2 describe-security-group-rules --filters 'Name=group-id,Values=sg-046364xxxxxxxxxx' --max-results 10
{
    "SecurityGroupRules": [
        {
            "SecurityGroupRuleId": "sgr-030353fxxxxxxxxxx",
            "GroupId": "sg-046364xxxxxxxxxx",
            "GroupOwnerId": "xxxxxxxxxx",
            "IsEgress": false,
            "IpProtocol": "tcp",
            "FromPort": 3389,
            "ToPort": 3389,
            "CidrIpv4": "xxx.xxx.xxx.xxx/xx",
            "Description": "Classmethod Sappro",
            "Tags": [
                {
                    "Key": "Project",
                    "Value": "Development"
                },
                {
                    "Key": "Name",
                    "Value": "sgr-from-cm-sapporo"
                }
            ]
        },
        //
        // ・・・(中略)・・・
        //
        {
            "SecurityGroupRuleId": "sgr-0657beaxxxxxxxxxx",
            "GroupId": "sg-046364xxxxxxxxxx",
            "GroupOwnerId": "xxxxxxxxxx",
            "IsEgress": true,
            "IpProtocol": "-1",
            "FromPort": -1,
            "ToPort": -1,
            "CidrIpv4": "0.0.0.0/0",
            "Tags": []
        }
    ]
}

このコマンドではインバウンド・アウトバウンドルール両方取得可能でIsEgress属性で判別します。

すでにルールIDがわかっている場合はこんな感じで指定してやります。

# ルールIDがわかっている場合は --security-group-rule-ids パラメーターを使う
C:\> aws ec2 describe-security-group-rules --security-group-rule-ids sgr-030353fxxxxxxxxxx
{
    "SecurityGroupRules": [
        {
            "SecurityGroupRuleId": "sgr-030353fxxxxxxxxxx",
            "GroupId": "sg-046364xxxxxxxxxx",
            "GroupOwnerId": "xxxxxxxxxx",
            "IsEgress": false,
            "IpProtocol": "tcp",
            "FromPort": 3389,
            "ToPort": 3389,
            "CidrIpv4": "xxx.xxx.xxx.xxx/xx",
            "Description": "Classmethod Sappro",
            "Tags": [
                {
                    "Key": "Project",
                    "Value": "Development"
                },
                {
                    "Key": "Name",
                    "Value": "sgr-from-cm-sapporo"
                }
            ]
        }
    ]
}

次に、ルールの解除を行うaws ec2 revoke-security-group-ingressaws ec2 revoke-security-group-egressコマンドには今回新しく--security-group-rule-idsパラメーターが増えています。

先ほど表示したルールを解除するには--group-idパラメーターと合わせて以下の様に指定します。

# --group-id にセキュリティグループID、--security-group-rule-ids にルールIDを指定
C:\> aws ec2 revoke-security-group-ingress --group-id sg-046364xxxxxxxxxx --security-group-rule-ids sgr-030353fxxxxxxxxxx
{
    "Return": true
}

ルールの割り当てを行うaws ec2 authorize-security-group-ingressaws ec2 authorize-security-group-egressコマンドには今回新しく--tag-specificationsパラメーターが増えています。

ルールの割り当て方法は従来通り変わりありません。
PowerShell環境だと以下の様な感じで指定可能で、実行結果にSecurityGroupRuleIdが新しく増えています。

# PowerShell 環境での実行例 : --tag-specifications パラメーターでルール作成と同時にタグ付けが可能になっている
C:\> aws ec2 authorize-security-group-ingress --group-id sg-046364xxxxxxxxxx  `
       --ip-permissions 'IpProtocol=tcp,FromPort=3389,ToPort=3389,IpRanges=[{CidrIp=1.2.3.4/32}]'  `
       --tag-specifications 'ResourceType=security-group-rule,Tags=[{Key=Name,Value=sgr-my-new-rule}]'
{
    "Return": true,
    "SecurityGroupRules": [
        {
            "SecurityGroupRuleId": "sgr-07bc8c34729342521",
            "GroupId": "sg-046364xxxxxxxxxx",
            "GroupOwnerId": "xxxxxxxxxx",
            "IsEgress": false,
            "IpProtocol": "tcp",
            "FromPort": 3389,
            "ToPort": 3389,
            "CidrIpv4": "1.2.3.4/32",
            "Tags": [
                {
                    "Key": "Name",
                    "Value": "sgr-my-new-rule"
                }
            ]
        }
    ]
}

ちなみにタグはaws ec2 create-tagsコマンドからも設定可能です。

# --resource パラメーターにルールIDを指定
C:\> aws ec2 create-tags --resources sgr-07bc8c34729342521 --tags 'Key=Project,Value=DevelopersIO'

参考

AWS CLIの実行についてはAWS News Blogを参考にしていますのでこちらも併せてご覧ください。

最後に

以上となります。

シンプルながら嬉しい更新ですね。
セキュリティグループに対する自動化処理などを行っている方はこの更新の恩恵を受けることができると思いますので積極的に使ってみてはいかがでしょうか。

脚注

  1. もしかしたら内部的には以前からIDがあったのかもしれませんがユーザーが使える形で露出はしていませんでした