Serverless+Cognito で設定していたLambda triggers が消えていた
AWS Cognito Custom Authentication を開発していたところ、Client からのInitiateAuth に対し
Custom auth lambda trigger is not configured for the user pool.
とのエラーが返ってきた。
なんのこっちゃとUserPool を見に行くと、確かに設定されていたLambda triggers が消えている。
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
原因として思い当たる節はUserPool のProperties でPasswordPolicy を変更したことくらい。
UserPool が上書きされてtrigger の設定が消えてしまった?と予想しつつ検索してみるとちょうどissue が見つかった。
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 されていた。
ということで
events:
- cognitoUserPool:
pool: ${self:custom.userPoolName}
trigger: DefineAuthChallenge
existing: true
forceDeploy: true
のように試したところfunctions がdeployされて UserPool のtrigger にも設定されていた。
contributor の皆様ありがとうございます。
なお、VSCode のServerless IDEでは未対応なのでlinter が指摘してきますが仕方ない。