つよくなるブログ

その場にとどまるためには、全力で走り続けなければならない

Application Load Balancer のアクセスログはベストエフォート

背景

クライアントからのリクエストと ALB のアクセスログが微妙にあっていないなと感じて

「Application Load Balancer(以下, ALB) -> EC2 でリクエストを処理しているアプリケーションがあり,

(AWS 基盤の何らかの問題で) ALB に到達していないリクエストがあるのではないか」

という内容で AWS サポートの方に質問して知った話.

ALB のアクセスログ

docs.aws.amazon.com

公式ドキュメントの"アクセスログのエントリ"に以下の記載があった.

Elastic Load Balancing はベストエフォートベースでリクエストを記録します。アクセスログは、すべてのリクエストを完全に報告するためのものではなく、リクエストの本質を把握するものとして使用することをお勧めします。

ベストエフォート?

ベストエフォート - インターネット用語辞典 - | OCN

ベストエフォートとは、性能に関して明示的な保証をせずに、最大限(ベスト)の努力(エフォート)サービスを提供するという形態のことです。IT用語としては、一般にネットワークの実効速度について使われます。

= できるだけ頑張るけど、確実でない.

厳密なリクエスト到達やログの分析とかは想定していなく, 「こんな感じのリクエスト来てるんだなー」と確認する用途を想定して用意されている機能のようだ.

まとめ

ALB のアクセスログになくても, リクエストが到達している場合がある.

AWS ElastiCache のエラーから Redis の永続化について調べた

きっかけ

AWS ElastiCache で Redis のクラスタを作成したときに, 以下の警告文がイベントに出力されていて気になった.

This cache cluster does not support persistence (ex: 'appendonly').
Please use a different instance type to enable persistence.

「現在のクラスタでは永続化がサポートされていないので, 別のインスタンスを使おう」

環境

  • AWS ElastiCache
  • Redis 3.2.10
  • ノードのインスタンスタイプ: cache.t2.small

AOF とは?

Redis の AOF (Append-Only File) 機能を有効にすることができます。この機能を有効にすると、キャッシュノードは、キャッシュデータを変更するすべてのコマンドを Append-Only File に書き込みます。

MySQL でいう Binary Log, PostgreSQL でいう WAL Log.

Redis サーバが受けた全てのコマンドが記録されており, サーバ起動時にログからコマンドが実行され元のデータが再構築される.

結論

今回の警告の原因はスペック不足.

AOF (Append Only File) は、cache.t1.micro ノードおよび cache.t2* ノードではサポートされません。

AOF では I/O 処理が発生するので, ある程度のパフォーマンスが出るインスタンスでないと

安定した挙動が確保できないからだろう(と予測).

参考

docs.aws.amazon.com

Redis の永続化 — Redis Documentation (Japanese Translation)

wercker で redis service を使用する方法

背景

  • CI でのテスト実行時に Redis が動作する環境を用意したい.

  • Redis は AWS ElastiCache で動作している.

  • ElastiCache はデフォルトでは許可された AWS 内のセキュリティグループからのみアクセス可能で, public アクセス可能にするには NAT インスタンス作ったりする必要がある.

docs.aws.amazon.com

wercker.yml に services セクションを追加する

services:
    - redis

他には mongo, elasticsearch などが使える.

追加される環境変数

redis service を追加すると以下の環境変数が追加される.

REDIS_PORT
REDIS_NAME
REDIS_PORT_6379_TCP_ADDR
REDIS_PORT_6379_TCP
REDIS_ENV_REDIS_DOWNLOAD_URL
REDIS_PORT_6379_TCP_PORT
REDIS_ENV_REDIS_DOWNLOAD_SHA
REDIS_ENV_GOSU_VERSION
REDIS_ENV_REDIS_VERSION

重要なのが REDIS_PORT_6379_TCP_ADDR で, 実行環境の Redis の接続先として設定する

const redisHost = process.env.REDIS_PORT_6379_TCP_ADDR || process.env.REDIS_HOST;

注意点

wercker 公式にある DockerHub(sutoiku/redis) を引用する方法だと, Redis 関連の環境変数が設定されず上記設定は使えないので注意.

参考

devcenter.wercker.com

qiita.com

vagrant up のエラー解決策

環境

  • VirtualBox 5.2.0
  • Vagrant 1.8.2

結論

virtualboxのバージョンが新しすぎて、vagrantが対応していなかった(追記)

qiita.com

解決策

vagrant のバージョンを 2.0.2 にあげて, 再度 vagrant init & up

www.vagrantup.com

$ vagrant -v
Vagrant 2.0.2
$ vagrant plugin repair
$ vagrant plugin expunge --reinstall
$ rm Vagranfile
$ vagrant init
$ vagrant up

ffmpeg の Static Build を Linux 環境に導入するワンライナー

TL;DR

gist.github.com

解説

ダウンロード

$ wget https://johnvansickle.com/ffmpeg/releases/ffmpeg-release-64bit-static.tar.xz

展開用のディレクトリ作成

$ mkdir -p ffmpeg-static

1階層目のディレクトリを削って, 展開用ディレクトリに解凍

$ tar xvf ffmpeg-release-64bit-static.tar.xz -C ffmpeg-static --strip-components 1

ffmpeg-release-64bit-static.tar.xz を解凍すると ffmpeg-3.4.1-64bit-static というようにビルドバージョンを含んだディレクトリ名になるので, 1階層目を削って(名前を固定するために)展開用ディレクトリを対象にして解凍する.

コマンドとして使えるように移動

$ sudo mv ffmpeg-static/ff* /usr/bin/
ffmpeg
ffmpeg-10bit
ffprobe
ffserver

関連するコマンドもあわせて移動して完了.