Carpe Diem

備忘録。https://github.com/jun06t

.ioドメインに障害が起きたのでDNSの仕組みを勉強

概要 先日.ioドメインで障害が起きました。.ioのトップレベルDNSサーバがサブドメインの権威サーバ一覧を返さなくなったので名前解決ができなくなったためです。 今回はDNSの流れと確認方法をまとめました。 DNSの流れ www.example.comにアクセスしたい クラ…

dockerのlog周りの対応

概要 dockerを本番運用する際にログの扱いに悩んだので情報をまとめてみました。 環境 docker v1.12.1 コンテナのログは何処に渡すべきか 主に以下の3通りになると思います。 コンテナ内に保存 volume先に指定してに永続保存 log driverを使って転送

remote_addrとかx-forwarded-forとかx-real-ipとか

概要 ECSでNginxのコンテナをプロキシとして立てたところ、APIサーバのアクセスログのクライアントIPがNginxのコンテナIPになっていたのでその修正をしたのがきっかけです。 環境 Nginx 1.10.2 Docker1.12.1 構成 Client -> ELB -> Nginx -> API という構成…

golangのpresentで発表用スライドを作成する

Go

概要 先日Goオールスターズ2で登壇させて頂き、その時プレゼン作成のために使ったpresentの使い方を紹介します。 presentを使うと↓のようなスライドを作れます http://go-talks.appspot.com/github.com/jun06t/go-all-stars/main.slide#1 メリット・デメリ…

Expressでroutingの後にmiddlewareを置きたい

概要 あるサーバ用のライブラリを使ったときにrouting後にmiddlewareを挟む必要が出てきました。 そのときに幾つかハマったことがあったので、それをまとめます。 環境 Node.js 6.6.0 Express 4.13.4 Express4のミドルウェアの流れ まずはミドルウェアの実行…

ESLintを設定する

概要 以前はJSLint, JSHintなどが使われていましたが、最近はplugableなESLintがコードの検証に使われる様になってきました。 今回はその設定方法を簡単に説明します。 環境 Node.js 6.6.0 ESLint 3.5.0 インストールと設定 npmでインストールします。 $ npm…

TerraformでECS環境の構築【オートスケール編】

概要 TerraformでECS環境の構築 - Carpe Diemでは書いてなかったオートスケールについてです。 terraform 0.7からServiceでのオートスケールにも対応したので、それを使って構築します。 環境 Ubuntu 14.04 Terraform 0.7.3 実装 完成形はこちら github.com

MongoDBのデータをElasticsearchにリアルタイム同期

概要 以前はMongoRiverを使う - Carpe Diemで紹介したようにRiverという機能を使って同期を実現させていました。 しかしながらElasticsearchがRiverを廃止することを決め、バージョン2.x以降は使うことができなくなりました。 そこで調べてみて挙がったのは…

DockerでMongoDBのレプリカセットを構築

概要 MongoDBのレプリカセットを組んで検証する必要があったのでdockerを使って構築することにしてみました。 環境 Docker 1.12.0 Mongo 3.2.9 構成 コンテナ名 役割 ホスト側ポート mongo1 Primary 30001 mongo2 Secondary 30002 arbiter Arbiter。データは…

Elasticsearchでの文字列の正規化

概要 検索システムを扱う上で文字列の正規化は非常に重要な要素です。 大抵納品されるデータはフォーマットがバラバラ(全角半角、カタカナひらがなが統一されないなど)なので、この正規化によってある程度統一させることで検索の精度を向上できます。 環境…

NginxでHTTP/2(ALPN対応)

概要 以前NginxでHTTP/2 - Carpe Diemを書きましたが最近改めて確認してみると のようにHTTP/2が使えていないことが分かりました。今回はこの問題に対応します。

負荷試験中に使ったコマンド

概要 負荷試験やサービスが重くなっている時にチェックしたほうがいい項目を挙げてみました。 環境 Ubuntu 14.04 チェック項目 疎通できているか確認 AWSだとデフォルトだとpingが通らないのでncコマンドを使います。 $ nc -z 192.168.1.10 27017 Connection…

TerraformでECS環境の構築

概要 ECSというコンテナのクラスタ環境構築のサービスをTerraformで作成してみます。 簡単のため、以下の設定はこのコードには含んでいません。 EC2インスタンスのオートスケール用のアラーム設定なし ECSのコンテナのオートスケールはなし(Terraform未対応…

ELB+nginxでbasic認証をかける方法

概要 開発環境では外部に見られないようにbasic認証をかけることが良くあります。 一方でELBのHealthCheckはbasic認証がかかったパスだと401エラーが返り、そのままだとOutOfServiceとなって接続することができません。 今回はそんな時の対応方法です。Nginx…

Dockerのネットワークを理解するために覚えたことまとめ

概要 Dockerのネットワーク周りを勉強していると、 docker0 仮想ブリッジ VXLAN link機能 など色んな要素が出てくるのですが、ちゃんと理解していないとすぐ忘れるため一度しっかり学んでみました。 今回はその時に疑問に思ったことをまとめてみました。 環…

React.js+Fluxでcounter

概要 Fluxアーキテクチャを勉強しようと思って簡単なcounterを作ってみました。 github.com 動作ページはこちら 環境 React.js 15.0.1 Babel 6.5.2 webpack 1.12.15

GolangでTwitterのOAuth1.0認証

概要 GolangでTwitterのOAuth認証をします。 oauth1.0のライブラリはいくつかありますが、今回はgaryburd/go-oauthを利用します。 github.com 環境 Go v1.6.2

goroutine、channelの扱い方

Go

概要 goroutineやchannelを扱う上で気になった点を箇条書きしました。まとまってはいないのでご注意ください。 簡単のためchannelでの受信側をreader、送信側をwriterとして書いていきます。 環境 Go 1.6.2 実装時に注意するポイント readerとwriterは別goro…

JWTを認証用トークンに使う時に調べたこと

概要 JWTを認証用トークンに使う時に調べたことをまとめます。 JWTとは 以下のフォーマットです。 {base64エンコードしたheader}.{base64エンコードしたclaims}.{署名} 以下の特徴があります。 発行者が鍵を使ってJSONを署名(or HMAC)し、トークンとして扱…

Kubernetes を使ったマルチホスト環境でのクラスタを構築する【flannel編】

概要 前回の続きです。 今回はflannelを導入してマルチホストでのコンテナ間通信を可能にします。 マスターの設定 flannelの設定 flannel.json ネットワークの設定ファイルを用意します。適当にflannel.jsonとします。 { "Network": "10.20.0.0/16", "Subnet…

Kubernetes を使ったマルチホスト環境でのクラスタを構築する【基礎編】

概要 Kubernetesを使ってDockerのクラスタを構築します。Kubernetesを使うことで以下のような本番環境を意識したシステムを構築できます。 フェイルオーバー(コンテナが異常終了したことを検知し再起動させる) スケーリング(起動しているコンテナの数を自…

neologdでkuromojiを新語に対応させる

概要 Elasticsearchの日本語の形態素解析をする際に利用されるkuromojiは非常に便利ですが、その辞書であるIPADICは更新が止まっているためやや古い状態です。 その辞書を更新してくださった方がいらっしゃり、neologdとして公開されているためそれを導入し…

マルチホスト上にoverlay networkを構築してコンテナ間で疎通

概要 以前はWeaveというツールを使ってマルチホストをまたいだコンテナ間通信ができるように構築しました。 Docker 1.9.0からVXLANという仮想でL2ネットワークを構築する技術を用い、Docker自身がマルチホストネットワークに対応したので、今度はそちらで構…

Prefix Query の注意

概要 ElasticsearchのPrefix Query を使用する時に詰まったところをまとめました。 環境 Elasticsearch 2.3.2 通常の利用方法 マッピング・データ用意 マッピングを設定します。 項目 設定値 インデックス名 test タイプ名 internet フィールド名 name で設…

Docker Swarmでマルチホストでクラスタ構築

概要 Docker Swarmでマルチホスト環境上でDockerクラスタを構築します。 事前知識 Docker Swarmで構築する際は以下の3つの要素が必要になります。 ノードを管理するDiscovery backend Swarm Manager(マスターノード) Swarm Node(子ノード) 環境 Docker …

Docker Compose で複数コンテナを管理

概要 単一ホスト上で複数のコンテナを起動するときはDocker Composeを使うのが便利です。 今回はその基本的な使い方を紹介します。 環境 Docker 1.11.0 Docker-Compose 1.7.0 Docker Composeのメリット 複数コンテナを管理しやすい スケールアウト、スケール…

Consulを使ってみる

概要 Consulというサービス・ディスカバリツールを使います。 クラウド時代ではオートスケールなどサーバの台数やIPが変動することが多いため、動的に検知できる必要がありConsulはそのためのツールです。 またConsulを通してどのサーバ上でどのようなサービ…

Docker Data Volume を理解する

概要 Dockerのデータをホスト側に保持する方法をまとめます。 Dockerはコンテナの破棄・再作成が簡単にできる一方、そのままだとデータも消えてしまいます。 今回のDate Volumeはデータの永続性を保つべきシーンで必要となる知識です。 環境 OSX 10.11.4 doc…

GoでDependency Injection

Go

概要 「Dependency Injection=依存性の注入」と言われますが、依存したオブジェクトを外部から入れることで何がメリットなのかを感じ取るのは実際に書いてみて分かると思うので、勉強としてまとめてみました。 Dependency Injectionとは デザインパターン …

GoのRace Detectorでマルチスレッドでのデータ競合検知

Go

概要 Go1.6からマップへの同時アクセスを検知する機能が追加されました。 しかしそれ以前からrace detectorが標準で備わっているため、複数のスレッドによる同時アクセスで起こるデータ競合の検知はできます。 今回はその使い方を紹介します。 環境 Go 1.6 …

GolangでGooglePlayの課金レシートの署名検証

概要 GooglePlayでは課金処理の実行時に署名を発行してくれるため、そのレシートが正規のレシートかどうかを検証する事が可能です。 今回はGolangでその検証ロジックを実装してみます。 環境 Golang 1.6 必要な情報 以下の3つが必要になります。 1. アプリ…

Bool Query と Dis Max Query の違い

概要 Bool QueryとDis Max Queryの違いが曖昧だったのでちゃんと調べました。 環境 Ubuntu 14.04 Elasticsearch 2.2.0 データ投入 curl -s -XPOST localhost:9200/my_index/my_type/_bulk -d ' {"index": {"_id": "1"}} {"title": "Quick brown rabbits", "b…

SlackにRSSのフィードを通知させる

概要 「SlackにGithubのリリース通知を飛ばしたい」と思い、やり方としてgithubのreleasesのRSSフィードをSlackへ飛ばす方法があったので紹介します。 手順概要 Slackへintegrationの追加 githubのreleaseのRSSフィードを用意 RSSフィードを設定

React.js+Babel+webpackでfizzbuzz

概要 React.jsを勉強しようと思って簡単なfizzbuzz表示するだけのものを作ってみました。 github.com 動作ページはこちら 役割 ツール名 役割 React.js UIを構築するためのライブラリ。フレームワークではない。 Babel ES6など新しい記法を既存のブラウザで…

Babel6でトランスパイル

概要 React.jsの勉強している時にBabelというツールを皆さんが使っていてどんなツールか知らなかったのでまとめてみました。 環境 Babel 6.5.2 Babelとは BabelはES6やES7など、新しいJavaScriptの仕様で書かれたソースコードを現状のブラウザで使用できるよ…

検索時に複数のクエリでスコアを付ける その2

概要 前回と同じく、検索した時に「部分一致させたいけど、上位に出るのは前方一致してるものがいいなぁ」といった時の対応。 今回はcopy_toを使います。 元々の経緯としてはフィールド構造が異なる複数の対象に対してTopHitsクエリを用いていたのですが、何…

Amazon Cloud Drive で暗号化して保存する

概要 Amazon Cloud Driveを暗号化して扱う方法です。 ※ファイルの追加、更新はできますが削除ができません 考え方 基本的なデータの流れは以下です。

CuratorでElasticsearchのインデックスを削除

概要 Kibanaを使う上でデータ容量が問題になってきます。 可視化やログ調査に必要な分のみ残し、古いインデックスを定期的に削除する必要があります。 Curatorはそのためのツールです。 環境 Elasticsearch 2.2.0 Curator 3.4.1

Elasticsearch plugin 作成方法 [2.x]

概要 前回は1.x系のプラグインの作成方法を書きました。 今回は2.x系の作り方を勉強します。 完成形は以下 github.com 環境 Ubuntu 14.04 Elasticsearch 2.2.0 1.xとの違い 1.xはmaven、2.xはgradleでやるのが主流 2.xからAbstractPlugin => Pluginに変更 pl…

Elasticsearch plugin 作成方法 [1.x]

概要 Elasticsearchのプラグインの作成方法です。 1.xと2.xで色々と変更があるので、まずは1.xの作り方を学んでみます。 完成形は以下 github.com 環境 Ubuntu 14.04 Elasticsearch 1.4.5 プロジェクト作成 mavenからスケルトンコードを生成することができる…

encfsでファイルの暗号化

概要 クラウドにファイルをバックアップする場合、できれば暗号化したいのですがVeraCryptなどでは1ファイルを変更しただけでボリューム全てをアップロードし直しになり現実的じゃありません。かといって全て暗号化zipなどにすると、使う上で不便極まりない…

Amazon Cloud Driveをコマンドラインで操作する

概要 amazon.co.jpの方は写真のみですが、amazon.comの方ではAmazon Cloud Driveが容量無制限プランを用意しています。 こちらはDropboxとは異なり、ローカルPCとの同期型でなくファイルをクラウド上にどんどん送り込むタイプのもので、公式が用意しているア…

UnionFS で Docker のレイヤ構造を理解する

概要 DockerではAUFSという技術が使われています。 こちらはUnionFS(ディレクトリを重ね合わせることができる)の一つで、親のファイルシステムをすべてReadOnlyにして、その上に書き込み可能なレイヤを重ねて1つのファイルシステムのように扱います。 Docker…

TerraformでAutoScaling環境の構築

概要 Terraformを使ってAutoScaling環境を構築します。 以下の状態をゴールとします デフォルト1台 CPUが30%超えたら1台増やす CPUが5%以下なら1台減らす 環境 Terraform 0.6.9 Terraform設定 セキュリティグループなどはTerraformでAWSのセキュアな構成…

Kibanaの運用で注意すること

概要 Kibanaをログ可視化&検索として扱う上でいくつかの問題が生じたので、その時の対処方法をまとめます。 ログ可視化という用途であればレスポンス速度などの優先度は下げられるため、以下の対応が可能になります。 環境 Ubuntu 14.04 Elasticsearch 2.1.…

NginxのアクセスログをKibanaで可視化

概要 Nginxのアクセスログを用いて可視化の流れをまとめます。 mappingは手動で設定します。 環境 Ubuntu 14.04 fluentd 0.12.19 fluent-plugin-elasticsearch 1.3.0 Nginx 1.4.6 Elasticsearch 2.1.1 Kibana 4.3.1 構成 IP 名前 役割 192.168.33.100 web We…

Elasticsearch2.1 × Kibana4.3 の導入

概要 可視化ツールとして有名なKibanaについてです。 Kibana 4.3 では Elasticsearch 2.x が必要なのでインストール方法をまとめました。 環境 Ubuntu 14.04 Elasticsearch 2.1.1 Kibana 4.3.1 Elasticsearch2.xのインストール ElasticSearch 2.x のインスト…

最新のDockerをインストール

概要 Ubuntuのデフォルトパッケージはすでにsupportされていないため、公式サイトのやり方で最新のものを入れます。 環境 Vagrant 1.8.0 Ubuntu 14.04 Docker 1.9.1 事前準備 Ubuntu Wily 15.10 Ubuntu Vivid 15.04 Ubuntu Trusty 14.04 (LTS) 上記のバージ…

GrafanaでSensuのモニタリングを可視化

概要 Sensuはサーバを監視してアラートを鳴らすことはできますがそのデータを可視化することはできません。 なのでそれを可能にするGrafanaを扱います。 環境 Ubuntu 14.04 Sensu 0.21.0 InfluxDB 0.9.6 Grafana 2.5.0 サーバ構成 サーバ IP Sensu-Server 19…

Sensu クライアントインストール

概要 Sensuのクライアント側です。 簡単のため、RabbitMQの通信にSSLは導入していません。 環境 Ubuntu 14.04 Sensu 0.21.0 サーバ構成 サーバ IP sensu-server, rabbitMQ 192.168.33.100 sensu-client 192.168.33.101