2017年11月29日水曜日

Aurora でMaria DB のJDBC Driver を選択した時にでるエラーの対処

まず、RDS の構成は以下の図のようになっています。

この構成のDB に、以下のMySQL 用のJDBC Driver を指定してアクセスしていたのですが、Maria DB のJDBC Driver に変更し、Maria DB のJDBC Driver でしかできないFailover の機能を利用することにしました。

MySQL
jdbc:mysql://aurora-cluster.abc.ap-northeast-1.rds.amazonaws.com:3306/db
Maria DB
jdbc:mysql:aurora://aurora-cluster.abc.ap-northeast-1.rds.amazonaws.com:3306/db

コーディングは、DBCP を利用していたので、以下のようにDriver を選択して、上記のURL にアクセスするだけです。
org.apache.commons.dbcp2.BasicDataSource.setDriverClassName( "org.mariadb.jdbc.Driver" );
この変更をしたら、以下のエラーが発生しました。
java.sql.SQLException: Cannot create PoolableConnectionFactory (Communications link failure with primary. No active connection found for master. )
at org.apache.commons.dbcp2.BasicDataSource.createPoolableConnectionFactory(BasicDataSource.java:2294)
at org.apache.commons.dbcp2.BasicDataSource.createDataSource(BasicDataSource.java:2039)
at org.apache.commons.dbcp2.BasicDataSource.getConnection(BasicDataSource.java:1533)
どうやらmaster のdatabase が見つからないようです。
以下のサイトを参照。
https://dev.classmethod.jp/cloud/faster-failover-by-aurora-jdbc-driver/
どうやら、アクセス先が間違っているようなので、以下のようClusterEndopoint の次に、カンマを入れて、ReaderEndpoint を指定したら、接続できました。
jdbc:mysql:aurora://aurora-cluster.abc.ap-northeast-1.rds.amazonaws.com:3306,jdbc:mysql:aurora://aurora-cluster.ro-abc.ap-northeast-1.rds.amazonaws.com:3306/db
ちなみに、レプリカを立てない構成で上記のようにread only のDB を指定すると、先にでてきたエラーのmaster がreplica になってエラーがでます。
java.sql.SQLException: Cannot create PoolableConnectionFactory (Communications link failure with primary. No active connection found for replica. )
あと、微妙にハマったのは、MySQL のユーザを新規で生成した後、権限を付与しないためにエラーが発生していた。
新規でユーザ生成時は、GRANT コマンドまで実施すること。

Sample
CREATE USER 'user'@'%' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON database.table to 'user'@'%' IDENTIFIED BY 'password';
権限チェックしたい場合は以下のコマンドで。
SHOW GRANTS FOR 'user'@'%';

2017年8月8日火曜日

AWS Aurora でGRANT する

以下の通り。% をグレイブアクセントでくくるのがポイント。
GRANT ALL ON `%`.* TO user_name@`%`;

2017年7月26日水曜日

google blog にprettyprint を適用する

私のブログでは、Dropbox からprettyprint 用のjs ファイルとcss ファイルを読み込んでいたが、うまく動作できなかったので、以下のやり方に変更。

以下のリンクのloader フォルダ以下にあるjs ファイルと、loader>skins フォルダにあるrun_prettify.js と、sunburst.css を利用する。
https://github.com/google/code-prettify

[ やり方 ]
Blog > テーマ > HTML の編集 で、Blog のHTML を表示する。
<body onload='prettyPrint()'>のちょい上辺りに、以下のコードを追加する。
<script src='https://cdn.rawgit.com/google/code-prettify/master/loader/run_prettify.js'/>
<link href='https://cdn.rawgit.com/google/code-prettify/master/loader/skins/sunburst.css' rel='stylesheet' type='text/css'/>
注意:github からの直リンクだとうまく参照できない。CDN から配布されているので、そちらを参照するようにリンクを張る。

EC2 Instance にApache Kafka をインストール

[ 前提 ]
EC2 から、適当にInstance を立ち上げて、Internet に接続できる環境を構築しておく。
今回利用したAMI は、以下の通り。
Amazon Linux AMI 2017.03.1 (HVM), SSD Volume Type - ami-a4c7edb2


[ 本題 ]
Instance にSSH で接続する。 上記のAMI には、Java7 しかInstall されておらず、現状最新版のApache Kafka はJava8 が無いと、以下のException が発生して、動作できないようなので、Java8 をInstall する。
java.lang.UnsupportedClassVersionError
Unsupported major.minor version 52.0

Java は以下のOpenSDK からリリースされているものを利用する。
java-1.8.0-openjdk-devel.x86_64
コマンドは以下の通り。
sudo yum install java-1.8.0-openjdk-devel.x86_64
(余談)devel というのが、Oracle のJava のJDK に当たるもののようで、java-1.8.0-openjdk.x86_64 はJRE に当たるものだそうです。

Install が終わったら、Java7 からJava8 への切り替え作業をする。
コマンドは以下の通り。
sudo alternatives --config java
一応、"java -version" で、Java8 が利用されているか、version を確認しておく。
ここで、やっとApache Kafka をInstance にダウンロードし、解凍する。ついでにディレクトリも移動しておく。
wget http://ftp.jaist.ac.jp/pub/apache/kafka/0.11.0.0/kafka_2.12-0.11.0.0.tgz
tar -zxvf kafka_2.12-0.11.0.0.tgz cd kafka_2.12-0.11.0.0
とりあえずここまできたら、zookeeper をデーモン起動させる。
bin/zookeeper-server-start.sh -daemon config/zookeeper.properties
最後にKafka を起動させる。
bin/kafka-server-start.sh config/server.properties
ここで以下のException が発生する。原因は、/etc/hosts ファイルに、ip-<AWSのPrivateIP> を解決するためのIP Address の記載が無い。
ava.net.UnknownHostException: ip-<AWSのPrivateIP>: ip-<AWSのPrivateIP>: Name or service not known
        at java.net.InetAddress.getLocalHost(InetAddress.java:1505)
        at kafka.server.KafkaHealthcheck.$anonfun$register$1(KafkaHealthcheck.scala:60)
        at scala.collection.TraversableLike.$anonfun$map$1(TraversableLike.scala:234)
        at scala.collection.mutable.ResizableArray.foreach(ResizableArray.scala:59)
        at scala.collection.mutable.ResizableArray.foreach$(ResizableArray.scala:52)
        at scala.collection.mutable.ArrayBuffer.foreach(ArrayBuffer.scala:48)
        at scala.collection.TraversableLike.map(TraversableLike.scala:234)
        at scala.collection.TraversableLike.map$(TraversableLike.scala:227)
        at scala.collection.AbstractTraversable.map(Traversable.scala:104)
        at kafka.server.KafkaHealthcheck.register(KafkaHealthcheck.scala:58)
        at kafka.server.KafkaHealthcheck.startup(KafkaHealthcheck.scala:50)
        at kafka.server.KafkaServer.startup(KafkaServer.scala:280)
        at kafka.server.KafkaServerStartable.startup(KafkaServerStartable.scala:38)
        at kafka.Kafka$.main(Kafka.scala:65)
        at kafka.Kafka.main(Kafka.scala)
そのため、以下の1行をhosts ファイルに追加する。(ip-から始まる方は、${hostname -s} の結果)
<AWSのPrivateIP> ip-<AWSのPrivateIP>
無事、Kafka が起動できたら、topic を作成してみる。
bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic my-topic

2017年6月29日木曜日

EC2インスタンス上のDocker上でインスタンスを起動して失敗する場合

インスタンスの起動失敗時、EC2インスタンスにSSH でログインして、以下のパスのログを確認する。
vi /var/log/ecs/ecs-agent.log-yyyy-MM-dd-xx
失敗している原因が不明な場合、インスタンス起動時の作業ディレクトリ(WorkingDirectory)の指定をしていない可能性もある。
この設定は、タスク定義を作成する時に指定する。
例えば、Dockerfile で以下のようにJar ファイルをローカルからDocker のインスタンスにコピーした場合、そのコピー先を作業ディレクトリに指定して見るとうまくいくかも。
COPY test.jar /var/
この場合、作業ディレクトリを"/var"と設定しておく。

ECSで管理しているContainerからRDS(Aurora)に接続

ECSで管理しているContainerにWebApplicationをデプロイ後、RDS(Aurora)に接続するまで。
まず、RDSのページから、Aurora インスタンスを起動する。
インスタンスが起動したら、テーブル作成のため、mysql client を利用してログインする。
ローカルPC -> Aurora だと、色々面倒なので、ECS インスタンスにmysql client をinstall して、そこからログインする。
mysql client のinstall は、以下の通り。
sudo yum install mysql

Aurora に設定したDB ユーザ、パスワードを入力して、Aurora にログインする。
ログインコマンドは以下の通り。
mysql -u username -p -P 3306 -h ecs-cluster-db.cluster-xxxxxxxx.us-east-1.rds.amazonaws.com

ログインしたら、適当にテーブルを作成する。
また、WebbApplication からアクセスするログインアカウントが上記と異なる場合、ユーザの作成と権限付与をする必要がある。

コマンドは以下の通り。
CREATE USER 'user_name' IDENTIFIED BY 'password';
GRANT ALL ON db_name.* to 'user_name'@'%' identified by 'password'; <- ALL をSELECT にすればRead only user ができる。

とりあえずこれでRDS 側の設定は終わったので、WebApplication からAurora にアクセスしてみる。
ここでは、jdbc ドライバを利用したアクセスを試みる。 コマンドは以下の通り。
jdbc:mysql://ecs-cluster-db.cluster-xxxxxxxx.us-east-1.rds.amazonaws.com:3306/db_name

これでアクセスできない場合、ネットワークの問題があるはず。
一番簡単な解析方法はtcpdump でパケットを眺める。
Container インスタンスに、ssh でログインする。
ログインしたら、tcpdump をインストール。
コマンドは以下の通り。
sudo yum install tcpdump
インストールしたら、ifconfig でeth0 のNIC を確認し、IP を控えておく。
実際にtcpdump を取得する。
コマンドは以下の通り。
sudo tcpdump -s0 -i eth0 -w packet.cap

パケットを取得したら、packet.cap ファイルが実行したフォルダに置かれるので、ローカルPC に持ってきてWireshark などで解析をする。
ssh でcontainer インスタンスに入っているので、ローカルPC にファイルを持ってくるには、SCP コマンドを利用するか、S3 にファイルを一旦アップロードしてからダウンロードするやり方が簡単。
Tera term を利用しているなら、File > SSH SCP でFrom に、"./packet.cap"と入力してReceive ボタンを押せば、ローカルPC にダウンロードできる。
S3 に一旦、アップロードする場合のコマンドは、以下の通り。
aws s3 cp ./packet.cap s3://bucket-name

2017年6月22日木曜日

Docker でMySQL コンテナを立ち上げた時にやったこと

// MySQL のコンテナを起動する
docker@default:~$ docker run --name mysqld -e MYSQL_DATABASE=mydb -e MYSQL_USER=user -e MYSQL_PASSWORD=password -e MYSQL_ROOT_PASSWORD=admin -d mysql

// MySQL にLogin
docker@default:~$ docker run --link mysqld:mysql -it --rm mysql bash

// MySQL にLogin 後、環境変数をチェック
root@95825593d169:/# env

// DB にlogin しようとして、error
root@95825593d169:/# mysql -u root -p mydb
Enter password:
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)

// 上記エラー時、mysqld.sock が'/var/run/mysqld/mysqld.sock'にあるかどうかを確認
root@95825593d169:/# ls -al /var/run/mysqld/

// mysqld.sock がない場合、以下のコマンドで作成
root@95825593d169:/# touch /var/run/mysqld/mysqld.sock

// ディレクトリの所有者変更(不要かも)
root@95825593d169:/# chown mysqld:mysql /var/run/mysqld

// MySQL を再起動
root@95825593d169:/# /etc/init.d/mysql restart

// ログフォルダを設定していないと、以下のWarning
No directory, logging in with HOME=/
2017-06-22T05:59:53.076720Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
2017-06-22T05:59:54.729911Z 0 [Warning] InnoDB: New log files created, LSN=45790
2017-06-22T05:59:54.991579Z 0 [Warning] InnoDB: Creating foreign key constraint system tables.
2017-06-22T05:59:55.300196Z 0 [Warning] No existing UUID has been found, so we assume that this is the first time that this server has been started. Generating a new UUID: 03cdccff-5710-11e7-b6a7-0242ac110005.
2017-06-22T05:59:55.314362Z 0 [Warning] Gtid table is not ready to be used. Table 'mysql.gtid_executed' cannot be opened.
2017-06-22T05:59:55.337119Z 1 [Warning] root@localhost is created with an empty password ! Please consider switching off the --initialize-insecure option.
2017-06-22T05:59:56.130826Z 1 [Warning] 'user' entry 'root@localhost' ignored in --skip-name-resolve mode.
2017-06-22T05:59:56.130938Z 1 [Warning] 'user' entry 'mysql.sys@localhost' ignored in --skip-name-resolve mode.
2017-06-22T05:59:56.130978Z 1 [Warning] 'db' entry 'sys mysql.sys@localhost' ignored in --skip-name-resolve mode.
2017-06-22T05:59:56.131009Z 1 [Warning] 'proxies_priv' entry '@ root@localhost' ignored in --skip-name-resolve mode.
2017-06-22T05:59:56.131069Z 1 [Warning] 'tables_priv' entry 'sys_config mysql.sys@localhost' ignored in --skip-name-resolve mode.

// 最初に作ったDB, User が消えていたので、ルートでログイン
root@95825593d169:/# mysql -u root -p

// 消えたユーザを作成する
CREATE USER 'user' IDENTIFIED BY 'password';
GRANT ALL ON mydb.* TO 'user'@'%' IDENTIFIED BY 'password';

2017年6月15日木曜日

Docker QuickTerminal をWindows7 にインストール後、起動したらエラー

以下のようなエラーが発生
Looks like something went wrong in step ´Checking if machine default exists´
コントロールパネル>プログラム>プログラムと機能 で、Oracle VM VirtualBox を修復したらエラーが解消されました。 その際、コントロールパネル>ネットワークとインターネット>ネットワーク接続 を確認した所、VirtualBox Host-Only Network が1つ追加されていました。
ちなみに、以下の構成で、#3 だけが有効になっている状態で起動できました。
#ローカルエリア接続は有効です。
VirtualBox Host-Only Network
VirtualBox Host-Only Network #2
VirtualBox Host-Only Network #3

2017年6月6日火曜日

MySQL Workbench での設定とTips

外部参照の無効/有効
SET FOREIGN_KEY_CHECKS = 0/1;

Read only 権限のユーザ
mysql> GRANT SELECT ON *.* TO 'username'@'host_or_wildcard' IDENTIFIED BY 'password';
mysql> FLUSH PRIVILEGES;

MySQL のユーザ一覧を参照
mysql> select host, user from mysql.user;

2017年5月2日火曜日

vagrantでsshした後、sudo cd でcommand not found がでる場合

nginx のエラーログを参照したかったので、vagrant でCentOS にssh でアクセス後に、以下のコマンドを実行したら、command not found が出た。
sudo cd /var/log/nginx
sudo: cd: command not found

cd はbuild-in コマンドですが、sudo はプログラムに適用します。 つまり、先ほどのコマンドはcd がプログラムではないため、実行できません。
そのため、以下のコマンドで、ユーザをsuper user へ昇格させた後に、cd コマンドを実行すると、やりたいことができます。
sudo -i
参考:https://askubuntu.com/questions/291666/why-doesnt-sudo-cd-var-named-work

2017年3月31日金曜日

webpack.config.js の設定でハマる

Mac でwebpack 使ってたのですが、バックスラッシュと円記号(¥)の違いで、ハマりました。
Mac環境のUTF-8では、バックスラッシュは¥ とは違う扱いになるため、Windows の感覚でバックスラッシュを¥ にしてハマりました。
具体的には、以下のwebpack.config.js の設定に不備がありました。
正解  → test: /\.(js|jsx)$/,
間違い → test: /¥.(js|jsx)$/,

Windows では、¥ を\ に変換してくれるので、おそらく問題なく動作できると思います。(未確認)
下記のURL のサンプル作成で使用したwebpack.config.js を添付しておきます。
http://xiao-ctrl-y.com/2016/06/29/react-redux-begin-3/

var path = require('path')
var webpack = require('webpack')

module.exports = {
 entry: "./src/index",
 output: {
  path: path.join(__dirname, 'static'),
  filename: 'bundle.js',
  publicPath: '/static/'
 },
 resolve: {
  extensions: ['*', '.js', '.jsx']
 },
 module: {
  loaders: [
   {
    test: /\.(js|jsx)$/,
    exclude: /node_modules/,
    include: path.join(__dirname, 'src'),
    loader: 'babel-loader',
    query:{
     presets: ['es2015', 'react']
    }
   }
  ]
 }
};

2017年3月30日木曜日

SublimeText3 でPackage Control 利用時、Unable to download で動作できない場合

プロキシ認証の問題でPackage Control がインストールできないケースは、以下のURL のProxyHandler にプロキシ認証情報を設定すればよい。
https://packagecontrol.io/installation

これは、他のサイトに譲るとして、本投稿は、Package Control をインストール後に、以下のようにUnable to download が出た場合の対処について記載する。


とはいっても、やることは以下のことだけ。
Preferences > Package Settings > Package Control > Settings – User を開く

以下の私のSublimeText3 の設定例にある、http_proxy, https_proxy に、プロキシ情報を設定する。
{
 "bootstrapped": true,
 "http_proxy": "http://127.0.0.1:8888",
 "https_proxy": "http://127.0.0.1:8888",
 "in_process_packages":
 [
 ],
 "installed_packages":
 [
  "Babel",
  "ConvertToUTF8",
  "Emacs Pro Essentials",
  "JavaScript & NodeJS Snippets",
  "JavaScriptNext - ES6 Syntax",
  "Monokai JSON+",
  "Package Control",
  "Pretty JSON",
  "ReactJS",
  "ReactJS Snippets",
  "SublimeLinter",
  "SublimeLinter-jshint",
  "TypeScript"
 ]
}

設定値の記載方法は以下の通り。
"http_proxy": host:port,
"https_proxy": host:port,
"proxy_username": username,
"proxy_password": password

2017年3月21日火曜日

Windows でReact.js お試しコードの環境構築2

前回に引き続き、以下のURL のサンプル作成に取り掛かります。
http://c16e.com/1510161700/
まず、webpack の設定からハマります。
新しいbabel とwebpack の互換性がなくなっているようで、loader の設定値を正しくしないと動きません。
で、色々調べた結果、以下のサイトを見たのですが、webpack.config.js に、ちょいと間違いがあるようで、正しく動作しません。
https://yoheikoga.github.io/2016/06/22/error-is-occur-in-30-minutes-like-button-tutorial-of-React/
で、色々試して、以下のパッケージをインストールします。
npm install babel-core babel-preset-es2015 babel-preset-stage-0 --save-dev

インストールしたら、以下の記載をwebpack.config.js に書いたら、build できました。
module.exports = {
  entry: __dirname + "/src/main.js",
  output: {
    path: __dirname + "/dist",
    filename: "like-button.js"
  },
  module: {
    loaders: [
      { test: /\.js$/, loader: "babel-loader", query: { presets: ['es2015', 'stage-0', 'react'] } }
    ]
  }
};

次は、webpack でビルドするために、webpack をインストールした時に生成される、package.json にscripts に記載を追加します。
"scripts": {
    "build": "webpack",
    "watch": "webpack -w"
  },

最後の「,」はpackage.json の最後の要素なら不要です。元々のサンプルサイトでは、「rm -rf dist/*.js && 」という記載がありますが、これは、dist フォルダ以下のファイルを削除後にwebpack コマンドで新規生成されるファイルを出力しますよってことで、Windows のコマンドに置き換えたのですが、うまくいかなかったので、とりあえず、この削除コマンドがなくても動作できるので消しました。

とりあえず、このハマりどころをクリアすれば、サンプルサイトのサンプルは動作できると思います。

2017年3月17日金曜日

Windows でReact.js お試しコードの環境構築1

React やるのに環境を本当に1から構築しようとトライした時、記事が古かったりと色々ハマったので、備忘録。

この記事は環境構築までとします。
やりたいこと: React 使って適当なサンプル作りたい
サンプルは以下のものを参考にしました。

http://c16e.com/1510161700/

私はWindows7 の環境で実施したかったので、多少コマンド(touch をecho など)が違いますが、そこは適当に吸収しました。
で、以下から始めました。
 React って何かを調べる
 Babel って何かを調べる
 ES6 って何かを調べる

で、この辺が大体わかってから、サンプルの作成に取り掛かろうと思ったのですが、とりあえず、エディタを決めることに。探したらSublimeText3 が良さそうなので、それをインストール。
インストール後にやることは、以下の通り。
 パッケージコントロールのインストール(Ctrl+Alt+p でパッケージをインストールできるようになる)
 (emacs の人だけ)Emacs Pro Essentials をインストール
 SublimeLinter をインストール
 SublimeLinter-jshint をインストール
 JavaScript & NodeJS Snippets をインストール
 JavaScriptNext - ES6 Syntax をインストール
 Pretty JSON をインストール
 Babel をインストール
 ReactJS をインストール
 文字化けしたくない人はConvertToUTF8 もインストール
 TypeScript 使う人は、TypeScript もインストール

emacs 使いなので、Keybind を変更したいのですが、Preferences->Key Bindings で変更している記事が多いですが、メンドクサイので、Emacs Pro Essentials(Sublemacspro)を入れました。(絶対こっちのほうが楽ちんです。) それでも足りないKeybind がある場合は、先ほどのPreferences から設定をします。(Ctrl+h をBackspace として割当てるとか。)
とりあえず環境構築まで。次回はハマりどころを追加予定。

2017年2月13日月曜日

eclipse で${} でパスを指定する設定

eclipse でDebug するときに、VM argument を設定する時があると思います。
そのとき、Variable として設定しているパスを指定してjar を指定したかったので、すこし調べた。

ざっくり言うと、Preference > Run/Debug > String Substitution で、選択されているようにm2repo というVariable を作成して、maven のrepository フォルダを指すようにしてみる。

設定したら、Debug Configuration で、Arguments のタブのVM arguments で以下のように指定してあげれば、maven repository のフォルダを指して利用可能。

2017年2月12日日曜日

google code prettify をdropbox で動作できない時の確認事項

[ 2017/07/26 ]
以下の手順ではもうprettyprint できなくなっているため、以下のリンクを参照。
google blog にprettyprint を適用する

久々に自身のブログを見直してみたら、google code prettify が正しく動作していなかった。
私のブログはdropbox からcss を読み込んでいたので、dropbox の設定を見直すことに。
すると、いつの間にか公開されていたはずのgoogle code prettify で利用する、prettify.css とprettify.js が公開されておらず、読み込みに失敗しているようだった。

ここで、今までの設定ではdropbox をブラウザから参照できたURL を直接ブログのhtml に記入していたが、これでは参照できなくなっていた。



そのため、公開リンクをコピーして指定したら無事動作できました。

また、設定したらハイライトが自身のブログとマッチしてなかったので、以下のサイトからカラーテーマを持ってきて、CSSファイルにコピペして利用しました。
https://jmblog.github.io/color-themes-for-google-code-prettify/