Monday, October 3, 2016

nginx で ngx_http_geoip_module を利用して国別アクセス制御を行う

nginx Module ngx_http_geoip_module
http://nginx.org/en/docs/http/ngx_http_geoip_module.html

nginxのngx_http_geoip_moduleモジュールを利用して、国を指定してアクセス制御をします。
フィルタリング用のデータは、MaxMindのGeoIPオープンソースデータを利用します。
日本だけにコンテンツを配信したい、もしくは、特定の国からのアクセスを拒否したい、といったときに使えるとおもいます。
環境は、CentOS 6です。

以下、セットアップ方法です。

GeoIPデータベースを準備

GeoIPデータベースと更新コマンドをインストール。
# rpm -ivh http://ftp-srv2.kddilabs.jp/Linux/distributions/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
# yum install GeoIP geoipupdate
GeoIPデータベースファイルが設置されたことを確認。
# stat /usr/share/GeoIP/GeoIP.dat

nginxを準備

nginxをインストール。
# rpm -ivh http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm
# yum install nginx nginx-module-geoip
# nginx -v
nginx version: nginx/1.10.1
nginx設定パラメータにhttp_geoip_moduleが入っているか確認。GeoIPは、動的モジュールとして有効化できるようになっています。
# nginx -V
--with-http_geoip_module=dynamic
nginx動的モジュールの共有オブジェクトファイルが設置されているか確認。
# ls /etc/nginx/modules/
ngx_http_geoip_module-debug.so  ngx_http_geoip_module.so

nginx設定

カントリーコードはこちらのURLを参考にします。
http://dev.maxmind.com/geoip/legacy/codes/iso3166/

load_moduleを追記。modules/ngx_http_geoip_module.soを指定します。
events {} ブロックより上に記述するのがポイントです。
# emacs /etc/nginx/nginx.conf
user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

load_module modules/ngx_http_geoip_module.so;

events {
    worker_connections  1024;
}

http {} ブロックを編集。
includeより上に記述します。
アメリカ(US)と日本(JP)からのアクセスを拒否する場合。
# emacs /etc/nginx/nginx.conf
    geoip_country /usr/share/GeoIP/GeoIP.dat;
    map $geoip_country_code $allowed_country {
        default yes;
        US no;
        JP no;
    }
日本(JP)と韓国(KR)からのアクセスを許可、他の国からのアクセスを拒否する場合。
# emacs /etc/nginx/nginx.conf
    geoip_country /usr/share/GeoIP/GeoIP.dat;
    map $geoip_country_code $allowed_country {
        default no;
        JP yes;
        TW yes;
    }

server {} ブロックを編集。
allowed_countryがnoだったらステータスコード403を返します。
# emacs /etc/nginx/conf.d/default.conf
    if ($allowed_country = no) {
        return 403;
    }


nginx再起動

nginxをリスタート、またはリロード。
# /etc/init.d/nginx restart
ブラウザなどでアクセスして確認しましょう。思い通りにアクセスコントロールできたでしょうか?

GeoIPデータベースを更新するには?

GeoIPデータベースをアップデートをするには、以下のコマンドを叩きます。定期実行するようにしましょう。
# geoipupdate -v

ELBの場合は?

AWSを使っている場合、ELBを前段に置く場合がほとんどだとおもいます。
ELBからのヘルスチェックでサーバに来るアクセスは、内部IPアドレスのため、国で判別することができません。そのため、VPC内のIPアドレスからアクセスが来た時には、制限をスルーするようにnginxを設定します。

以下の設定では、ELB経由のアクセスから、アクセス元IPアドレスを取得。ELBのヘルスチェックのアクセスを許可、日本からのアクセスを許可、ほかの国は拒否としています。
ついでに、アクセスログにGeo情報を出力するようにしています。



Top image from いらすとや

Wednesday, September 7, 2016

Rundeckをインストールして立ち上げる

http://rundeck.org/
高機能ジョブスケジューラの『Rundeck』を立ち上げるまでの記録です。
使い方は説明しません。
cronに飽きた。つらい。ジョブフローをうまく設定したい。もしくは、もっと高機能なことがしたい、といった欲求があるときに使われていようです。
ただ単に、時間通りバッチを動かしたい、ブラウザで操作できるGUIが欲しいときにはJenkinisで十分こと足りるとおもいます。なれている道具を使いましょう。
インストール環境は、CentOS 6です。

yumでJAVA OpenJDK 8と、Rundeckをインストール
# yum install java-1.8.0
# rpm -Uvh http://repo.rundeck.org/latest.rpm 
# yum install rundeck 
バージョンを確認
# java -version
openjdk version "1.8.0_101"
# yum list installed | grep rundeck
rundeck.noarch        2.6.9-1.21.GA     @rundeck-release-bintray
rundeck-config.noarch 2.6.9-1.21.GA     @rundeck-release-bintray
rundeck-repo.noarch   4-0               installed
Rundeckの設定ファイルを編集
ホスト名を設定。デフォルトではloaclhostとなる。
loaclhost -> myhost
# emacs /etc/rundeck/rundeck-config.properties
grails.serverURL=http://localhost:4440
->
grails.serverURL=http://myhost:4440
Rundeckのデーモンをスタート
# service rundeckd start
ログを確認
# tail -f /var/log/rundeck/rundeck.log /var/log/rundeck/service.log
しばらく待つと、アクセスできるようになります。
# curl -v 127.0.0.1:4440/user/login

ブラウザで開いてみましょう。
http://myhost:4440/
Username: admin
Password: admin
ログインできたら成功です。

参考資料

バックアップ

Backup and Recovery
http://rundeck.org/docs/administration/backup-and-recovery.html

データベース変更

デフォルトのデータベースだと、ジョブの数が多くなると負荷が上がるそうなので、MySQLを使ったりして解決できるそうです。

Setting up a RDB Datasource
http://rundeck.org/docs/administration/setting-up-an-rdb-datasource.html
Rundeckインストールと設定メモ - Qiita
http://qiita.com/nagase/items/70070d79454ac96aa5a5
Rundeck との闘争 - 日々是ウケ狙い
http://ndx.hatenablog.jp/entry/2016/02/12/225753

Slack連携

higanworks/rundeck-slack-incoming-webhook-plugin: A Rundeck Plugin for Slack Incoming-WebHook
https://github.com/higanworks/rundeck-slack-incoming-webhook-plugin
Rundeck Config・ジョブ通知・Mysql の設定編 - 僕とコードとブルーハワイ
http://equal-001.hatenablog.com/entry/2016/03/26/223000

その他

Rundeck - Google スライド
https://docs.google.com/presentation/d/1PKJ0iT-eS0oT4ILwJNvPkLFHWcqnRPsMY07kCb72tdk/edit#slide=id.p
cronからRundeckに移行するためのモチベーションが書かれています。

サーバが増えた時にインフラ担当者がやってきたこと - Qiita
http://qiita.com/hiracy/items/c8bfb69ff624d4b711e4
デプロイ集約サーバとしてRundeckを使っていて面白い。


Top image from http://rundeck.org/ by SimplifyOps

Tuesday, September 6, 2016

Google NEXT Tokyo 2016 メモと少しの感想

https://cloudplatformonline.com/NEXT2016-Tokyo.html
NEXT Tokyo 2016 - Google Cloud Platform カンファレンスに行ってきました。事例紹介を中心にみてきました。メモと若干の感想です。

♯キーノート

Room A
座席数600ほど。満員。

GCP リック・ハシューマン
・国内パートナーの紹介。
感想…少ない。20社ほど。
私見…国外サーバはレイテンシ高すぎて、エンドユーザーから繋いでもらうには遠すぎる。広告配信サーバや、低レイテンシが必要なAPIサーバとしては、遅すぎて使えない。今のところ計算用途でしか使えない。
・Q4で東京リージョンをローンチ。準備中。ハードはすでに持ってきた。

GCP コーネリアス・ウィルス
・目新しい情報なし。
・コストなどの話。
感想…AWS引き合いに出すのはダサい。

GCP マイルズ・ワード
・データセンターの話。ちゃんとやってます。と言う話。
・リージョン間のネットワークは専用線。
・Stackdriver(監視ツール)使ってね。
感想…AWS disダサい。とはいっても、観測しちゃった値だから、しようがないですね。。
・Datalabの話。データ分析のやり方の提案。

サイバーエージェント 長瀬
・AbemaTVでGCPを使っている。東京リュージョンに期待とのこと。
感想…リージョンの移行が大変そう。

GCP ナカイ
・Kubernetesの話。デプロイ簡単、複数リージョンでもうまくコントロールできるから使ってね。

リクルート 前田
・データ分析でGCPを使っている。とくにBigQuery。

GCP 塩入
・フレッシャーズ・サービス開始アナウンス。コンサルティング、サポートのようなもの。

♯データ&分析(Google の機械学習技術で実現する「賢い」アプリケーション)

Room A
座席数600ほど。8割くらいの入り。

Google 井上
・機械学習のチューニング、あらかじめうまくいくようにできてますよ。というお話。
・機械学習の事例紹介。クレジットカードの不正利用を検知。

オモロキ 鎌田
・Vision API 画像認識の事例。
不健全な投稿画像へのフィルタで利用。エンドユーザーが投稿するときに、都度、フィルタリングできるようになった。人力削除の仕事が40%減ってうれしい。
投稿のラベル付け、カテゴリ付けにも利用。

ブレインパッド 下田
・会社紹介

♯事例紹介(管理いらずの GCP でサービスに集中する方法)

Room C
座席数150 満員

オールアバウト 中村
・オンプレ環境からGCPへ移行した。
オンプレ運用でよくあるつらい運用から開放されたかった。
・なぜ移行したか?
AWSと比べて割安。台湾リュージョンのレイテンシ、ping 40msがあっても問題ないサービスを運用するため。
疑問…オンプレ環境のKVSではFusion ioMemory使っている図だったけど、GCPでのKVSはどうしている?GCEに載せている?それとも?

ノハナ 武市
・Parse.comからGCPへ移行した。
Parse.comサービス終了に伴ってGCPへ移行した。
KVSは、MongoDBを使っていた。GCPでもGCEにMongoDBを載せている。
・なぜ移行したか?
コストの安さ。GCPのデータ分析サービスを使ってみたい。

プレイド 後藤
・AWSからGCPへ移行した。
GCPではストリーム処理、BigTable、BigQueryをよくを使っている。
・なぜ移行したか?
CGPは、大量データ処理サービス、ロードバランサが強かった。
・苦労しているところ。
移行時のAWS、GCPデータセンター間のネットワークコスト。サポートのレスポンスが遅い。

要望…Cloud Datastoreの事例を聞いてみたい。

♯事例紹介(ゲーム業界の方必見!GCP のすごいところ)

Room B
座席数300満員

GCP 橋口
・GCP触ったことがない人?挙手1/3。

サイバーエージェント 白石
・2013からGAEを使っていた。
・デプロイ、開発環境の構築がつらかった。Kubernetesを使った開発スタイルをすすめている。
・チケット番号とポート番号をあわせて開発。
感想…えっ。。

Aiming 野下・芝男
・BigQueryを使ってデータ分析をしている。
社員がデータを見てくれない悩み。勉強会、社内報をがんばった。
・なぜGCPを使っている?
アジア向けサービス展開、GCE、CloudSQL。コスト安。
・国内ではAWSを使っている。GCP東京リュージョンがローンチしたら移行予定。

gumi 板倉
・BigQuery、GCSを使っている。
行動ログのデータ構造がよく変化するので、String JSONで保存。

感想…みなさんBigQuery、GCS使っていてツライところがあるはず。そこを聴きたい。
個人的にGCSを使っていて、たまにデータ入らないときがあった。つらい。

♯事例紹介(成長企業の GCP 活用法)

Room A
座席数600ほど。8割くらいの入り。

GCP 中澤
・GCP触ったことがある人?挙手2、3割くらい。

メルカリ 鶴岡
・BigQuery、Cloud Datalabを使っている。
・メルカリアッテ。すべてGAEを使っている。
グローバルにスケールしたい。JP、US、APAC。
アプリケーションのソースコードは共通。単一データベース。
疑問…データベースは何を使っている?
・サポート窓口が充実している。担当者がいて、すぐに回答が得られる。
疑問…会社によってGCPのサポートの質が違うような気がする。プレイドの事例では、サポートが遅いと言われていた。プランによって変わる?

ディー・エヌ・エー 小林
・AndAppでGCPを使っている。PC向けプラットフォーム。
いままでオンプレ中心だったけど、新しいテクノロジーを取り入れたい。現場のモチベーションが上がる。
インフラ運用負荷の小さいクラウドを使いたい。GAE Standard Environment。Firebase。BigQuery。
・今後、GAE Flexible Environmentに移行するか悩みどころ。

VOYAGE GROUP 西林
・Zucus AdNetwork、fluct、ECナビでGCP利用。
・BigQueryを使っている。投入データ量600GB/day。MySQLのデータも投入。
・BigQuery使用ログもBigQueryに入れる。使いすぎ検知。コストリミットを設定してアラート。
・月に一度くらいBigQuery調子悪いときがある。バッチをリトライできるようにしておく。安定している前提で設計しない。

感想…サーバサイドアプリケーションを、AWS・オンプレからGCPに移行する会社は、GCEを使って、新規サービスを立ち上げる会社はGAEを使う印象でした。