Dans Serverless, je crée une ressource CFN AWS::Lambda::Permission
qui permet à Cognito d'appeler un gestionnaire Lambda de message personnalisé .
AWS::Lambda::Permission
dépend du lambda. Comment puis-je m'assurer que le lambda est créé en premier?
J'ai déjà essayé d'ajouter une propriété DependsOn
à la ressource CFN AWS::Lambda::Permission
sans succès.
Voici ma ressource CFN qui tente d'ajouter des autorisations à Cognito pour appeler un lambda:
UserPoolLambdaInvokePermission: Type: AWS::Lambda::Permission DependsOn: CognitoCustomMessageLambdaFunction ... ....
Voici à quoi ressemble mon lambda dans mon serverless.yml
:
UserPoolLambdaInvokePermission: Type: AWS::Lambda::Permission DependsOn: arn:aws:lambda:${self:provider.region}:#{AWS::AccountId}:function:${self:service}-${self:provider.stage}-cognitoCustomMessage ... ....
Voici ce que fait mon lambda à un niveau très basique:
cognitoCustomMessage(event, next) { if (event.triggerSource === 'CustomMessage_ForgotPassword') { // do stuff } return next(null, event); }
L'erreur que je reçois de ce qui précède est:
Une erreur s'est produite: CognitoCustomMessageLambdaFunction - Fonction non trouvée: arn: aws: lambda: us-west-2: 1234567890: my-service-dev-cognitoCustomMessage (Service: AWSLambdaInternal; Code d'état: 404; Code d'erreur: ResourceNotFoundException; ID de demande: e2a98525 -5090-4d0f-a1f5-20610474f93b).
Si j'ajoute un DependsOn
:
cognitoCustomMessage: handler: src/main/lambdas/users_handler.cognitoCustomMessage
L'erreur que je reçois d'en haut est:
Le modèle CloudFormation n'est pas valide: Erreur de format de modèle: DependsOn doit être une chaîne ou une liste de chaînes.
J'ai également essayé:
UserPoolLambdaInvokePermission: Type: AWS::Lambda::Permission Properties: Action: lambda:invokeFunction Principal: cognito-idp.amazonaws.com FunctionName: arn:aws:lambda:${self:provider.region}:#{AWS::AccountId}:function:${self:service}-${self:provider.stage}-cognitoCustomMessage SourceArn: arn:aws:cognito-idp:${self:provider.region}:#{AWS::AccountId}:userpool/${self:provider.environment.USER_POOL_ID}
L'erreur que je reçois d'en haut est:
Une erreur s'est produite: CognitoCustomMessageLambdaFunction - Fonction introuvable: arn: aws: lambda: us-west-2: 1234567890: my-service-dev-cognitoCustomMessage (Service: AWSLambdaInternal; Code d'état: 404; Code d'erreur: ResourceNotFoundException; ID de demande: b888ae82 -a0d7-4d69-888e-9e63027925c1).
Je pense qu'il devrait y avoir une méthode pour créer une fonction lambda avant que la ressource CFN ait besoin de l'utiliser, mais cela ne semble pas être le cas avec DependsOn
.
3 Réponses :
L'attribut DependsOn doit avoir le nom logique de la fonction Lambda dans le modèle de formation Cloud et non l'ARN de la fonction Lambda. Par exemple, si le nom logique de votre fonction Lambda dans le modèle Cloud Formation est MyLambda, DependsOn devrait ressembler à ceci:
UserPoolLambdaInvokePermission: Type: AWS::Lambda::Permission DependsOn: MyLambda
Je crée ma fonction lambda dans serverless.yml
. J'ai mis à jour le message d'origine avec ce qui se passe si je remplace DependsOn
par l'ID logique du lambda.
Pouvez-vous partager un extrait de votre fonction lambda avec la ressource d'autorisation? D'après ce que je vois, vous avez nommé lambda "cognitoCustomMessage" et dans DependsOn vous avez écrit "CognitoCustomMessageLambdaFunction".
La propriété "DependsOn" fonctionne. Le problème que j'obtenais était lié au fait que j'avais supprimé mon lambda auparavant. Par conséquent, SLS / CFN exécutera un processus de mise à jour et pensera toujours qu'il est là. Le simple fait de changer le nom de la fonction lambda / le nom de l'identifiant logique l'a fait fonctionner.
Votre fonction définie dans serverless.yml est convertie en une ressource cloudformation sous le capot. La ressource s'appelle XLambdaFunction où X = Le nom de votre fonction avec la première lettre en majuscule.
Donc si vous avez:
DependsOn: CognitoCustomMessageLambdaFunctionLambdaFunction
Vous pouvez référencer:
DependsOn: HelloLambdaFunction
Je ne peux que supposer que si votre fonction est déjà nommée CognitoCustomMessageLambdaFunction
vous devrez référencer:
functions: hello: handler: handler.hello ...other function stuff...
J'ai rencontré un problème similaire, l'ajout de la clé dependOn a fonctionné pour moi.
Vous devez inclure la déclaration de base de la fonction Lambda dans votre message.
@jarmod j'ai ajouté un petit extrait de mon lambda