【小ネタ】wrkを利用してSQSのキューに複数のメッセージを送信してみた

2017.06.14

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

こんにちは、中山です。

SQSを利用したWorker構成はAWSのアーキテクチャとしてよく利用されていると思います。SQSのメッセージにジョブを登録しておき、それを監視するWorkerで非同期に処理をさせるという仕組みです。

とてもシンプルかつ安定性のある「枯れた」アーキテクチャです。が、みなさんはどうやってテストしているでしょうか。この場合の「テスト」とはメッセージが溜まった場合にWorkerが本当に処理を実施してくれるのか事前に検証したいという意味です。

一応AWS CLIには send-message-batch という1つのAPIで複数のメッセージを作成するサブコマンドが用意されています。ただ、あまり使い勝手よくないような…とはいえ、AWS SDKでスクリプト書くのも面倒です。

こういった要望に対して今回ご紹介するwrkを使うと解決できそうです。wrkとは「モダン」を謳うCLIベースのベンチマークツールです。マルチコアやスレッドを活用している点が「モダン」とのこと。Luaで機能を拡張することも可能です。

今回wrkを利用してキューへメッセージを送信してみたので簡単にご紹介したいと思います。

検証環境

  • macOS Sierra: 10.12.5
  • Lua: 5.2.4
  • wrk: 4.0.2

インストール

インストールは簡単です。Homebrewで一発です。

$ brew install wrk

やってみる

まずテスト用のキューを作成しておきます。

$ aws sqs create-queue \
  --queue-name wrk-test
{
    "QueueUrl": "https://ap-northeast-1.queue.amazonaws.com/************/wrk-test"
}

LuaにはAWS公式のSDKが現時点で存在していないため、署名バージョン4などを利用して署名プロセスを自分で実装する必要があります。が、Luaでこのプロセスをいい感じに実装する方法がいまいちわからず…Lua力低すぎなので、今回はSQSのアクセスポリシーを変更し、誰でもSendMessage可能にしておきます。Lua界隈からのマサカリを待ちます。

事前に以下のようなJSONファイルを用意しておきます。

  • policy.json
{
  "Policy": "{ \"Version\": \"2012-10-17\", \"Id\": \"arn:aws:sqs:ap-northeast-1:************:wrk-test/SQSDefaultPolicy\", \"Statement\": [ { \"Sid\": \"AllowSendMessage\", \"Effect\": \"Allow\", \"Principal\": \"*\", \"Action\": \"SQS:SendMessage\", \"Resource\": \"arn:aws:sqs:ap-northeast-1:************:wrk-test\" } ] }"
}

set-attributes サブコマンドでキューのパーミッションを変更します。

$ aws sqs set-queue-attributes \
  --queue-url https://sqs.ap-northeast-1.amazonaws.com/************/wrk-test \
  --attributes file://policy.json

変更されたことを確認します。

$ aws sqs get-queue-attributes \
  --queue-url https://sqs.ap-northeast-1.amazonaws.com/************/wrk-test \
  --attribute-names Policy
{
    "Attributes": {
        "Policy": "{\"Version\":\"2012-10-17\",\"Id\":\"arn:aws:sqs:ap-northeast-1:************:wrk-test/SQSDefaultPolicy\",\"Statement\":[{\"Sid\":\"AllowSendMessage\",\"Effect\":\"Allow\",\"Principal\":\"*\",\"Action\":\"SQS:SendMessage\",\"Resource\":\"arn:aws:sqs:ap-northeast-1:************:wrk-test\"}]}"
    }
}

いよいよwrkの出番です。wrkはLuaスクリプトを記述することによりカスタマイズ可能です。サンプルとなるスクリプトはここにまとまっています。今回はPOSTメソッド用のファイルを参考にしてみます。

wrk.method = "POST"
wrk.body = "Action=SendMessage&Version=2011-10-01&MessageBody=wrk-test"
wrk.headers["Content-Type"] = "application/x-www-form-urlencoded"

wrkを実行してみます。

$ wrk -c 5 -d 5 -t 5 -s wrk.lua https://sqs.ap-northeast-1.amazonaws.com/************/wrk-test
Running 5s test @ https://sqs.ap-northeast-1.amazonaws.com/************/wrk-test
  5 threads and 5 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency    20.21ms    7.27ms 103.41ms   96.88%
    Req/Sec    49.04      9.28    60.00     67.76%
  1225 requests in 5.06s, 687.76KB read
Requests/sec:    241.99
Transfer/sec:    135.86KB

各オプションの意味はヘルプに記載されています。

$ wrk --help
Usage: wrk <options> <url>
  Options:
    -c, --connections <N>  Connections to keep open
    -d, --duration    <T>  Duration of test
    -t, --threads     <N>  Number of threads to use

    -s, --script      <S>  Load Lua script file
    -H, --header      <H>  Add header to request
        --latency          Print latency statistics
        --timeout     <T>  Socket/request timeout
    -v, --version          Print version details

  Numeric arguments may include a SI unit (1k, 1M, 1G)
  Time arguments may include a time unit (2s, 2m, 2h)

キューのメッセージ数をみるといっぱい溜まってます。やりましたね。

$ aws sqs get-queue-attributes \
  --queue-url https://sqs.ap-northeast-1.amazonaws.com/************/wrk-test \
  --attribute-names ApproximateNumberOfMessages
{
    "Attributes": {
        "ApproximateNumberOfMessages": "1230"
    }
}

まとめ

いかがだったでしょうか。

wrkを利用したキューへのメッセージ送信についてご紹介しました。CLIで簡単に多くのメッセージを送信できるのは便利ですね。Lua力を高めていきたいと思います。

本エントリがみなさんの参考になれば幸いに思います。