Ccmmutty logo
Commutty IT
0 pv2 min read

VPCに配置したLambdaを非VPCに変更した際にCodeBuildエラーが発生した件

https://picsum.photos/seed/b80cba1b45f94c8ca4b1f4f531dffe20/1200/630

デプロイ中にエラー発生

VPCに配置していたLambdaを非VPCとして再デプロイを行ったのですが、CodeBuild中にエラーが発生。 Lambdaの設定についてはtemplate.yamlにて定義していました。
原因はENI(Elastic Network Interface)が残っていたことにより、セキュリティグループの削除が出来なかったことでした。

ENI(Elastic Network Interface)とは

AWSのEC2やLambdaがVPCに接続するために使う仮想ネットワークカード(NIC)のようなもの。
特徴:
  1. 複数のENIが作れる
    • 1つのEC2インスタンスに複数のENIを割り当てることができる
    • 通常、Lambdaには1つだけ自動的にアタッチされる
  2. VPCとSubnetに紐づく
    • ENIはどのサブネットに存在するかを明確に持っており、VPCの範囲内で使われる
  3. セキュリティグループを持つ
    • ENIにはセキュリティグループが設定されており、通信の制御が可能
  4. 独立したリソース
    • 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

コメントにはログインが必要です。