質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

Q&A

解決済

2回答

3405閲覧

Public AccessのRDSへIAM認証に失敗する

ShotaKashihara

総合スコア13

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

0グッド

0クリップ

投稿2017/06/16 04:02

編集2017/06/16 04:10

###前提・実現したいこと
こちらの記事を参考に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)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

insecureAuthオプションがデフォルトでfalseになっているせいではないでしょうか。
これをtrueにすればいけませんか?

--以下追記
無理でしたか・・・

RDSで以下対応できるかわかりませんが・・・可能なら試してみてください。

mysql> UPDATE mysql.user SET plugin = 'mysql_old_password' mysql> WHERE User = 'some_user' AND Host = 'some_host'; mysql> FLUSH PRIVILEGES; mysql> SET PASSWORD FOR -> 'some_user'@'some_host' = OLD_PASSWORD('new_password');

https://dev.mysql.com/doc/refman/5.7/en/old-client.html

投稿2017/06/16 04:15

編集2017/06/16 04:27
moonphase

総合スコア6621

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ShotaKashihara

2017/06/16 04:21 編集

ありがとうございます。 mysql.IConnectionConfigにinsecureAuth: trueを付け足してみましたが同様のエラーログでした・・・
ShotaKashihara

2017/06/16 04:43

どうもすみません。 OLD_PASSWORD()自体がMySQL 5.7.5で削除されているようです。(なんと...
ShotaKashihara

2017/06/16 07:23

元記事ではrds-combined-ca-bundle.pemをcaとして使用していましたので、 わたしも最初は ssl : { ca : fs.readFileSync(__dirname + '/rds-combined-ca-bundle.pem') } と記述していたのですが、 mysqlクライアントのソースを眺めていて ssl: "Amazon RDS" と等価ということがわかりこのようなソースになっています。
guest

0

自己解決

解決しました。

mysql2に変更

Typescript

1import * as mysql from 'mysql2'

② connectionConfigにmysql_clear_passwordを使用する設定追加(authSwitchHandler:)

Typescript

1const config: mysql.IConnectionConfig = { 2 host: 'xxxxx.cts3jwle0qyy.ap-northeast-1.rds.amazonaws.com', //RDSのエンドポイント 3 user: 'kashihara', 4 database: 'zzzzz', 5 ssl: 'Amazon RDS', 6 authSwitchHandler: (data, cb) => { 7 if (data.pluginName === 'mysql_clear_password') { 8 // https://dev.mysql.com/doc/internals/en/clear-text-authentication.html 9 var password = token + '\0'; 10 var buffer = Buffer.from(password); 11 cb(null, buffer); 12 } 13 }

投稿2017/06/22 01:15

ShotaKashihara

総合スコア13

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問