Commutty IT
hrsw
Follow
17時間前公開
・17時間前更新
・0 pv
・2 min read
VPCに配置したLambdaを非VPCに変更した際にCodeBuildエラーが発生した件
AWS
Lambda
vpc
eni
デプロイ中にエラー発生
VPCに配置していたLambdaを非VPCとして再デプロイを行ったのですが、CodeBuild中にエラーが発生。 Lambdaの設定についてはtemplate.yamlにて定義していました。
原因はENI(Elastic Network Interface)が残っていたことにより、セキュリティグループの削除が出来なかったことでした。
ENI(Elastic Network Interface)とは
AWSのEC2やLambdaがVPCに接続するために使う仮想ネットワークカード(NIC)のようなもの。
特徴:
複数のENIが作れる
1つのEC2インスタンスに複数のENIを割り当てることができる
通常、Lambdaには1つだけ自動的にアタッチされる
VPCとSubnetに紐づく
ENIはどのサブネットに存在するかを明確に持っており、VPCの範囲内で使われる
セキュリティグループを持つ
ENIにはセキュリティグループが設定されており、通信の制御が可能
独立したリソース
ENI自体は独立したAWSリソースなので、EC2やLambdaを削除しても「すぐには削除されない」ことがある
今回原因となったのは4です。
Lambda を VPC に配置すると、実行時に AWS によって自動的に Elastic Network Interface(ENI)が作成され、VPC に接続されます。
この ENI は Lambda の削除直後には即時削除されないことがあり、CloudFormation による再デプロイやリソース削除の際に、「セキュリティグループが ENI によって使用中」というエラーで処理が失敗する原因となります。
セキュリティグループ削除エラーの回避策
パターン 1: デプロイを2段階に分ける
ステップ1
Lambda 関数の VpcConfig を削除し、非VPC構成に変更
※ この時点では SG や Subnet は残す
ステップ2(数分〜数十分後)
SG や VPC 関連リソースを手動削除する
パターン 2: SG を別スタックで管理する
SG や Subnet など VPC 関連リソースをLambda本体とは別の CloudFormation Stack で管理します。
StackA: VPC, Subnet, SecurityGroup(ネットワーク層)
StackB: Lambda 関数(アプリ層)パターン 2: SG を別スタックで管理する
リリース中に発生して焦りましたが、結構遭遇する状態みたいです。
今後は気をつけたいと思います。
Discussion
コメントにはログインが必要です。