Comment créer une nouvelle version d'une fonction Lambda à l'aide de CloudFormation?
Je suis en train de créer une nouvelle version d'une fonction Lambda à l'aide de CloudFormation.
Je veux avoir plusieurs versions de la même fonction Lambda, je peux donc (un) point d'alias à différentes versions - comme DEV et PROD - et (b) être en mesure de revenir à une version antérieure
C'est la définition de mon Lambda version:
LambdaVersion:
Type: AWS::Lambda::Version
Properties:
FunctionName:
Ref: LambdaFunction
Une version est créée lors de l'exécution de "aws cloudformation créer de la pile" mais le "aws cloudformation mise à jour de la pile des" commandes ne rien faire. Il n'y a pas de nouveaux Lambda versions créées.
Je vais essayer d'obtenir une nouvelle version de la fonction Lambda créé après j'ai télécharger un nouveau fichier zip pour S3 et puis "mise à jour de la pile". Puis-je le faire avec CloudFormation? AWS::Lambda::Version vraiment cassé (comme mentionné ici https://github.com/hashicorp/terraform/issues/6067#issuecomment-211708071) ou suis-je tout simplement pas obtenir quelque chose?
Mise à jour 1/11/17
Réponse officielle d'Amazon de soutien:
"...pour une nouvelle version à être publié, vous devez définir un plus (sic) AWS::Lambda::Version de ressources..."
AWS CloudFormation/Lambda de l'équipe, si vous êtes en train de lire ceci - cela est inacceptable. Fix it.
Vous devez vous connecter pour publier un commentaire.
AWS::Lambda::Version n'est pas utile. Vous devez ajouter une nouvelle ressource pour tous les Lambda version. Si vous souhaitez publier une nouvelle version pour chaque Cloudformation mise à jour, vous avez à pirater le système.
J'ai résolu ce problème en créant un Lambda adossés à des ressources personnalisées qui est déclenchée pour chaque déploiement. À l'intérieur de cette Lambda, je suis entrain de créer une nouvelle version de la fonction Lambda donné en paramètre.
Pour le Lambda de la source vous pouvez vérifier http://serverless-arch-eu-west-1.s3.amazonaws.com/serverless.zip
Voici l'exemple Cloudformation à l'aide de ce Déploiement d'une fonction Lambda (Vous pourriez avoir besoin de quelques modifications):
(Avertissement: Ce code est une partie de mon livre, pour plus d'informations sur les Lambda & API Gateway, vous pouvez vérifier: https://www.amazon.com/Building-Serverless-Architectures-Cagatay-Gurturk/dp/1787129195)
HERE_DEFINE_YOUR_LAMBDA
? Ce n'est pas la réelle fonction Lambda code, c'est quoi?J'en ai un similaire de cas d'utilisation (besoin d'utiliser CloudFormation pour gérer une fonction lambda pour être utilisé @edge dans CloudFront, pour lesquelles une fonction lambda version est toujours nécessaire, pas
$LATEST
) et mes recherches m'a débarqué à cette première question, mais après un peu plus de creuser, j'ai été heureux de trouver qu'il y a maintenant un support natif pour les lambda automatique contrôle de version avec la nouvelleAutoPublishAlias
fonction de l'AWS sans serveur d'Application de Modèle (en gros, une option de jeu supplémentaire de niveau supérieur constructions pour votre CloudFormation modèles).Annoncé ici: https://github.com/awslabs/serverless-application-model/issues/41#issuecomment-347723981
Pour plus de détails voir:
Essentiellement vous d'inclure
AutoPublishAlias
dans votreAWS::Serverless::Function
définition:Et puis ailleurs dans le modèle CloudFormation vous pouvez faire référence à la dernière version publiée
!Ref MyFunction.Version
(syntaxe yaml).La
AWS::Lambda::Version
ressources ne représente qu'un seul publié Lambda fonction de la version, il ne sera pas publier automatiquement les nouvelles versions à chaque mise à jour de votre code. Pour ce faire, vous disposez de deux options:1. Ressources personnalisées
Vous pouvez implémenter votre propre Ressources Personnalisées que les appels
PublishVersion
sur chaque mise à jour.Pour cette approche, vous aurez toujours besoin de modifier au moins un Paramètre à chaque fois que vous mettez à jour votre pile, afin de déclencher une mise à jour sur la Ressource Personnalisée qui va déclencher le PublishVersion action. (Vous n'aurez pas à effectivement de mettre à jour le modèle, cependant).
Voici un plein, travail exemple:
2. Modèle de préprocesseur
Vous pouvez utiliser un modèle de préprocesseur comme embedded Ruby (ou juste une mise à jour manuelle de votre modèle sur chaque déployer) de publier une nouvelle Version à chaque mise à jour de votre code en changeant la
AWS::Lambda::Version
de la ressource ID logique à chaque fois que votre code est mis à jour.Exemple:
Pour créer/mettre à jour la pile en passant
template.yml
par le biais de laerb
modèle de préprocesseur, exécutez:Code:
). J'ai des erreurs.A version for this Lambda function exists ( 1 ). Modify the function to create a new version
Réponse mis à jour pour le mois de février 2018
Vous pouvez utiliser AWS SAM (sans serveur d'Application Modèle), et son
sam package
etsam deploy
commandes pour mettre à jour Lambda. Ils sont semblables àaws cloudformation package
etaws cloudformation deploy
commandes, mais aussi vous permettre de mettre à jour Lambda versions automatiquement.SAM pouvez compresser votre code (ou prendre le package ZIP que vous avez créé autrement), de la télécharger à S3, et de mettre à jour le
$LATEST
Version de la Lambda d'elle. (Si c'est tout ce dont vous avez besoin, cela peut aussi être fait avecaws cloudformation
, sans SAM; les exemples de code sont les mêmes que ci-dessous, mais seulement d'utiliserCloudFormation
's standard déclarations). Puis, avec SAM, si configuré en conséquence, vous pouvez également publier automatiquement une Version et mise à jour d'un Alias pour pointer vers elle. Il peut aussi, éventuellement, utiliser AWS CodeDeploy de passer progressivement de la circulation de la Version précédente à nouveau, et la restauration en cas d'erreurs. Tout ceci est expliqué dans Coffre-fort Lambda déploiements.Techniquement, l'idée est que chaque mise à jour de la pile, vous avez besoin de votre
AWS::Lambda::Function
'sCode
pour pointer vers le nouveau paquet dans S3. Cela permettra d'assurer que lorsque vous mettez à jour la pile, Lambda $DERNIÈRE version sera mise à jour à partir du nouveau paquet. Ensuite, vous pouvez également automatiser la publication de la nouvelle Version de commutateur et un Alias.Pour, créer un SAM modèle, qui est semblable à un sur-ensemble de) modèle CloudFormation. Il peut inclure des SAM-déclarations spécifiques, comme celui de la
AWS::Serverless::Function
ci-dessous. Point leCode
de répertoire de code source (ou préemballés ZIP), et de définir laAutoPublishAlias
propriété.Exécuter:
Nos paquets source le contenu d'un répertoire en tant que ZIP (si
Code
n'est pas un ZIP déjà), le télécharge sur S3 en vertu de la nouvelle générée automatiquement la clé, et génère final CloudFormation modèle àpackaged.yaml
, mettre de la bonneCode
de référence en elle; comme ceci:Maintenant, vous pouvez utiliser généré
packaged.yaml
avec SAM, pour créer la fonction de la Version:Ceci mettra à jour Lambda
$LATEST
version, et, siAutoPublishAlias
a été défini, de publier une nouvelle Version et mise à jour de l'Alias pour pointer vers la nouvelle Version publiée.Voir le exemples de SAM dépôt GitHub complet d'un modèle de code.
$LATEST
. Il va pas ajouter une version de la fonction lambda.La recherche de quelque chose de similaire qui fonctionne avec les Lambda fonctions déployées à partir de S3.
Mon cas d'utilisation: le
Pas satisfait de cela, j'ai cherché une alternative et suis tombé sur cette question.
Aucune des réponses exactement travaillé pour moi, donc j'ai pris quelques idées et adapter les réponses ici et fait ma propre version écrite en Python.
Ce code est une adaptation de la réponse de @wjordan sorte de crédit à lui pour l'idée et la réponse originale à cette question. Les différences sont:
Vous avez besoin d'un nonce paramètre. Vous modifiez la valeur de ce paramètre lorsque le code a besoin d'être réédité pour Lambda. Ceci est pour s'assurer que cloudformation mise à jour de votre ressource personnalisée. Quand la coutume de ressources est mis à jour, il va exécuter le code Python qui en fin de compte les mises à jour de votre Lambda code.
Espère que cela aide quelqu'un.
Malheureusement, ce n'est pas possible de le faire à l'aide d'aws CloudFormation. Vous aurez besoin d'ajouter de nouveaux
AWS::Lambda::Version
sections dans votre modèle CloudFormation pour chaque version.Le plus proche de la solution serait de créer .erb modèles et de faire générer des CloudFormation modèles avec toutes les versions.
paquet avec la version que celui de la Formation des Nuages paramètres, par exemple
"LambdaPakcageNameWithVersion";
"LambdaPakcageNameWithVersion" que le Lambda code s3 clé;
Lamdba colis sera déployé lors de l'exécution de l'aws-cli de commande à
mise à jour le cloudformation de la pile ou de l'exécution de CI/CD pipeline.
JS: