Amazon MSK Serverlessがパブリックプレビューで登場しました #reinvent

2021.12.01

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

いわさです。

AWS re:Invent2021のキーノートでAmazon MSK Serverlessが発表されました。
こちらは既にパブリックプレビューになっているのでお試し頂くことが可能です。

Introducing Amazon MSK Serverless in public preview

MSK Serverless

従来はAmazon MSKはVPCリソースとしてノードを作成し、仮想マシンと同様に運用を行う上ではブローカーノードの管理や監視を行う必要がありました。
今回発表されたサーバーレースクラスターでは従来のようにApache Kafkaを使用しながら、クラスターのサイズ設定やスケーリングなどから解放されます。

逆に、サーバーレスとなると管理・変更できない点も気になるところだと思います。
従来のクラスタータイプと異なる点としては認証はIAMのみとなっています。
最近追加されたパブリックアクセス機能も提供されていません。 またブローカー構成は現時点では以下以外は変更出来ないとされています。

  • cleanup.policy
  • compression.type
  • max.message.bytes
  • message.timestamp.difference.max.ms
  • message.timestamp.type
  • retention.bytes
  • retention.ms

後述しますが、料金についても従来のブローカーインスタンスの使用時間ベースから変わっています。

性能・上限

パブリックプレビュー時点での性能・上限値は以下のようになっています。
特徴的なのはクラスターに複数VPCを接続出来る点でしょうか。

項目 最大値
入力スループット 200Mbps
出力スループット 400Mbps
クライアント接続数 1000
最大メッセージサイズ 8MB
最大リクエストサイズ 100MB
パーティション 120
クライアントVPC 5

1アカウントあたりのサーバーレスクラスターは現時点で1つまでです。

ためしてみた

本日時点では、米国東部 (オハイオ)リージョン(us-east-2)でのみ利用可能です。

MSKのクラスター作成画面を見てみると、新たにクラスタータイプの選択が追加されています。
従来はここでブローカーノードの数やスペックを決める必要がありましたが、サーバーレスはクラスタータイプを選択するだけです。楽ですね。

クラスタータイプ選択後にネットワークとセキュリティ情報を設定します。
サブネットはマルチAZで指定する必要があります。 サーバーレスクラスターの場合は複数のVPC設定を追加することが出来ます。

現時点で認証はIAM認証のみです。
ですので、IAMポリシーでアクセス制御が必要になります。

本日時点でSASL/SCRAM認証やmTLSは選択出来ません。

5分ほどでサーバーレスクラスターは作成されます。
ブートストラップサーバーを確認してみます。

セキュリティグループのインバウンドで9098を許可しておきましょう。
また、このエンドポイントは内部DNSのプライベートIPアドレスで解決されるのでVPC外部からはアクセス出来ません。
もしかしたらNLBだと出来るかもしれない。今度試してみます。

sh-4.2$ nslookup boot-75njtxwv.c1.kafka-serverless.us-east-2.amazonaws.com
Server:         172.31.0.2
Address:        172.31.0.2#53

Non-authoritative answer:
boot-75njtxwv.c1.kafka-serverless.us-east-2.amazonaws.com       canonical name = vpce-0508dd026d90e55d1-bj5lerba.vpce-svc-05e4c72627dde0f5b.us-east-2.vpce.amazonaws.com.
Name:   vpce-0508dd026d90e55d1-bj5lerba.vpce-svc-05e4c72627dde0f5b.us-east-2.vpce.amazonaws.com
Address: 172.31.19.196
Name:   vpce-0508dd026d90e55d1-bj5lerba.vpce-svc-05e4c72627dde0f5b.us-east-2.vpce.amazonaws.com
Address: 172.31.7.113

クライアント作成:トピック作成とプロデューサーパフォーマンステスト

EC2でクライアントをセットアップします。
ドキュメントに従って、プロデューサーからのパフォーマンス測定までを行ってみます。

sudo yum -y install java-11
sudo wget https://archive.apache.org/dist/kafka/2.8.1/kafka_2.12-2.8.1.tgz
sudo tar -xzf kafka_2.12-2.8.1.tgz
cd kafka_2.12-2.8.1/libs
sudo wget https://github.com/aws/aws-msk-iam-auth/releases/download/v1.1.1/aws-msk-iam-auth-1.1.1-all.jar
cd ../bin
sudo vi client.properties

client.properties

security.protocol=SASL_SSL
sasl.mechanism=AWS_MSK_IAM
sasl.jaas.config=software.amazon.msk.auth.iam.IAMLoginModule required;
sasl.client.callback.handler.class=software.amazon.msk.auth.iam.IAMClientCallbackHandler
sh-4.2$ export BS=boot-75njtxwv.c1.kafka-serverless.us-east-2.amazonaws.com:9098
sh-4.2$ ./kafka-topics.sh --bootstrap-server $BS --command-config client.properties --create --topic hoge-msk-serverless --partitions 6
Created topic hoge-msk-serverless.
sh-4.2$ ./kafka-producer-perf-test.sh --topic hoge-msk-serverless --throughput 2560 --num-records 153600 --record-size 4096 --producer-props bootstrap.servers=$BS acks=all --producer.config client.properties
12790 records sent, 2558.0 records/sec (9.99 MB/sec), 455.7 ms avg latency, 1499.0 ms max latency.
12812 records sent, 2561.4 records/sec (10.01 MB/sec), 3.6 ms avg latency, 21.0 ms max latency.
12803 records sent, 2560.1 records/sec (10.00 MB/sec), 3.7 ms avg latency, 34.0 ms max latency.
12800 records sent, 2560.0 records/sec (10.00 MB/sec), 3.6 ms avg latency, 41.0 ms max latency.
12803 records sent, 2560.1 records/sec (10.00 MB/sec), 3.7 ms avg latency, 26.0 ms max latency.
12807 records sent, 2560.9 records/sec (10.00 MB/sec), 3.5 ms avg latency, 30.0 ms max latency.
12802 records sent, 2560.4 records/sec (10.00 MB/sec), 3.5 ms avg latency, 25.0 ms max latency.
12811 records sent, 2561.2 records/sec (10.00 MB/sec), 3.5 ms avg latency, 24.0 ms max latency.
12800 records sent, 2559.5 records/sec (10.00 MB/sec), 3.5 ms avg latency, 26.0 ms max latency.
12805 records sent, 2560.5 records/sec (10.00 MB/sec), 3.5 ms avg latency, 37.0 ms max latency.
12805 records sent, 2560.5 records/sec (10.00 MB/sec), 3.8 ms avg latency, 27.0 ms max latency.
12762 records sent, 2416.6 records/sec (9.44 MB/sec), 3.5 ms avg latency, 306.0 ms max latency.
153600 records sent, 2546.250249 records/sec (9.95 MB/sec), 41.23 ms avg latency, 1499.00 ms max latency, 3 ms 50th, 105 ms 95th, 1044 ms 99th, 1187 ms 99.9th.

ベーシックなconsole-producerとconsole-consumerも試してみたかったのですが、追加の設定が必要なようなので別の機会にやってみます。

料金

従来はブローカーノードの起動時間とストレージ料金で決まっていました。
サーバーレスクラスターの場合は、クラスターとパーティションの時間ごとのプロビジョニング料金と、プロデューサーとコンシューマーのGiBあたりのデータ入出力量で課金されます。
使わなかった場合ブローカーノードの料金は発生しませんが、クラスターのプロビジョニング料金は発生する形ですね。

早速料金ページにもサーバーレスの項目が追加されていますので試算してみてください。(英語のみ)

まとめ

従来はブローカーノードの管理および監視が必要だったのですが、サーバーレスでそういった部分から解放されるのは嬉しいですね。
スループット要件を予測出来ないワークロードなどに向いていそうです。
MSKはノード管理が必要というだけで他のサービスよりも少し敷居が高いイメージがあった気がします。(個人的に)

料金についてはAurora Serverlessのように完全に使った分というわけではなくサーバーレスクラスターがプロビジョニング期間は時間課金で料金が発生する部分があるので注意が必要です。
また管理が楽になる分、制約や制限もあるのでそのあたりも踏まえて有効活用できそうかの検討が必要ですね。