###前提・実現したいこと
こちらの記事を参考にAWS Lambda(Nodejs6.10)でRDS(MySQL5.7.16)へのIAM認証を試みましたが、
コネクション生成時にエラーになってしまっているようです。
私と同じくPython/Javaをnodejsに書き換えようとして上手く出来ていない方いらっしゃいますか?
###発生している問題・エラーメッセージ
・AWS Lambdaコンソールでテスト実施時の結果ログ
{ "errorMessage": "ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication protocol requested by server; consider upgrading MySQL client", "errorType": "Error", "stackTrace": [ "Handshake.Sequence._packetToError (/var/task/node_modules/mysql/lib/protocol/sequences/Sequence.js:52:14)", "Handshake.ErrorPacket (/var/task/node_modules/mysql/lib/protocol/sequences/Handshake.js:103:18)", "Protocol._parsePacket (/var/task/node_modules/mysql/lib/protocol/Protocol.js:280:23)", "Parser.write (/var/task/node_modules/mysql/lib/protocol/Parser.js:75:12)", "Protocol.write (/var/task/node_modules/mysql/lib/protocol/Protocol.js:39:16)", "TLSSocket.ondata (_stream_readable.js:555:20)", "emitOne (events.js:96:13)", "TLSSocket.emit (events.js:188:7)", "readableAddChunk (_stream_readable.js:176:18)", "TLSSocket.Readable.push (_stream_readable.js:134:10)", " --------------------", "Protocol._enqueue (/var/task/node_modules/mysql/lib/protocol/Protocol.js:141:48)", "Protocol.handshake (/var/task/node_modules/mysql/lib/protocol/Protocol.js:52:41)", "Connection.connect (/var/task/node_modules/mysql/lib/Connection.js:130:18)", "/var/task/handler.js:117:32", "/var/task/handler.js:115:35", "step (/var/task/handler.js:32:23)", "Object.next (/var/task/handler.js:13:53)", "/var/task/handler.js:7:71", "__awaiter (/var/task/handler.js:3:12)", "query (/var/task/handler.js:113:12)" ] }
###該当のソースコード
typescript
1import * as _ from 'lodash' 2import * as mysql from 'mysql' 3import AWS = require('aws-sdk') 4import RDS = require('aws-sdk/clients/rds') 5import { Context, Callback } from 'aws-lambda' 6 7// ~/hello 8export async function hello(event, context: Context, callback: Callback) { 9 try { 10 const token = await getToken(); 11 const connection = await connect(token); 12 const results = await query(connection); 13 callback(null, { statusCode: 200, body: JSON.stringify({ message: results }) }); 14 } catch (error) { 15 callback(error); 16 } 17} 18 19async function getToken(): Promise<string> { 20 return new Promise<string>((resolve, reject) => { 21 // パラメータ設定 22 const signerOptions: RDS.Signer.SignerOptions = { 23 credentials: { 24 accessKeyId: "<ACCESS-KEY>", 25 secretAccessKey: "<SECRET-ACCESS-KEY>" 26 }, 27 region: "ap-northeast-1", 28 hostname: "xxxxx.cts3jwle0qyy.ap-northeast-1.rds.amazonaws.com", 29 port: 3306, 30 username: "kashihara" 31 }; 32 // トークン発行 33 new RDS.Signer(signerOptions).getAuthToken((err: AWS.AWSError, token: string) => { 34 if (err) reject(err); 35 resolve(token); 36 }); 37 }); 38} 39 40async function connect(token: string): Promise<mysql.IConnection> { 41 return new Promise<mysql.IConnection>((resolve, reject) => { 42 const config: mysql.IConnectionConfig = { 43 host: 'xxxxx.cts3jwle0qyy.ap-northeast-1.rds.amazonaws.com', //RDSのエンドポイント 44 user: 'kashihara', //MySQLのユーザ名 45 password: token, 46 ssl: 'Amazon RDS' 47 }; 48 const connection = mysql.createConnection(config); 49 resolve(connection); 50 }); 51} 52 53async function query(connection: mysql.IConnection): Promise<string> { 54 return new Promise<string>((resolve, reject) => { 55 // コネクション接続 56 connection.connect((err) => { if (err) reject(err) }); 57 // クエリ発行 58 connection.query('select user from mysql.user', (err, results, fields) => { 59 if (err) reject(err); 60 resolve(JSON.stringify(results)); 61 }); 62 // コネクション切断 63 connection.end((err) => { if (err) reject(err) }); 64 }); 65}
###補足情報(言語/FW/ツール等のバージョンなど)
・Nodejs6.10
・TypeScript2.3.4
・MySQL5.7.16
・mysqlクライアント:mysqljs/mysql
・mysqlユーザのAUTH_MODE
mysql> select Host,User,plugin,authentication_string from mysql.user where User='kashihara'\G *************************** 1. row *************************** Host: % User: kashihara plugin: AWSAuthenticationPlugin authentication_string: RDS 1 row in set (0.01 sec)
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/06/16 04:21 編集
2017/06/16 04:43
2017/06/16 07:05
2017/06/16 07:23
2017/06/16 07:26