web-dev-qa-db-fra.com

Lambda dans la suppression de VPC prend plus de temps

J'ai créé une pile qui lambda dans VPC en utilisant la formation de nuages. Lorsque j'essaie de supprimer la pile entière, cela prend 40 à 45 minutes.

Mon rôle Iam a l'autorisation suivante:

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

Comment améliorer le temps de suppression de la pile?

15
Gowtham Chand

Lorsqu'une fonction Lambda s'exécute dans votre VPC, une interface réseau élastique (ENI) est créée afin de lui donner accès au réseau. Vous pouvez considérer une ENI comme une carte réseau virtuelle. Il a une adresse MAC et au moins une adresse IP privée, et est "branché" à toute ressource qui se connecte au réseau VPC et possède une adresse IP à l'intérieur du VPC (instances EC2, instances RDS, ELB, ALB, NLB, EFS, etc.).

Bien qu'il ne semble pas être explicitement documenté, ces interfaces telles qu'utilisées par Lambda semblent être mappées 1: 1 à des instances de conteneur, chacune hébergeant un ou plusieurs conteneurs, selon la taille de l'allocation de mémoire de chaque conteneur. L'algorithme utilisé par Lambda pour provisionner ces machines n'est pas documenté, mais il existe une formule documentée pour approximer le nombre que Lambda créera:

Vous pouvez utiliser la formule suivante pour déterminer approximativement les exigences ENI.

Projected peak concurrent executions * (Memory in GB / 3GB)

https://docs.aws.Amazon.com/lambda/latest/dg/vpc.htm

Cette formule suggère que vous verrez plus d'ENI si vous avez une concurrence élevée ou des empreintes mémoire importantes, ou moins d'ENI si aucune de ces conditions n'est vraie. (La raison de la limite de 3 Go semble être basée sur la plus petite instance que Lambda semble utiliser, en arrière-plan, qui est l'instance EC2 à usage général m3.medium. Vous ne pouvez pas les voir parmi vos instances EC2, et vous n'êtes pas facturé pour eux.)

Dans tous les cas, Lambda n'arrête pas les conteneurs ou leurs instances Host immédiatement après l'exécution de la fonction, car il pourrait en avoir besoin pour une réutilisation lors des appels ultérieurs, et puisque les conteneurs (et leurs instances Host) ne sont pas détruits immédiatement, ni les ENI associées . Cela serait inefficace. En tout état de cause, le retard est documenté:

Il y a un délai entre le moment où votre fonction Lambda s'exécute et la suppression ENI.

http://docs.aws.Amazon.com/lambda/latest/dg/vpc.html

Cela a du sens, lorsque nous considérons que les priorités de l'infrastructure Lambda devraient être axées sur la mise à disposition des ressources selon les besoins et leur maintien pour des raisons de performances d'accès rapide - donc la suppression des choses est une considération secondaire à laquelle le service s'occupe en arrière-plan.

Bref, ce délai est normal et attendu.

Vraisemblablement, CloudFormation a utilisé des balises pour identifier ces interfaces, car il n'est pas évident de savoir comment les distinguer autrement.

Les ENI sont visibles dans le volet de navigation de gauche de la console EC2 sous Network Interfaces, il est donc possible que vous puissiez les supprimer vous-même et accélérer le processus ... mais notez que cette action, en supposant que le système le permet, doit être entreprise avec la prudence requise - car si vous supprimez une ENI attachée à une instance de conteneur que Lambda essaie ensuite d'utiliser, Lambda ne saura pas que l'interface est manquante et la fonction expirera ou lancera une erreur au moins jusqu'à ce que Lambda décide de détruire l'instance de conteneur attachée.

20
Michael - sqlbot