私は、クラウド形成を使用してVPCでラムダするスタックを作成しました。スタック全体を削除しようとすると、40〜45分かかります。
私のIamロールには次の権限があります。
Action:
- ec2:DescribeInstances
- ec2:CreateNetworkInterface
- ec2:AttachNetworkInterface
- ec2:DescribeNetworkInterfaces
- ec2:DeleteNetworkInterface
- ec2:DetachNetworkInterface
- ec2:ModifyNetworkInterfaceAttribute
- ec2:ResetNetworkInterfaceAttribute
- autoscaling:CompleteLifecycleAction
- iam:CreateRole
- iam:CreatePolicy
- iam:AttachRolePolicy
- iam:PassRole
- lambda:GetFunction
- lambda:ListFunctions
- lambda:CreateFunction
- lambda:DeleteFunction
- lambda:InvokeFunction
- lambda:GetFunctionConfiguration
- lambda:UpdateFunctionConfiguration
- lambda:UpdateFunctionCode
- lambda:CreateAlias
- lambda:UpdateAlias
- lambda:GetAlias
- lambda:ListAliases
- lambda:ListVersionsByFunction
- logs:FilterLogEvents
- cloudwatch:GetMetricStatistics
スタックの削除時間を改善するには?
Lambda関数がVPC内で実行されると、ネットワークアクセスを提供するためにElastic Network Interface(ENI)が作成されます。 ENIは仮想NICと考えることができます。 MACアドレスと少なくとも1つのプライベートIPアドレスがあり、VPCネットワークに接続し、VPC内にIPアドレスを持つすべてのリソースに「プラグイン」されている(EC2インスタンス、RDSインスタンス、ELB、ALB、NLB、EFS、等。)。
明示的に文書化されていないように見えますが、Lambdaによって使用されるこれらのインターフェイスは、各コンテナーのメモリ割り当てのサイズに応じて、それぞれが1つ以上のコンテナーをホストするコンテナーインスタンスに1対1でマッピングされているようです。 Lambdaがこれらのマシンのプロビジョニングに使用するアルゴリズムは文書化されていませんが、Lambdaが作成する数値をapproximatingの文書化された式があります。
次の式を使用して、ENI要件をおおよそ決定できます。
Projected peak concurrent executions * (Memory in GB / 3GB)
この式は、高い同時実行性または大きなメモリフットプリントがある場合、より多くのENIが表示されるか、またはこれらの条件のいずれにも該当しない場合、より少ないENIが表示されることを示唆しています。 (3GBの境界の理由は、Lambdaがバックグラウンドで使用していると思われる最小のインスタンスに基づいているようです。これはm3.medium汎用EC2インスタンスです。EC2インスタンス間でこれらを表示することはできず、課金されません。彼らのために。)
いずれにしても、Lambdaは関数の実行直後にコンテナーまたはそのホストインスタンスをシャットダウンしません。これは、後続の呼び出しでの再利用に必要になる可能性があるためです。また、コンテナー(およびそのホストインスタンス)はすぐに破棄されないため、関連付けられているENIも。そうすることは非効率的です。いずれにしても、遅延は文書化されています。
Lambda関数が実行されてからENIが削除されるまでには遅延があります。
これは、Lambdaインフラストラクチャの優先順位を、必要に応じてリソースを利用できるようにすること、および迅速なアクセスパフォーマンスの理由で利用できるようにすることに焦点を当てるべきであると考えると、理にかなっています。
つまり、この遅延は正常であり、予想されたものです。
おそらく、CloudFormationはタグを使用してこれらのインターフェースを識別していると思われます。
ENIはEC2コンソールの左側のナビゲーションペインのNetwork Interfaces
の下に表示されるため、これらを自分で削除してプロセスを早める可能性があります。ただし、このアクションは、システムで許可されている場合、実行する必要があることに注意してください。 Lambdaが後で使用しようとするコンテナーインスタンスに接続されているENIを削除すると、Lambdaはインターフェイスが欠落していることを認識せず、少なくともLambdaが決定するまで関数がタイムアウトまたはエラーをスローするためアタッチされたコンテナインスタンスを破棄します。