2
votes

Comment "DependsOn" une fonction Lambda à partir d'une ressource CFN?

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 .


2 commentaires

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


3 Réponses :


4
votes

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 


3 commentaires

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.



0
votes

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...


0 commentaires

0
votes

J'ai rencontré un problème similaire, l'ajout de la clé dependOn a fonctionné pour moi.


0 commentaires