読者です 読者をやめる 読者になる 読者になる

LIFULL Creators Blog

「株式会社LIFULL(ライフル)」の社員によるブログです。

zipkinのバックエンドをAmazon Elasticsearch Serviceに変更してみた

こんにちは、AmazonESでElasticsearch2.3を使っての環境構築が終わった直後にElasticsearch5.1が利用可能になってショックを受けてる技術基盤部の磯野です。

ちょっとだけ時間ができたのでzipkinのバックエンドをAmazon Elasticsearch Serviceに差し替えてみました。

CassandraとElasticsearchどっちにしようかなぁと悩んでいたのですが、zipkinがいつの間にかElasticsearch Serviceに対応していたのでサーバー構築したくない病発症中のためノータイムでElasticsearch Serviceに決定しました。

まずは今回やったことまとめです。

Amazon Elasticsearch Serviceの起動

Elasticsearch domain nameはzipkin, Elasticsearch versionに(当時)最新の2.3を利用しています。

アクセスポリシー

以下のように設定しています。

zipkinの動いているEC2インスタンスのロールとsnapshotを取得するためのlambdaのロール、そしてkibanaの為に社内からのアクセスをIPで許可します。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": [
          "arn:aws:iam::[account-id]:role/zipkin-server",
          "arn:aws:iam::[account-id]:role/zipkin-snapshot-lambda"
        ]
      },
      "Action": "es:*",
      "Resource": "arn:aws:es:ap-northeast-1:[account-id]:domain/zipkin/*"
    },
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "AWS": "*"
      },
      "Action": "es:*",
      "Resource": "arn:aws:es:ap-northeast-1:[account-id]:domain/zipkin/*",
      "Condition": {
        "IpAddress": {
          "aws:SourceIp": "[office-ip-address]"
        }
      }
    }
  ]
}

zipkinサーバーの設定

以前こちらで記載したのとほとんど変わりません、最新版をインストールし、必要な環境変数を指定して起動します。 ES_AWS_DOMAIN, ES_AWS_REGIONを指定することでインスタンスのIAMロール利用して自動的にホスト名を取得してくれます。

sudo STORAGE_TYPE="elasticsearch" ES_AWS_DOMAIN="zipkin" ES_AWS_REGION="ap-northeast-1" java -jar /opt/zipkin/zipkin.jar

zipkinサーバーのIAM Roleの設定

ES_AWS_DOMAIN, ES_AWS_REGIONからホスト名を取得するためにzipkin-serverのロールに権限付与が必要です。 (ホスト名[ES_HOSTS]で指定すればこの設定は不要です。)

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Stmt1484898974000",
            "Effect": "Allow",
            "Action": [
                "es:DescribeElasticsearchDomain",
                "es:DescribeElasticsearchDomains"
            ],
            "Resource": [
                "*"
            ]
        }
    ]
}

設定を変更してみて

インスタンスの負荷の減少

f:id:nextdeveloper:20170224100003p:plain

見て分かる通り1/25前後で入れ替えています。 CPU負荷も減り、トレースデータを受け付けるインスタンスの台数も減らせています。

コスト削減

EC2インスタンスの台数を半分にしました。 またESについてはRDSの時よりも台数は増えましたが小さいインスタンスにしたため、コストとしては半分程度になっています。

f:id:nextdeveloper:20170224111435p:plain

検索高速化

MySQLの時に比較して高速にレスポンスが返却されるので負荷を気にせずに検索できます。

ServiceName,SpanNameの取得が遅い問題

MySQLの時はSQLのチューニングとテーブルにインデックスを張って高速化していたのですが、Elasticsearchのことがまだわかっていないので、どうしたらいいかわからず遅いままです。 検索と同様、チューニングできると思うので今後考えていきたいと思います。