布団の中にいたい

Androidアプリ開発の勉強をしている傍らで、elasticsearchとかをいじってみたりしています。最近は数学の勉強が楽しくなってきました。

運用しているElasticsearchをAmazon Elasticsearch Serviceに移した

AWSの勉強ついでに、conohaで管理していたelasticsearchをAmazon Elasticsearch Serviceに移行してみました。かかる金額自体はAmazon Elasticsearch Serviceのほうが断然高いですが、まぁ勉強ついでということで。

やったことは以下 - Amazon Elasticsearch Serviceに接続できるようにする - logstashの設定ファイルを作る - logstashでデータを転送する

Amazon Elasticsearch Serviceに接続できるようにする

普通はIAM roleとかでアクセス制限かけたほうがいいと思うんですが、それやるとamazon_es pluginとか使わないといけなくなってしまうので、楽するために一旦IPでアクセスできるようにします。

github.com

きちんとやるならIPでやるのではなく、普通にawsの認証を通してから接続できるようにしたほうがいいと思います。

クラスメソッドさんのブログに色々書いてあるのでその辺見るといいんですかね。

dev.classmethod.jp

logstashの設定ファイルを作る

今回はelasticsearchからelasticsearchへのデータ転送なので改めてpluginをインストールする必要はありません。

ちなみに以下のような感じ。ちょっとデータを変換したいみたいなことを考えているのであれば、filterでいじるといいと思います。elasticsearchの5系以上であれば、似たようなことがelasticsearch標準でできるみたいなので、そっちでもいいかもしれません。

注意点ですが、もしkuromojiのようなanalyzerを指定しているのであれば、予めmappingを適用してください。

input {
    elasticsearch {
        hosts => "localhost:9200"
        index => "indexの名前"
        query => "{}"
    }
}


output {
    elasticsearch {
        hosts => "elasticsearch serviceのhost"
        index => "indexの名前"
    }
}

logstashでデータを転送する

別段継続的に動かすものでもないので、コマンド一発で終わらせます。

コマンドは以下

sudo /usr/share/logstash/bin/logstash -f logstash.conf --path.settings /etc/logstash

あとは、awsの方のelasticsearchを叩いてきちんとデータが挿入されているかを確認すれば終了です。 ちゃんと動いてるか確認したいなら、logstashとelasticsearchのログを見たり、一旦outputをstdoutにしてrubydebugとかで吐き出させてみるといいと思います。

まとめ

今回は、logstashを使って、既に運用しているelasticsearchからamazon elasticsearch serviceへlogstashを使用して、データ転送を行いました。今回はlogstashを使いましたが、データ転送の手段としては、embulkなどもあるので、使いやすいものを使うといいと思います。

「Amazon Web Services ではじめる新米プログラマのためのクラウド超入門」を読んだ

周囲で聞こえてくる「AMI」・「IAM」みたいな単語があまりにも分からず、MTGでも何を言っているのか分からないという状況で非常に申し訳ない気持ちになったのでAWSの勉強をすることに。 amazonで色々本を探していた中で、簡単そうで評価が高かった「Amazon Web Services ではじめる新米プログラマのためのクラウド超入門」を読むことにしました。

Amazon Web Servicesではじめる新米プログラマのためのクラウド超入門 (CodeZine BOOKS)

Amazon Web Servicesではじめる新米プログラマのためのクラウド超入門 (CodeZine BOOKS)

感想

ざっくりとした感想としては、AWSを知らない人向けに中核になっているサービスを使ってみて慣れてみようという感じ。個人的にEC2は立てて遊んだりしたことがあったのですが、ELB・S3・CloudWatchだったりは名前だけ知っているような状態だったので、どういうサービスなのかだったり、実際使ってみたりで色々勉強になりました。あと前職でOpenStackを使っていたこともあって、「何がどれに対応する」みたいなことを考えながら読めたので楽しかったです。

今回はDocker周りは必要なかったので読んでいませんが、何かしら必要になったら読み返そうかと思います。とりあえずは今回この本を読んでえた知識で何かしらやってみようかと思います。

cerebroを使ってみる

elasticsearchでSolrのような管理系UIが欲しかったのですが、5系以降ではsite pluginが廃止になった影響で今まで使われていたelasticsearch-headやelasticsearch-kopfが使えなくなってました。kopfはスタンドアロンのアプリケーションになってるみたいですが、同じ作者さんがcerebroというものを作っていたので作っていたので試してみました。

github.com

インストー

基本的にはgithubのREADMEに書かれてることをやればいいです。

wget https://github.com/lmenezes/cerebro/releases/download/v0.6.6/cerebro-0.6.6.tgz
tar xvf cerebro-0.6.6.tgz
cd cerebro-0.6.6

# 起動
bin/cerebro

簡単でいいですね。 起動画面は以下です。

f:id:asahima_194h:20170729182246p:plain

あとはhostsの部分にelasticsearchのhostのurlを書けば、indexの情報などが見れます。 kibanaのdev toolsと同じようにクエリもかけて、発行したクエリの履歴なども見れて大変便利でした。

機会があれば使ってみるといいかもしれません。

ubuntu16.04にelasticsearch + kibanaを導入する

前の記事でkibanaの前にnginxをおいて認証をかけるみたいな記事を書きましたが、elasticsearch + kibana自体のインストールも少し手こずったのでメモ書き程度にまとめます。

やること

javaのインストー

elasticsearchはjavaで書かれたソフトウェアなので実行環境としてjavaを入れる必要があります。

sudo apt-get update
sudo apt-get install openjdk-8-jdk-headless

elasticsearch

インストールは公式のドキュメントに従います

wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
sudo apt-get install apt-transport-https
echo "deb https://artifacts.elastic.co/packages/5.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-5.x.list

sudo apt-get update
sudo apt-get install elasticsearch

起動は以下

sudo service elasticsearch start

細かい設定ファイルは/etc/elasticsearch以下にあるので、メモリを調整したかったりするときは、この辺のファイルをいじるといいと思います。

elasticsearchはリクエストを受け付けるように9200ポート、他ノードとの連携用に9300ポートを利用しているみたいです。その辺のポートが開いていなければ順次ポートをずらしていくみたいです。

kibana

elasticsearchが導入できていたらそのままapt-getで入れられます。

sudo apt-get update
sudo apt-get install kibana

kibanaの起動は以下

sudo service kibana start

kibanaって前まで静的コンテツをelasticsearch配下に置くイメージだったんですが、いつの間にかnodejsのアプリケーションになってたんですね。調べて見る限りでは、elasticsearch 5系からsite pluginが廃止になった影響で使えなくなったのが理由みたいです。 elasticsearch-headとかも使えないっぽいので注意が必要そうです。

まとめ

今回はubuntuにelasticsearchとkibanaを導入しました。kibanaがnodejsのアプリケーションになってるのは衝撃でしたが、問題なくインストールできました。今度は管理系UIを調べて導入してみようかと思います。

nginxでbasic認証をかける

localで運用しているelasticsearch + kibanaをクラウドに移行しようと考えていたのですが、 awsのelasticsearchは予想外に金額が高かったのでconohaのVPSで運用することにしました。 X-Packを使えばkibana自体に認証をかけられますが、それも有料なのでどうしたもんかと考えた結果、 kibanaの前にnginxをおいて、そこに認証をかけてしまうことにしました。

ちらっと聞いた話でnginxでbasic認証をかけるのは簡単という話を聞いたので試してみました。

やることは以下

  • htpasswdでアカウントとパスワードを設定する
  • nginx側で認証をかける

htpasswdでアカウントとパスワードを設定する

htpasswdはbasic認証で利用できるファイルを生成してくれるコマンドです。便利ですね。インストールは以下のコマンドでできます。

sudo apt-get install apache2-utils

ファイル生成は以下

sudo htpasswd -c /etc/nginx/.htpasswd account_name

nginx側で認証をかける

htpasswdで生成したファイルをnginx.confで指定してあげます。全体に認証をかけることもできますし、任意の部分にかけることもできます。 今回はkibanaへのアクセス部分にかけるのでlocationにかきます。

upstream elasticsearch {
  server localhost:9200;
}

upstream kibana {
  server localhost:5601;
}

http {
  server {
    listen 80;
    server_name localhost;

    location / {
      auth_basic "Restricted";
      auth_basic_user_file /etc/nginx/.htpasswd;
      proxy_pass http://kibana;
    }
  }
}

設定したあと、nginxをrestartすればできます。大変楽でいいですね。

まとめ

今回はnginxでさくっとbasic認証をかけてみました。今までは割とクライアント周りばかりを触っていたのでweb serverなどをほとんど触っていなかったのですが、大雑把な部分は簡単にできるようでよかったです。細かい部分についてはまたおいおいやっていければと思います。

vimでRustを書く(環境構築)

周囲の人たちから「Rustいいよ」、「Rust書こうよ」とポツポツ言われるので流れにのって入門してみることにしました。

といっても今回やるのは環境構築のみ。Rustさっぱりなので、慣れてきたら適当にメモを書いていきます。

私が普段vimでコードを書いているのでvimで書くまでを目標にします。

やること

  • Rustのインストー
  • rustfmtとracerのインストー
  • rust.vimvim-racerをインストー
  • 自動でフォーマットするようにする

Rustのインストー

macでhomebrewを使うと以下でできるみたいですが、私はmac使いじゃないので公式ページに書かれてる方法を使います

brew install rust

公式ページは以下

www.rust-lang.org

インストール方法は以下

curl https://sh.rustup.rs -sSf | sh

上記のコマンドで、rustrcとcargoが入ります。

rustfmtとracerのインストー

rustfmtとracerについて簡単に説明すると、rustfmtはRustのガイドラインにしたがって、Rustで書かれたソースをフォーマットしてくれるツールです。racerはRustのコード補完ツールみたいです(詳しいことは知らない)

これらはそれぞれcargoで入れられます。cargoはRustのパッケージ管理ツールです。 rustfmtとracerのインストールは以下

cargo install rustfmt
cargo install racer

難しいこと考えなくていいのでいいんですね。こういうの好きです。

rust.vimvim-racerのインストー

私がdein.vimを使ってるのでそれに準ずる方法でインストールします。toml使ってplugin管理してる人が多いと思いますが、めんどくさかったのでvimrcに直書きしてます。すいません。

vimrcに追記したのは以下

call dein#add('rust-lang/rust.vim')
call dein#add('racer-rust/vim-racer')

自動でフォーマットするようにする

rustfmtを入れたのでどうせなら保存したら自動でフォーマットしてくれると助かります。

追記したのは以下

let g:rustfmt_autosave = 1

まとめ

今回は自動フォーマットまでをまとめました。結局のところ、まだRust書いてないので、ぼちぼち書いていこうと思います。

追記

衝撃の事実。homebrewでインストールしたrustのcargoを使って、rustfmtをインストールしようとするとエラーで落ちるっぽいです。

github.com

goでconnpassのイベントを検索するslackbotを作ってみた

つい最近のGoogle I/Oでkotlinがandroidアプリ開発の公式言語に追加された影響か、大したこと書いてないですが意外にアクセスが来ていて嬉しい限りです。 とりあえず間違った情報は流さないようにしたいと思います。

今回は今までのandroid + kotlin押しとは打って変わって、golangでslackbotを作ってみたというお話です。

最近仕事でslackを使い始めたので、slackに慣れるついでにslackbotを作ってみましたというのがモチベーションです。 connpassを選んだ理由はAPIで提供している機能が検索しかないので、とりあえずで実装してみる分にはそこまで難しくなさそうというだけです。

書いたコードは以下

github.com

実装内容

使用したライブラリ

詰まったところ

今回botを作る上で実装したいと考えていたのは以下の二点です。 - botを呼び出した人にmentionを飛ばすようにする - コマンドを幾つか用意する

この中で「botを呼び出した人にmentionを飛ばすようにする」で若干つまりました。

やってみると意外に簡単で飛ばすメッセージに"<@飛ばす先のアカウントID>“を付加するだけで大丈夫でした。

まとめ

だいぶざっくりした感じになってしましましたが、やってみると意外に簡単にできるので試しに作ってみてもいいかもしれません。