Closed6

Serverless+Cognito で設定していたLambda triggers が消えていた

mosimosi

AWS Cognito Custom Authentication を開発していたところ、Client からのInitiateAuth に対し
Custom auth lambda trigger is not configured for the user pool.
とのエラーが返ってきた。

なんのこっちゃとUserPool を見に行くと、確かに設定されていたLambda triggers が消えている。

mosimosi

serverless.yml のfunctions はこんな感じで、events にcognitoUserPool を指定するとsls はデフォルトでは新規にUserPool を作成するが、exitsting: true を指定することでResources に記載したUserPool に対してtrigger を設定できるようになる。

functions:
  defineAuthChallenge:
    handler: src/bin/define_auth_challenge
    events:
      - cognitoUserPool:
          pool: ${self:custom.userPoolName}
          trigger: DefineAuthChallenge
          existing: true
  createAuthChallenge:
    handler: src/bin/create_auth_challenge
    events:
      - cognitoUserPool:
          pool: ${self:custom.userPoolName}
          trigger: CreateAuthChallenge
          existing: true
  verifyAuthChallenge:
    handler: src/bin/verify_auth_challenge
    events:
      - cognitoUserPool:
          pool: ${self:custom.userPoolName}
          trigger: VerifyAuthChallengeResponse
          existing: true
mosimosi

原因として思い当たる節はUserPool のProperties でPasswordPolicy を変更したことくらい。
UserPool が上書きされてtrigger の設定が消えてしまった?と予想しつつ検索してみるとちょうどissue が見つかった。
https://github.com/serverless/serverless/issues/9635

mosimosi

In order to attach triggers to UserPool we're using CustomResources in CloudFormation, which underneath uses SDK calls to update to UserPool directly. However, when a UserPool changes (e.g. you add a new property in schema) it is updated by CloudFormation and clears the previously set triggers and as the inputs to CustomResource are static, update hook of that CustomResource is not triggered which means the triggers won't be re-esablished.

とのこと。
forceDeploy のオプションを追加して解決するとのことで、幸運なことに先日merge されていた。
https://github.com/serverless/serverless/pull/10435

mosimosi

ということで

    events:
      - cognitoUserPool:
          pool: ${self:custom.userPoolName}
          trigger: DefineAuthChallenge
          existing: true
          forceDeploy: true

のように試したところfunctions がdeployされて UserPool のtrigger にも設定されていた。
contributor の皆様ありがとうございます。

このスクラップは2022/03/17にクローズされました