セキュリティグループのルールは authorize-security-group-ingress / authorize-security-group-egress で追加し、revoke-security-group-ingress / revoke-security-group-egress で削除する。現在のルールを確認する方法は 【AWS CLI】セキュリティグループのインバウンド・アウトバウンドルールをCLIで確認する を参照。

インバウンドルールを追加する

authorize-security-group-ingress--ip-permissions にプロトコル・ポート・送信元を指定してインバウンドルールを追加する。

$ aws ec2 authorize-security-group-ingress \
  --group-id sg-0123456789abcdef0 \
  --ip-permissions 'IpProtocol=tcp,FromPort=443,ToPort=443,IpRanges=[{CidrIp=0.0.0.0/0,Description="HTTPS from anywhere"}]'
{
    "Return": true,
    "SecurityGroupRules": [
        {
            "SecurityGroupRuleId": "sgr-0123456789abcdef0",
            "GroupId": "sg-0123456789abcdef0",
            "GroupOwnerId": "123456789012",
            "IsEgress": false,
            "IpProtocol": "tcp",
            "FromPort": 443,
            "ToPort": 443,
            "CidrIpv4": "0.0.0.0/0",
            "Description": "HTTPS from anywhere",
            "SecurityGroupRuleArn": "arn:aws:ec2:ap-northeast-1:123456789012:security-group-rule/sgr-0123456789abcdef0"
        }
    ]
}

追加したルールの SecurityGroupRuleId がレスポンスに含まれる。このIDは後述のルール削除で使う。

アウトバウンドルールを追加する

アウトバウンドルールは authorize-security-group-egress で追加する。オプションの構文は authorize-security-group-ingress と同じである。

$ aws ec2 authorize-security-group-egress \
  --group-id sg-0123456789abcdef0 \
  --ip-permissions 'IpProtocol=tcp,FromPort=5432,ToPort=5432,IpRanges=[{CidrIp=10.0.1.0/24,Description="PostgreSQL to db subnet"}]'
{
    "Return": true,
    "SecurityGroupRules": [
        {
            "SecurityGroupRuleId": "sgr-0fedcba9876543210",
            "GroupId": "sg-0123456789abcdef0",
            "GroupOwnerId": "123456789012",
            "IsEgress": true,
            "IpProtocol": "tcp",
            "FromPort": 5432,
            "ToPort": 5432,
            "CidrIpv4": "10.0.1.0/24",
            "Description": "PostgreSQL to db subnet",
            "SecurityGroupRuleArn": "arn:aws:ec2:ap-northeast-1:123456789012:security-group-rule/sgr-0fedcba9876543210"
        }
    ]
}

送信元・送信先に別のセキュリティグループを指定する

CIDRの代わりに UserIdGroupPairs へ参照先のセキュリティグループIDを指定すると、IPアドレスではなく特定のセキュリティグループに所属するリソースからの通信を許可できる。

$ aws ec2 authorize-security-group-ingress \
  --group-id sg-0123456789abcdef0 \
  --ip-permissions 'IpProtocol=tcp,FromPort=3306,ToPort=3306,UserIdGroupPairs=[{GroupId=sg-0fedcba9876543210,Description="MySQL from app servers"}]'
{
    "Return": true,
    "SecurityGroupRules": [
        {
            "SecurityGroupRuleId": "sgr-0aabbccddeeff0011",
            "GroupId": "sg-0123456789abcdef0",
            "GroupOwnerId": "123456789012",
            "IsEgress": false,
            "IpProtocol": "tcp",
            "FromPort": 3306,
            "ToPort": 3306,
            "ReferencedGroupInfo": {
                "GroupId": "sg-0fedcba9876543210",
                "UserId": "123456789012"
            },
            "Description": "MySQL from app servers",
            "SecurityGroupRuleArn": "arn:aws:ec2:ap-northeast-1:123456789012:security-group-rule/sgr-0aabbccddeeff0011"
        }
    ]
}

ルールIDを指定して削除する

ルールを削除するには revoke-security-group-ingress / revoke-security-group-egress を使う。--security-group-rule-ids には describe-security-group-rules で取得した SecurityGroupRuleId を指定する。プロトコルやポートを指定し直す必要がなく、確実に対象のルールだけを削除できる。

$ aws ec2 revoke-security-group-ingress \
  --group-id sg-0123456789abcdef0 \
  --security-group-rule-ids sgr-0123456789abcdef0
{
    "Return": true,
    "RevokedSecurityGroupRules": [
        {
            "SecurityGroupRuleId": "sgr-0123456789abcdef0",
            "GroupId": "sg-0123456789abcdef0",
            "IsEgress": false,
            "IpProtocol": "tcp",
            "FromPort": 443,
            "ToPort": 443,
            "CidrIpv4": "0.0.0.0/0",
            "Description": "HTTPS from anywhere"
        }
    ]
}

アウトバウンドルールも同様に revoke-security-group-egress--security-group-rule-ids を指定して削除する。

$ aws ec2 revoke-security-group-egress \
  --group-id sg-0123456789abcdef0 \
  --security-group-rule-ids sgr-0fedcba9876543210
{
    "Return": true,
    "RevokedSecurityGroupRules": [
        {
            "SecurityGroupRuleId": "sgr-0fedcba9876543210",
            "GroupId": "sg-0123456789abcdef0",
            "IsEgress": true,
            "IpProtocol": "tcp",
            "FromPort": 5432,
            "ToPort": 5432,
            "CidrIpv4": "10.0.1.0/24",
            "Description": "PostgreSQL to db subnet"
        }
    ]
}

プロトコル・ポート・送信元を指定して削除する

ルールIDが分からない場合は --ip-permissions にプロトコル・ポート・送信元を指定して削除できる。セキュリティグループを参照するルールの場合、describe-security-group-rules では ReferencedGroupInfo.GroupId に入っていた値を、revoke-security-group-ingress では UserIdGroupPairs へそのまま指定する。

$ aws ec2 revoke-security-group-ingress \
  --group-id sg-0123456789abcdef0 \
  --ip-permissions 'IpProtocol=tcp,FromPort=3306,ToPort=3306,UserIdGroupPairs=[{GroupId=sg-0fedcba9876543210}]'
{
    "Return": true,
    "RevokedSecurityGroupRules": [
        {
            "SecurityGroupRuleId": "sgr-0aabbccddeeff0011",
            "GroupId": "sg-0123456789abcdef0",
            "IsEgress": false,
            "IpProtocol": "tcp",
            "FromPort": 3306,
            "ToPort": 3306,
            "ReferencedGroupId": "sg-0fedcba9876543210",
            "Description": "MySQL from app servers"
        }
    ]
}

レスポンス中の参照先セキュリティグループのフィールド名は、describe-security-group-rulesReferencedGroupInfo(オブジェクト)とは異なり ReferencedGroupId(文字列)である点に注意する。