Edited at

DynamoDB LocalとCognitoを併用する場合の注意点

More than 1 year has passed since last update.


先に結論

DynamoDB LocalとCognitoを併用する場合は、必ず別々のendpointを定義する。

特にCognito側のendpointを書く事例はほとんど見かけないので忘れがち。


utils/auth.js

import AWS from 'aws-sdk'

const cognitoIdentityServiceProvider = new AWS.CognitoIdentityServiceProvider({
apiVersion: '2016-04-18',
region: 'ap-northeast-1',
endpoint: `https://cognito-idp.ap-northeast-1.amazonaws.com/`,
})

export default function auth(AccessToken) {
return new Promise((resolve, reject)=>{
cognitoIdentityServiceProvider.getUser({AccessToken}, (err, data)=>{
if (err) return reject(err)
return resolve(data)
})
})
}



utils/dynamoose.js

import dynamoose from 'dynamoose'

dynamoose.AWS.config.update({region:'ap-northeast-1'})
if ( process.env.NODE_ENV === 'dev' ) {
dynamoose.AWS.config.endpoint = new dynamoose.AWS.Endpoint('http://localhost:8000')
}
export default dynamoose



前提


  • 今回のケースではNode.jsのdynamooseというORMを使っているが、その他のケースでも発生する可能性があるので念のためメモ。

  • ServerlessFrameworkを使用しているが、それは今回の件とは関係ないはず?


経緯


  • ServerlessFrameworkのプラグイン serverless-dynamodb-local を使って、DynamoDB Localを起動し、Cognitoでユーザー管理をしようとした

  • アプリケーションを実行すると、1度目は成功するが2度目で必ず下記エラーが出ることに気づいた

MissingAuthenticationToken: Request must contain either a valid (registered) AWS access key ID or X.509 certificate.


  • AccessTokenが間違えてるのかなと思ったが合ってた

  • リージョン指定が間違えてるのかなと思ったが合ってた

  • DynamoDBの向き先をローカルではなく本番に向けたらエラーが出なかった

  • 向き先をローカルに戻して、CognitoのSDK側にendpointを指定したらエラーが出なかった


推察


  • 恐らくCognito User Poolは内部でDynamoDBを使っていて、DynamoDBのendpointを変えるとCognitoのSDK側にも影響を及ぼしてしまうのではないか?

  • このあたり詳しい人、もしくは中の人、今回の件について何かあれば教えてもらえたら嬉しいです