はじめに
AWSの運用として、「このLambda使わなくなったから削除してー」と言われ、
リソースの削除後に、使われなくなったSecurityGroup(以下SG)も削除する。
というのはよくある運用かと思います。
その際に、SGが削除できない、正確にはLambdaのENIが自動で削除されなくて困った
という話になります。
なにが起きたか
① VPC内のLambdaを削除
② Lambdaの実行ロールを削除
③ LambdaのSGを削除するために、
念の為、削除対象のSGがネットワーク・インターフェースにアタッチされていないか確認。
→あれ、まだ使われてるな…(削除したLambdaのENIが削除されていない)
時間かかってるだけかな、、明日になって確認してみるか。。
→翌日、まだアタッチされている。SGの削除を試みるも、もちろんネットワーク・インターフェースにアタッチされているため削除できない旨のエラーがでる。
原因
EC2などと同様に、Lambdaも削除後、使用していたENIも自動的に削除されるはずだが、
その際に、Lambdaの実行ロールを使用しているため、ENIの自動削除が終わる前に、
実行ロールを削除してしまうと自動で削除されなくなってしまうとのこと。
ネットワークインターフェイスが表すリソースを削除すると、Lambda はネットワークインターフェイスをデタッチおよび削除します。使用されていないネットワークインターフェイスを削除するために、Lambda サービスはネットワークインターフェイスを作成した関数の実行ロールを使用します。
なので、上記の手順でいうと、②で実行ロールを消したのが早すぎて、
ENIの自動削除がされなかったと。(ちなみにENIの自動削除は最大で20分程度らしいです)
対処
シンプルにENIを手動で削除してあげれば大丈夫でした。
上記の、AWSのリンクに、「Lambda ENI Finder」なるもので、
ネットワーク・インターフェースがLambdaに使われていないか確認できるそうですが、
今回の場合は、
① ネットワーク・インターフェースの画面でSG IDで検索
② 削除されるはずだったENIが出てくる。
③ 状態が「Available」であることを確認。
④ 対象のENIを「アクション」から削除。
→このときに「Avalable」じゃない(どこかで使用されている)ときは削除できません。
⑥ 無事、LambdaについていたSecurityGroupが削除可能に。
おわりに
ENIってほとんど自動で削除されるので、意外と手動で削除したことなくて嫌だなーって
人も多いかと思うので、そんな方は是非スピードにとらわれず、VPC Lambdaを削除した後は
SGの削除行ってから、実行ロールの削除をするようにすれば良いかなと思います!