Redshiftで「Check 'stl_load_errors' system table for details.」と怒られた時

このSQLで原因が分かる

SELECT
  starttime,
  TRIM(colname),
  LENGTH(raw_field_value),
  err_code,
  TRIM(err_reason),
  raw_field_value
FROM stl_load_errors
ORDER BY starttime DESC LIMIT 20;

各エラーコードの詳細(日本語)は以下に記載されている。

docs.aws.amazon.com

mailgunのopenのイベントトラッキング(open, click)をユニークにする方法

Mailgun at Partner Palooza

 

mailgunのopenのイベントトラッキングをユニークにする方法を紹介します。

 

mailgunは、デフォルトではメールの開封(open)やメール内でのアクション(click)といったログは取得できませんが、コンソール画面で設定をする事によって取得することが出来るようになります。

 

が、以下の様なパターンがあったとします。

  1. Aさんへのメール送信をリクエストする
  2. メールが無事送信(Delivered)される
  3. Aさんはメールを開いた
  4. 後日、改めてAさんはメールを開いた

このとき、送信数1に対して開封数が2となってしまい、計測としては使えない状態となってしまいます。

 

これを防ぐためにはメールの開封トラッキングをユニークにする(=一意性を持たせる)必要があるのでが、これはタグ機能を使う事によって実現できます。

 

 

Railsで実装するには

railsでmailgunを使ってメール送信をする方法はいくつかありますが、今回はAction Mailerの機能をラップしたmailgun_railsというgemを使ってみます。

 

gist7724c4db8f518350e6c932455f174c3e

 

この様に、タグをオプションとしてつけてあげる事でメールが一意になり、求めている計測結果を得ることができます。

 

f:id:momota10:20170624194047p:plain

 

2つのメールアドレスに送り、それぞれ複数回開いたときの結果です。Unique OpenおよびOpenの二つのデータがきちんとトラッキングされています。

 

なお、この機能はmailgunのブログに記載がありましたので引用しておきます。

Simple open and click counters are not enough to determine how many users your messages are reaching since users often click or open messages multiple times. When you are using tags, we provide unique clicks and opens that give you an exact measurement of how many distinct users are engaging with the messages you are sending.

 

 

blog.mailgun.com

 

github.com

 

User Manual — Mailgun API documentation

【Python】pandas DataFrameのixとilocの違いについて

Python books

pythonライブラリ「pandas」の話。

 

DataFrameを操作する予約語「ix」、「iloc」の違いが分かっておらず、痛い目を見たのでどのような違いがあるのかを残しておきます。

 

gist97eb1fc2b3d1c07760ad542cba523b6a

 

結果がどのようになるかというと...

f:id:momota10:20170608090321p:plain

 

ixではindexのintegerで取得していますが、ilocではinteger関係なく「何行目」なのかで取得しています。

 

「onBeforeunloadHandler」を仕込むとChromeではPage Unresponsiveのエラーが発生する

Google

(ちょっと詰まったのでメモ)

 

JavaScriptの関数にはページのリロードやブラウザの戻るをクリックしたときに、その遷移を防止するためにブラウザのモーダルで可否の確認を出現させる

「onBeforeunloadHandler」

というのがあるのですが、どうもChromeではこの関数を利用すると下のような

「The following page has become unresponsive. You can fot it to become responsive or kill it.」

というエラーが突如現れてきます。

 

f:id:momota10:20170604234239p:plain

確認のモーダル

 

f:id:momota10:20170604234243p:plain

Reload後に出現するエラー

 

ちなみにこれはChromeのバージョンによっては出現しないようで、

58.0.3029.110 (64-bit)

だと出現するのですが、

55.0.2883.87 (64-bit)

だと出ないことが確認されました。

 

Chromeが悪意ある人によるモーダルを表示させまくるといった行為を防止する目的でこのようにしているようです。今後「onBeforeunloadHandler」関数はあまり推奨されるものではないのかもしれません。

 

この現象は下記の執筆現在、下のリンク先にて確認することができます。

blog.yuhiisk.com

 

また、JCBのカード申し込みページにおいても同様の事象が確認できました。

オンライン入会申込

 

 

GitLab CI で「ERROR: Build failed: Get http://unix.sock/v1.18/version: dial unix /var/run/docker.sock: socket: too many open files」と出た時の対処

いつもの様にpushしてCIがpassするのを待っていたら下記の様なエラーに遭遇。

gitlab-ci-multi-runner 1.3.2 (*****)
Using Docker executor with image python:3.5.2-alpine ...

ERROR: Build failed: Get http://unix.sock/v1.18/version: dial unix /var/run/docker.sock: socket: too many open files

このエラーにはgitlab本家にもissueとして上がっており、どうやらgitlab-ci-runnerを再起動すると直るみたいです。
EC2の上に立てていたので、コンソール画面からrebootしてjobをretryしたら問題なく動いてpassしました。

gitlab.com

mailgunのEvent APIによるメールのトラッキングをrubyで実装する

Mailgun at Partner Palooza

 

mailgunでは送信したメールをトラッキングしてくれる機能が標準でついており、APIを使う事によってステータスを取得する事ができます。

 

そこで送信したemailの状態を確認するEvent APIを利用してデータを取得する処理をrubyで実装してみました。

 

コード

 

sample ruby code of mailgun tracking

 

注意点

1. 開封(open)をトラッキングするには別途設定が必要

ドキュメントには下記のように記載されています。

 

The email recipient opened the email and enabled image viewing. Open tracking must be enabled in the Mailgun control panel, and the CNAME record must be pointing to mailgun.org.

CNAMEの設定(向き先は mailgun.org)とtracking settingで「Open Tracking」をONにする必要があるのでこちらを忘れずにやっておきましょう。

 

2. idのユニーク性は1日という期間でしか保証されていない

こちらもドキュメントには

Event id. It is guaranteed to be unique within a day. It can be used to distinguish events that have already been retrieved when requests with overlapping time ranges are made.

と記載されています。気をつけましょう。

 

3. 一回のリクエストで取得できる件数の上限は300

300より大きい数にすると怒られます

 

 

参照

ラッキングの仕様については下記に記載してあります。

Events — Mailgun API documentation

 

簡易的な内容ですがさっと読みたい場合はこちらを。

How to start tracking email events — Mailgun API documentation

【AWS】ELBのログをS3に保存し、Lambdaを利用してElasticsearchにデータ転送。そしてkibanaで可視化。

Amazon

タイトルの通りですが、AWSのサービスを駆使して全てのアクセスログをElasticsearchに突っ込み、kibanaで可視化するというデータ基盤を作る機会があったのでその方法を残しておこうと思います。ちなみにほぼリアルタイムで反映されていくのでlambda archtectureでいうところのspeed layer(スピード層)に相当します。

前提

環境

  • Elasticsearch 5.2.0
  • kibana 5.x

使ったAWSのサービス

  • EC2
  • S3
  • Lambda
  • ELB

概念図

テキストだけだとイメージしにくいので図にしました。

f:id:momota10:20170417170445p:plain

EC2にElasticsearch(=ES)とkibanaを入れて、最終的にはkibanaにアクセスができてデータ閲覧が可能になるという感じです。

ざっくり手順

  • ELBからS3へのログ設定
  • ES, kibana用のEC2作成及びインストール
  • index templateの作成
  • Lambdaの作成

ELBからS3へのログ設定

ログの設定はとても簡単で「EC2 management Console」の左バーにある「Load Balancers」を選択し、対象のELBの「Attributes」にある「Access logs」で設定できます。

f:id:momota10:20170417172415p:plain

  • ELBからS3へのログ転送は5分おきか60分おきかの2択で選べます。
  • あらかじめS3で作成したバケットを指定してprefixが欲しければ任意で設定できます。
  • ログのpathは 「bucket/prefix(任意)/AWSLogs/************/elasticloadbalancing/your-region/2016/04/01/file_name」と結構長いです。なのでprefixは要らないと思いますw

ES, kibana用のEC2作成及びインストール

EC2のセキュリティーグループにおいては 9200(es), 5601(kibana) は許可しておく様にします。 また、t2.micro だとメモリ不足でesが起動しないため、別途ヒープサイズを変更する必要があります。

stackoverflow.com

ESのインストール

$ sudo yum install java-1.8.0-openjdk
$ sudo alternatives --config java
$ java -version

openjdk version “1.8.0_121" //1.8がインストールされていることを確認

$ curl -L -O https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.2.1.rpm
$ sudo rpm -i elasticsearch-5.2.1.rpm

/etc/elasticsearch/elasticsearch.yml に追記する

network.host 0.0.0.0

起動

$ sudo service elasticsearch start


$ curl localhost:9200 //下の様な結果が出ればおk
{
  "name" : "UlhX_go",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : “hogehoge",
  "version" : {
    "number" : "5.2.1",
    "build_hash" : “hoge-hash",
    "build_date" : "timestamp",
    "build_snapshot" : false,
    "lucene_version" : "6.4.1"
  },
  "tagline" : "You Know, for Search"
}

kibanaのインストール

$ sudo rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch

/etc/yum.repos.d/elasticsearch.repo に追記

[kibana-5.x]
name=Kibana repository for 5.x packages
baseurl=https://artifacts.elastic.co/packages/5.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
$ sudo yum install kibana
$ sudo chkconfig --add kibana

/etc/kibana/kibana.yml に追記

server.host: 0.0.0.0
elasticsearch.url: "http://localhost:9200"
$ sudo service kibana start

index templateの作成

ESはデータを突っ込むとよしなにデータ型を決定してくれますが、基本的にstring型です。なので、あらかじめ index もしくは index template を用意しておくと実際にkibanaでESのクエリを組みながらデータ分析をやろうとする時に便利になります。

elbのログフォーマットは設定できるものではなく、従ってデータがesに入るときのフィールド数が同じなのでそこまでマッピングに違いがある訳ではありませんが設定したindex templateを貼っておきます。

gist3c2c089d578d9b61b491a818d3918e99

Lambdaの作成

LambdaではS3にデータが入ったというイベントをトリガーにしてそのデータをEC2に送るという処理を担ってもらいます。これを作る為には

  • LambdaがS3とEC2にアクセスできる様にIAMでロールを作成してアタッチする
  • 実査に処理を行うソースコードを用意する

の2つが必要になります。

ロールについては AmazonS3ReadOnlyAccessAmazonEC2FullAccess の2つがあれば大丈夫ですが、もしEC2がVPC内にある時は AWSLambdaVPCAccessExecutionRole が別途必要です。

ソースコードは下記のスクリプトを参考にendpointを対象のEC2に設定します。

github.com

最後に

  • 設定を終えてenabledにするとesにデータが入っていることをサーバー内で確認出来、kibanaでも見れるかと思います。
  • 以下のリンクはこのデータ基盤を作成する時に役にたった記事です。こちらも合わせて見てみて下さい。特にLambdaの設定は画像付きで詳しく解説してあります。

Ref

ELB のログを Lambda の Node.js で取り込み、Elasticsearch Service の Kibana で可視化する - Qiita

ELBのアクセスログをAWS LambdaでElasticsearchに取り込む | Developers.IO

Install Kibana with RPM | Kibana User Guide [5.0] | Elastic

Installing Elasticsearch | Beats Platform Reference [5.3] | Elastic