1. honmaaax

    Posted

    honmaaax
Changes in title
+DynamoDB LocalとCognitoを併用する場合の注意点
Changes in tags
Changes in body
Source | HTML | Preview
@@ -0,0 +1,56 @@
+## 先に結論
+
+DynamoDB Localと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側にも影響を及ぼしてしまうのではないか?
+* このあたり詳しい人、もしくは中の人、今回の件について何かあれば教えてもらえたら嬉しいです