使用していないセキュリティグループをAWS Configの自動修復アクションで自動的に断捨離してみた

AWSリソース断捨離シリーズ(セキュリティグループ編) 続編は今のところ未定です。
2022.02.16

みなさんは「検証だから」と自分に言い聞かせて雑に作ったセキュリティグループがどんどん、どんどん増えて、次第に消すのも面倒くさいと思うくらいにどうしようもなくなったことありませんか?

私はあります。まさに今そういうお気持ちです。

「launch-wizard-20」 「launch-wizard-21..」 「launch-wizard-22....」

我ながらヒドい。

なんやかんやでセキュリティグループが95個もありましたが、ほとんど使っていない状態です。

今回はこの使ってないセキュリティグループをサクッと断捨離してしまおう!という手順のご紹介です。

先に3行まとめ

  • AWS Configのマネージドルールで使われてないセキュリティグループを検出
  • AWS マネージドの修復アクションを使って自動修復(セキュリティグループA削除)
  • 削除対象はEC2で使用されてないセキュリティグループになるので、LambdaやEFSなど他のサービスで利用しているセキュリティーグループも削除対象になってしまう(でも消えないので大丈夫)

やってみる

それではやっていきましょう。今回は以下の3ステップで実装します。

  • AWS Configルールの作成(使われてないセキュリティグループの検出)
  • IAMロールの作成(セキュリティグループの削除を許可)
  • 自動修復アクションの設定(セキュリティグループの削除)

AWS Config ルールの作成

まずはAWS Configの管理コンソールをから[ルール]-[ルールを追加]をクリックします。

AWS によって管理されるルールの追加を選択し、security groupで検索します。ec2-security-group-attached-to-eni-periodicというルールを選択し次へ。

今回は定期的に評価するルールを選択していますので頻度を設定し次へ進み、そのままルールを追加まで完了します。

ルールを追加してしばらくすると評価が実行され、使用されていないセキュリティグループが「非準拠」として表示されます。

なお、このルールでは「EC2のENI」にアタッチされていないセキュリティグループが対象となります。VPC LambdaやEFS、VPCエンドポイントなどEC2以外のサービスでENIにアタッチされている(使用されている)セキュリティグループも非準拠として判定されてしまいます。

この後、これらのリソースに対して自動削除の設定を行いますが、ENIにアタッチされているセキュリティグループは「失敗」となり結果的には削除されません。

「うーん、それはちょっと許容できない」という方は残念ながらココでお別れになります。ここまで読んでくださってありがとうございます!

検証環境などで「結果的に削除されないならいいか」と思える場合はこのままお進みください。

IAMロールの作成

セキュリティグループの削除はAWS Configルールの修復アクションを利用します。

Configルールの修復アクションはAWS Systems Managerのオートメーションによって実行されますので、Systems Managerに対して信頼ポリシーを設定したIAMロールを作成します。

このIAMロールに自動修復アクションの実行に必要な権限(今回はセキュリティグループの削除など)をIAMポリシーで与えます。

AWSマネージドな修復アクションで必要とされる権限は、各アクションのドキュメントに記載されていますのでご確認ください。

IAMポリシー

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ssm:StartAutomationExecution",
                "ssm:GetAutomationExecution",
                "ec2:DescribeSecurityGroups",
                "ec2:DeleteSecurityGroup"
            ],
            "Resource": "*"
        }
    ]
}

IAMロールの信頼ポリシー

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "",
            "Effect": "Allow",
            "Principal": {
                "Service": "ssm.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}

自動修復アクションの設定

それでは非準拠のリソース(使用されていないセキュリティグループ)を自動削除するために修復アクションを設定していきます。

先ほど追加したConfigルールを選択し、右上の[アクション]-[修復の管理]を開きます。

修復方法は自動修復を選択します。手動修復の場合は対象リソースを個々に指定して実行する必要がありますので一括削除のようなことが出来ません。

今回はAWSマネージドな修復アクション「AWSConfigRemediation-DeleteUnusedSecurityGroup」を利用します。

[リソースIDパラメータ]を指定することで非準拠のリソースIDを、修復アクションのパラメータとして渡すことができます。

今回はセキュリティグループの削除に必要なGroupIdを選択します。すると[パラメータ]のGroupIdの値がRESOURCE_IDとして登録されます。

さいごに先ほど作成したIAMロールのARNをAutomationAssumeRoleに設定し、変更を保存します

いざ断捨離!

定期実行にしているので基本的には次の再評価のタイミングで自動削除されるとはおもいますが、せっかちな私は今すぐ削除したいので手動で再評価を実行します。

しばらくして画面を更新するとアクションが正常に実行されていることが確認できます。

先述のとおり、EC2以外で利用されているセキュリティグループについてはアクションの実行失敗という形になっていますので、削除はされていません。

これで実際に利用されているセキュリティグループだけが残りましたので断捨離成功です!

スッキリ。

まとめ

  • AWS Configのマネージドルールで使用していないセキュリティグループを検出
    • EC2で使用されていないセキュリティグループが検出される
    • EC2以外のサービスで利用しているセキュリティグループは非準拠リソースとしてカウントされてしまう
    • ENIにアタッチされているセキュリティグループは結果的には削除されない(失敗する)
    • Defaultセキュリティグループは使用してなくても非準拠リソースとして検出されません
  • AWS Configの自動修復アクションはAWS Systems Managerのオートメーションで実行される
  • AWS マネージドな修復アクションを利用するのでお手軽(ノーコード)
  • そもそも普段からセキュリティグループちゃんと整理しなさい