先に結論
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側にも影響を及ぼしてしまうのではないか?
- このあたり詳しい人、もしくは中の人、今回の件について何かあれば教えてもらえたら嬉しいです