Elastic Network Interfaceが削除できなくて困った時にLambda ENI Finderを利用した話

2020.08.25

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは!DA(データアナリティクス)事業本部 インテグレーション部の大高です。

最近CloudFormationを利用して開発しているシステムで、スタックを削除しようとしたところElastic Network Interface(ENI)の削除ができないことが原因でエラーが発生してしまいました。通常であればこんな問題は起きないのですが、このスタックは開発中に色々とイレギュラーな操作を行ったためエラーが起きてしまっていました。

対処をするために色々行ったので、まとめてみたいと思います。

現状の確認

CloudFormationではサブネットの削除を行う箇所でエラーが発生していたので、管理コンソールから手動で削除を試してみます。

「ネットワークインターフェイスを消せばよいのか」ということでリンクをクリックして利用しているENIを削除しにいきます。利用中なので強制デタッチしてみます。

怒られました…。「You are not allowed to manage 'ela-attach' attachments.」というエラーが出ていますね。

エラーメッセージを元に情報を探していると、こちらの記事に辿り着きました。

Descriptionはちゃんと読もう!エンジニアとの約束だぞ!

「こ、これだ…!」ということでちゃんとDescriptionを確認すると、この子は「Lambda VPCのENI」でした。

「Lambdaから外してあげれば良さそうだな」と思うのですが、いかんせん私の環境では大量のLambdaがあって一つ一つ調べるわけにもいきません。どうしたものかと調べていると、以下のナレッジが見つかりました。

現在ネットワークインターフェイスを使用している関数または関数バージョンを特定するには、Lambda ENI Finder を使用します。

まさに今欲しいのは、この「Lambda ENI Finder」っぽいです。ということで試してみます。

環境の準備

手順をみると「AWS CLIを利用する」、「LambdaとENIへのアクセス許可が必要」ということが書かれているので、今回は手っ取り早い方法としてEC2インスタンスを立ち上げてみました。

インスタンスは「Amazon Linux 2」の「t3.nano」を利用しました。

Lambda ENI Finder の実行

準備が出来たので、EC2インスタンスにSSHで接続してナレッジに記載されている手順通りに進めてみます。

jqのインストール

yumでインストールするだけなので問題ないですね。

$ sudo yum install jq -y     
(略)
Complete!

gitのインストール

こちらも同様です。

$ sudo yum install git -y  
(略)
Complete!

aws-support-tools リポジトリのクローン

gitを利用してcloneします。

$ git clone https://github.com/awslabs/aws-support-tools.git
Cloning into 'aws-support-tools'...
remote: Enumerating objects: 31, done.
remote: Counting objects: 100% (31/31), done.
remote: Compressing objects: 100% (31/31), done.
remote: Total 1515 (delta 12), reused 3 (delta 0), pack-reused 1484
Receiving objects: 100% (1515/1515), 1.07 MiB | 1.21 MiB/s, done.
Resolving deltas: 100% (537/537), done.

ディレクトリ移動

ツールのディレクトリまで移動します。

$ pwd
/home/ec2-user
$ cd aws-support-tools/Lambda/FindEniMappings
$ pwd
/home/ec2-user/aws-support-tools/Lambda/FindEniMappings

Lambda ENI Finderの実行

削除したENIのIDとregionを指定してツールを実行します。今回の例だとeni-0f1045497bb8b7a81ap-northeast-1になります。

$ ./findEniAssociations --eni eni-0f1045497bb8b7a81 --region ap-northeast-1
This script is for determining why an ENI that is managed by AWS Lambda has not been deleted.

Found eni-0f1045497bb8b7a81 with subnet-0973291538f27fd4c using Security Groups sg-0427e74e276c8f8f8
Searching for Lambda function versions using subnet-0973291538f27fd4c and Security Groups sg-0427e74e276c8f8f8...

The following function version(s) use the same subnet and security groups as eni-0f1045497bb8b7a81. They will need to be disassociated/deleted before Lambda will clean up this ENI:
arn:aws:lambda:ap-northeast-1:012345678900:function:dev-api-A:$LATEST
arn:aws:lambda:ap-northeast-1:012345678900:function:dev-api-B:$LATEST
(略)
arn:aws:lambda:ap-northeast-1:012345678900:function:dev-api-Y:$LATEST
arn:aws:lambda:ap-northeast-1:012345678900:function:dev-api-Z:$LATEST

でました。結構なLambdaの数があり、全部で48個ありました!

ネットワークインターフェイスの削除

さて、ここからが本題です。

LambdaのVPC設定変更

  1. Lambda ENI Finder がリストした各未発行の Lambda 関数 ($LATEST バージョン) について、Amazon VPC 設定を変更して、異なるサブネットとセキュリティグループを使用します。または、Amazon VPC から機能を完全に切断することもできます。

と書いてあります。これはどういうことなのか、実際のLambdaの画面から確認してみます。

LambdaのVPC設定を見るとこのようになっていますね。これを切り離せば良さそうです。「編集」ボタンをクリックします。

VPC接続を「なし」にすれば切り離せそうです。

エラーになりました…。

このLambdaはEFSを利用しているのですが、先にEFSのアクセスポイントが削除されている状態になってしまっているのでエラーになるようです。Lambdaの画面にもエラーが出ていました。

いきなり手詰まり感があるのですが、幸いこのLambdaはもう利用しないので削除してみます。

削除はできるようです!

ということで、先程一覧出力されたLambda関数をCLIでサクッと消しちゃいましょう。削除は以下のコマンドでいけそうです。

今回はちゃちゃっと先程のLambda ENI Finderで出力されたLambdaの一覧をテキストエディタで編集して、シェルスクリプトとして流してしまいます。(1つ目のLambdaは先程手動で削除したのでコメントアウトします)

delete-lambda.sh

#/bin/bash

#aws lambda delete-function --region ap-northeast-1 --function-name dev-api-A
aws lambda delete-function --region ap-northeast-1 --function-name dev-api-B
(略)
aws lambda delete-function --region ap-northeast-1 --function-name dev-api-Y
aws lambda delete-function --region ap-northeast-1 --function-name dev-api-Z

実行権限を付与して流します。

$ chmod 755 delete-lambda.sh
$ ./delete-lambda.sh

完了したら、再度Lambda ENI Finderで確認してみます。

$ cd aws-support-tools/Lambda/FindEniMappings
$ ./findEniAssociations --eni eni-0f1045497bb8b7a81 --region ap-northeast-1
This script is for determining why an ENI that is managed by AWS Lambda has not been deleted.

Found eni-0f1045497bb8b7a81 with subnet-0973291538f27fd4c using Security Groups sg-0427e74e276c8f8f8
Searching for Lambda function versions using subnet-0973291538f27fd4c and Security Groups sg-0427e74e276c8f8f8...

No Lambda functions or versions found that were using the same subnet as this ENI.
If this ENI is not deleted automatically in the next 24 hours then it may be 'stuck'. If the ENI will not allow you to delete it manually after 24 hours then please contact AWS support and send them the output of this script.

Lambdaが一覧から消えましたね。

ENIは24時間待つと自動で消えるようですが、コンソール画面から見てみると既にデタッチされている状態で「削除」できそうなので試してみます。

これで削除ができました!!!

まとめ

以上、Elastic Network Interfaceが削除できなくて困った時にLambda ENI Finderを利用した話でした。ENIから利用しているLambdaを特定したい場合に、とても便利なツールだと思います。

どなたかのお役に立てば幸いです。それでは!