Amazon Ec2

CLIでセキュリティグループを作ってEC2にアタッチさせてみた

ごあいさつ

こんばんは。もうそろそろひび割れたいたまごエンジニアのもに倉です。

AWS CLIシリーズ第二弾です。第一弾はこちら↓
AWS CLIでRoute53のホストゾーン作成からやってみた

今回は、みんな大好きAWS CLIを使ってセキュリティグループを作成し既存のEC2に
アタッチさせた後に、後片付けまで行っていこうと思います。

AWS CLIを使う利点

「コンソールからぽちぽちでできるからわざわざCLI使わなくてもいいんじゃない?」
と思う方もいらっしゃるかもしれません。
実際、コンソールから作業するのは直感的でとてもやりやすいです。
しかし、誰かに作業のやり方を教えるとき、「右端のボタンを押して~」と伝えるよりも、
CLIのコマンドを教えるほうがミスがないと思います。
「使えなくても大丈夫だけど、使えると便利」
これが、CLIを使う理由です。

と、うだうだ書きましたがCLIの利点について
わかりやすくまとめてくださっている記事がありましたので詳しくはこちらで!↓
どうしてサーバはCLIで触ることが多いのか?

環境

すぐにAWS CLIを使うことができて便利なCloud Shellを使います。

aws --version
aws-cli/2.2.15 Python/3.8.8 Linux/4.14.243-185.433.amzn2.x86_64 exec-env/CloudShell exe/x86_64.amzn.2 prompt/of

セキュリティグループ作成

作成

それでは、早速セキュリティグループを作っていきます。

セキュリティグループ名:moni-test

aws ec2 create-security-group \
--description "monitest" \
--group-name moni-test \
--vpc-id vpc-XXXXXXXXXXXXXXXXX

戻り値はこちら

{
    "GroupId": "sg-047f87d0d3d15065c"
}

ちなみに、vpc-idは必須ではありませんが、省略すると
default VPCにセキュリティグループが作成されます。

VPC一覧の確認コマンドはこちら

aws ec2 describe-vpcs

ここから目的のVPCのvpc-idを引っ張ってきています。

Nameタグ設定

せっかくなのでNameタグもつけてみます。

Name:moni-test

aws ec2 create-tags \
 --resources sg-047f87d0d3d15065c \
 --tags Key=Name,Value=moni-test

確認

できたかどうか確認します。

aws ec2 describe-security-groups \
--group-ids sg-047f87d0d3d15065c

group-idsを指定することで、さっき作ったセキュリティグループのみ確認できます。

{
    "SecurityGroups": [
        {
            "Description": "monitest",
            "GroupName": "moni-test",
            "IpPermissions": [],
            "OwnerId": "XXXXXXXXXXXX",
            "GroupId": "sg-047f87d0d3d15065c",
            "IpPermissionsEgress": [
                {
                    "IpProtocol": "-1",
                    "IpRanges": [
                        {
                            "CidrIp": "0.0.0.0/0"
                        }
                    ],
                    "Ipv6Ranges": [],
                    "PrefixListIds": [],
                    "UserIdGroupPairs": []
                }
            ],
            "Tags": [
                {
                    "Key": "Name",
                    "Value": "moni-test"
                }
            ],
            "VpcId": "vpc-0cd4a36fe54ba8bce"
        }
    ]
}

ばっちりできています。

作りたてのセキュリティグループは、アウトバウンドルール(IpPermissionsEgress)で
すべてのプロトコル(-1)に対して全開放(0.0.0.0/0)しか設定されていません。

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

インバウンドルールを追加していきます。
よく使うHTTPとHTTPSを全開放していきましょう。

HTTP全開放ルール追加

ささっといきます。

aws ec2 authorize-security-group-ingress \
--group-id sg-047f87d0d3d15065c \
--protocol tcp \
--port 80 \
--cidr 0.0.0.0/0

HTTPS全開放ルール追加

aws ec2 authorize-security-group-ingress \
--group-id sg-047f87d0d3d15065c \
--protocol tcp \
--port 443 \
--cidr 0.0.0.0/0

確認

ちゃんと設定できたか確認しましょう。

aws ec2 describe-security-groups \
--group-ids sg-047f87d0d3d15065c
{
    "SecurityGroups": [
        {
            "Description": "monitest",
            "GroupName": "moni-test",
            "IpPermissions": [
                {
                    "FromPort": 80,
                    "IpProtocol": "tcp",
                    "IpRanges": [
                        {
                            "CidrIp": "0.0.0.0/0"
                        }
                    ],
                    "Ipv6Ranges": [],
                    "PrefixListIds": [],
                    "ToPort": 80,
                    "UserIdGroupPairs": []
                },
                {
                    "FromPort": 443,
                    "IpProtocol": "tcp",
                    "IpRanges": [
                        {
                            "CidrIp": "0.0.0.0/0"
                        }
                    ],
                    "Ipv6Ranges": [],
                    "PrefixListIds": [],
                    "ToPort": 443,
                    "UserIdGroupPairs": []
                }
            ],
            "OwnerId": "XXXXXXXXXXX",
            "GroupId": "sg-047f87d0d3d15065c",
            "IpPermissionsEgress": [
                {
                    "IpProtocol": "-1",
                    "IpRanges": [
                        {
                            "CidrIp": "0.0.0.0/0"
                        }
                    ],
                    "Ipv6Ranges": [],
                    "PrefixListIds": [],
                    "UserIdGroupPairs": []
                }
            ],
            "Tags": [
                {
                    "Key": "Name",
                    "Value": "moni-test"
                }
            ],
            "VpcId": "vpc-XXXXXXXXXXXXXXXX"
        }
    ]
}

ばっちりです!

既存のEC2インスタンスにアタッチ

それでは、このできたてセキュリティグループを
既存のEC2にアタッチしていきます。

インスタンスの現在のセキュリティグループを確認

Nameタグに「moni-test」を設定したEC2インスタンスを用意しました。
現在のセキュリティグループ設定は以下の通りです。

aws ec2 describe-instances \
--filter "Name=tag:Name,Values=moni-test"
(略)
                    "SecurityGroups": [
                        {
                            "GroupName": "moni-test-kizon",
                            "GroupId": "sg-06467f06b3e183fa5"
                        }
                    ]
(略)

インスタンスにアタッチ

それでは先ほど作ったセキュリティグループをアタッチしましょう。

aws ec2 modify-instance-attribute \
--instance-id i-0688055957db0c11b \
--groups "sg-047f87d0d3d15065c" "sg-06467f06b3e183fa5"

このコマンドは、セキュリティグループを追加するコマンドではなく
セキュリティグループを変更するコマンドなので、
すでにアタッチされているセキュリティグループのGroupIdも記述します。

確認

ちゃんとアタッチされたか確認します。

aws ec2 describe-instances \
--filter "Name=tag:Name,Values=moni-test"
(略)
                    "SecurityGroups": [
                        {
                            "GroupName": "moni-test",
                            "GroupId": "sg-047f87d0d3d15065c"
                        },
                        {
                            "GroupName": "moni-test-kizon",
                            "GroupId": "sg-06467f06b3e183fa5"
                        }
                    ]
(略)

できたてセキュリティグループ「moni-test」がアタッチされています!

インバウンドルールの削除

では、せっかくなので作りたてのインバウンドルールを削除しましょう。

削除

HTTP

aws ec2 revoke-security-group-ingress \
--group-id sg-047f87d0d3d15065c \
--protocol tcp \
--port 80 \
--cidr 0.0.0.0/0

戻り値

{
    "Return": true
}

HTTPS

aws ec2 revoke-security-group-ingress \
--group-id sg-047f87d0d3d15065c \
--protocol tcp \
--port 443 \
--cidr 0.0.0.0/0

戻り値

{
    "Return": true
}

確認

失われたか確認します。

aws ec2 describe-security-groups \
--group-ids sg-047f87d0d3d15065c
{
    "SecurityGroups": [
        {
            "Description": "monitest",
            "GroupName": "moni-test",
            "IpPermissions": [],
            "OwnerId": "XXXXXXXXXXXX",
            "GroupId": "sg-047f87d0d3d15065c",
            "IpPermissionsEgress": [
                {
                    "IpProtocol": "-1",
                    "IpRanges": [
                        {
                            "CidrIp": "0.0.0.0/0"
                        }
                    ],
                    "Ipv6Ranges": [],
                    "PrefixListIds": [],
                    "UserIdGroupPairs": []
                }
            ],
            "Tags": [
                {
                    "Key": "Name",
                    "Value": "moni-test"
                }
            ],
            "VpcId": "vpc-XXXXXXXXXXXXXXXXX"
        }
    ]
}

しっかり消えていますね。

セキュリティグループの削除

ばっちり後片付けもしていきましょう。

インスタンスからデタッチ

なにかしらにアタッチされている場合、そのままセキュリティグループを削除しようとしても

An error occurred (DependencyViolation) when calling the DeleteSecurityGroup operation: resource sg-047f87d0d3d15065c has a dependent object

このようなエラーが出ます。
どこからも切り離して、独立した状態にしないと消せないんですね。

というわけで、先ほどアタッチしたインスタンスからデタッチします。

aws ec2 modify-instance-attribute \
--instance-id i-0688055957db0c11b \
--groups "sg-06467f06b3e183fa5"

前述したとおり、このコマンドはあくまで変更コマンドなので、
必要なセキュリティグループのGroupIdを記述すればOKです。
デタッチしたいセキュリティグループのGroupIdだけ書かないようにすれば、無事にデタッチされます。

セキュリティグループ削除

では、準備も整ったところでセキュリティグループを削除します。

aws ec2 delete-security-group \
--group-id sg-047f87d0d3d15065c

確認

さて、すでに消えたはずですが、セキュリティグループ「moni-test」を呼び出してみます。

aws ec2 describe-security-groups \
--group-ids sg-047f87d0d3d15065c

すると、このようなエラーが返ってきました。

An error occurred (InvalidGroup.NotFound) when calling the DescribeSecurityGroups operation: The security group 'sg-047f87d0d3d15065c' does not exist

見つからないよーとのことなので、無事に消えていることがわかります。
以上で後片付けまで終わりました!

あとがき

世にも楽しいAWS CLIの作業でした。
やっぱりかっこよくて強いので、これからもバンバン使っていきたいと思います。

返信を残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA