SINETStream ユーザガイド
設定ファイル
1. 概要 1.1 設定ファイルの配置場所 1.2 設定値の優先順位 2. 共通のパラメータ 2.1 基本的なパラメータ 2.2 API のパラメータ 2.3 SSL/TLS に関するパラメータ 2.4 暗号化に関するパラメータ 3. メッセージングシステム固有のパラメータ 4. 注意事項 4.1 Python APIとJava APIの違い 4.2 未対応
1. 概要
SINETStream API では、 メッセージングシステムに接続するためのパラメータなどを設定ファイルに記述することにより、 API に指定するパラメータを簡略化できる。 設定ファイルには、サービス名とそれに結び付いたパラメータを記述する。 API でサービス名を指定することで、設定ファイルに記述されているパラメータが読み込まれる。
コンフィグサーバが稼働している環境では、 SINETStream APIでコンフィグ名を指定することにより あらかじめ管理者が設定した設定ファイルをコンフィグサーバから取得できる。
設定ファイルにパスワードやデータ暗号鍵などの秘匿情報を記述するときに 公開鍵暗号をつかって暗号化することもできる。
コンフィグサーバの利用
コンフィグサーバを利用するには二通りの方法がある。
- コンフィグサーバのWeb UIから設定ファイルをダウンロードする。
- コンフィグサーバのWeb UIからアクセス情報をダウンロードして、SINETStream APIから設定ファイルを取得する。
1つ目の方法は、 ユーザがエディタを起動して設定ファイルを記述する代わりに 管理者が用意した設定ファイルをダウンロードするだけの違いである。
2つ目の方法は、 事前にコンフィグサーバ認証情報をダウンロードしておき、 SINETStream実行時にコンフィグサーバから設定ファイルをダウンロードする方法である。
ダウンロードしたコンフィグサーバ認証情報は
$HOME/.config/sinetstream/auth.json
(Windows 10 では C:\Users\{userXX}\.config\sinetstream\auth.json
)
に置く。
秘匿情報の公開鍵暗号による暗号化
公開鍵で暗号化された秘匿情報を復号するときに秘密鍵が必要になる。
制限: 公開鍵暗号方式はRSAのみ対応
秘密鍵をPEM形式(PKCS#1)で ~/.config/sinetstream/private_key.pem
に置いておくと、
設定ファイル中の暗号化された秘匿情報を復号するときに参照される。
注意: 秘密鍵ファイルのファイルパーミッションは、他人が読み書きできないよう設定すること。
秘匿情報は
{パラメータ}: !sinetstream/encrypted {公開鍵で暗号化された設定値}
の形式で記述する。暗号化方式はSINETStream独自のフォーマットである。
復号化して得られた平文は
{パラメータ}: {復号化された設定値}
として扱われる。
バイナリデータと添付ファイル
パラメータの値としてASCIIではなくバイナリデータを指定したい場合は、
YAMLのバイナリ型の書式にしたがい
!!binary
のあとにつづけてパラメータの値をBase64エンコードした文字列を指定する。
パラメータとしてファイルをそのまま指定する場合も同じように
!!binary
のあとにつづけてコンテンツをBase64エンコードした文字列を指定する。
{パラメータ}: !!binary {Base64でエンコードされたコンテンツ}
補足:
!!binary
とbase64エンコードされたコンテンツの間に空白文字が必要である。- Base64の代替記号には
+/
を使用する。 - 行が長くなっても改行は必要ない。
設定ファイルのフォーマット
設定ファイルのフォーマットは YAML である。
設定ファイルは設定ファイル自体のパラメータを記述ヘッダー部分(header:
)とサービスを記述するコンフィグ部分(config:
)からなる。
header:
ヘッダ記述ブロック
config:
サービス記述ブロック1
サービス記述ブロック2
...
ヘッダ部分が存在しない場合は従来フォーマット(コンフィグ部のみ)だとみなす。
ヘッダを記述するブロックは以下のようになっている。
{ヘッダパラメータ1}: {設定値1}
{ヘッダパラメータ2}: {設定値2}
...
設定ファイルのヘッダ部
ヘッダパラメータには以下のものがある。
- version
- 設定ファイルのフォーマットバージョン
- 現在のバージョンで指定できる値は
2
のみである。 - 省略した場合は最新のフォーマットが指定されたものとみなす。
- fingerprint
- 秘匿情報の暗号化につかった公開鍵のフィンガープリント
- コンフィグ部で暗号化がつかわれていなければ省略されうる
設定ファイルのコンフィグ部
コンフィグ部分はサービス記述ブロック(各ブロックはYAMLの連想配列の1エントリとして記述される)からなる。
サービスを記述するブロックは以下のようになっている。
{サービス名}:
type: {メッセージングシステムのタイプ}
brokers:
- {ホスト名1}:{ポート番号1}
- {ホスト名2}:{ポート番号2}
{その他のパラメータ1}: {設定値1}
{その他のパラメータ2}: {設定値2}
type
にはメッセージングシステムのタイプを指定する。
brokers
にはメッセージングシステムのブローカーのアドレスを指定する。
その他のパラメータとして指定できる値はメッセージングシステムによって異なる。 例えば以下のような値が指定できる。
- 通信プロトコルに関するパラメータ
- MQTT のプロトコルバージョン (3.1, 3.1.1, 5)
- MQTT のトランスポート層 (TCP, WebSocket)
- TLS 接続に関するパラメータ
- CA 証明書に関する設定
- クライアント証明書、秘密鍵に関する設定
- ブローカーに接続するための認証情報に関するパラメータ
- ユーザ名
- パスワード
1.1 設定ファイルの配置場所
設定ファイルは以下の順序で検索され、最初に見つかったファイルのみが読み込まれる。
- カレントディレクトリの
.sinetstream_config.yml
$HOME/.config/sinetstream/config.yml
- Windows 10 では
C:\Users\{userXX}\.config\sinetstream\config.yml
- Windows 10 では
設定ファイルのカスケードは不可。 例えば
.sinetstream_config.yml
にパラメータ1:値1
が、$HOME/.config/sinetstream/config.yml
にパラメータ2:値2
が書かれているとき、パラメータ2:値2
は読み込まれない。
1.2 設定値の優先順位
設定ファイルに記述されたパラメータと API に指定されたパラメータが競合する場合や、 共通のパラメータとメッセージングシステム固有のパラメータが競合する場合は、 以下の優先順位で最初に見つかった値が使用される。
- API に指定されたメッセージングシステム固有のパラメータ値
- API に指定された共通のパラメータ値
- 設定ファイルに記述されたメッセージングシステム固有のパラメータ値
- 設定ファイルに記述された共通のパラメータ値
2. 共通のパラメータ
メッセージングシステムの種類によらず共通で指定できるパラメータを以下に示す。
- 基本的なパラメータ
- API のパラメータ
- SSL/TLS に関するパラメータ
- 暗号化に関するパラメータ
2.1 基本的なパラメータ
- type
- メッセージングシステムの種別を指定する文字列
- 現在のバージョンで指定できる値を以下に示す
kafka
mqtt
- brokers
- ブローカーのアドレスを
{ホスト名}
または{ホスト名}:{ポート番号}
の形で指定する:
の前後に空白文字を入れてはならない
- ポート番号の指定を省略した場合は、以下に示すデフォルトのポート番号が使用される
- Kafka: 9092
- MQTT
- TCP: 1883 (平文), 8883 (TLS)
- WebSocket: 80 (平文), 443 (TLS)
- 複数のブローカーを指定する場合は、以下のいずれかの方法を用いる
- YAML のシーケンスとして列挙する
brokers: - {ホスト名1}:{ポート番号1} - {ホスト名2}:{ポート番号2}
,
で連結するbrokers: {ホスト名1}:{ポート番号1},{ホスト名2}:{ポート番号2}
- YAML のシーケンスとして列挙する
- ブローカーのアドレスを
2.2 API のパラメータ
SINETStream API を呼び出すときに指定するパラメータのデフォルト値を設定する。 API にパラメータを指定しなかった場合は、設定ファイルに記述した値がデフォルト値として使用される。
- topic
- トピック名
- client_id
- クライアントID
- consistency
- メッセージ配信の信頼性を指定する
- 指定できる値
- AT_MOST_ONCE
- メッセージは届かないかもしれない
- AT_LEAST_ONCE
- メッセージは必ず届くが何度も届くかもしれない
- EXACTLY_ONCE
- メッセージは必ず一度だけ届く
- AT_MOST_ONCE
- value_type
- メッセージのデータ本体部分(ペイロード)のタイプ名
- 標準パッケージで指定できる値
- byte_array
- ペイロードの型をバイト列として扱う
- text
- ペイロードの型を文字列として扱う
- byte_array
- デフォルト値: byte_array
- 追加パッケージをインストールすることにより、指定するタイプ名を増やすことができる
- SINETStream v1.1 以降では画像タイプを追加するパッケージを提供している
- 画像のタイプ名は
image
となる
- value_serializer
- メッセージのシリアライズを行うクラス名
- 指定したクラスにはパブリックなデフォルトコンストラクタが必要
MessageWriter
のみで意味をもつ (MessageReader
で設定されても無視される)
- value_deserializer
- メッセージのデシリアライズを行うクラス名
- 指定したクラスにはパブリックなデフォルトコンストラクタが必要
MessageReader
のみで意味をもつ (MessageWriter
で設定されても無視される)
- data_compression
- メッセージの圧縮/展開の有効/無効を指定する
- デフォルト値: false
- compression
- data_encryption
- メッセージの暗号化/復号化の有効/無効を指定する
- デフォルト値: false
- user_data_only
- trueを指定するとwriterが送ったデータのみが保存される。
- falseを指定するとwriterが送ったデータに送信時刻タイムスタンプなどが付け加えられたSINETStream形式で保存される
- 注意: データ暗号化(data_encryption)や圧縮/展開(data_compression)を有効にする場合にはuser_data_onlyはfalseを指定しなければならない。
- デフォルト値: false
- receive_timeout_ms
MessageReader
がメッセージ到着を待つ最大待ち時間 (ms)
value_serializer
/value_deserializer
は value_type
よりも優先される。
value_deserializer
とvalue_type
を指定し、value_serializer
を指定しなかった場合、 MessageReader では value_deserializer が有効になり、MessageWriter では value_type が有効になる。
Python API の制限: SINETStream v1.* では、
value_serializer
/value_deserializer
の指定はAPIのパラメータでのみ指定可能で設定ファイルには記述できない。
設定例
メッセージの圧縮/展開を有効にする例を以下に示す。
service-comp-1:
type: mqtt
brokers: mqtt.example.org
data_compression: true
圧縮アルゴリズムにzstdを使って圧縮レベルを10にする例を以下に示す。
service-comp-2:
type: mqtt
brokers: mqtt.example.org
data_compression: true
compression:
algorithm: zstd
level: 10
2.3 SSL/TLS に関するパラメータ
SSL/TLS に関するパラメータはメッセージングシステムによって名称が異なるが、
SINETStream ではそれらを共通の tls
パラメータによって統一的に記述できる。
ここで指定したパラメータは、SINETStream 内部でメッセージングシステム固有のパラメータにマッピングされる。
- tls
- 以下のいずれか
- TLS 接続を使用するかどうかを真偽値で指定する
- TLS 接続に関するパラメータを YAML のマッピング (
{キー}: {値}
) として指定する
- 以下のいずれか
tls
の子要素となるマッピングに指定できる値を以下に示す。
- ca_certs
- CA 証明書ファイル (PEM) のパス
- ca_certs_data
- CA 証明書(PEM)
- CA 証明書ファイルを添付する場合に使う
- certfile
- クライアント証明書ファイル (PEM) のパス
- certfile_data
- クライアント証明書 (PEM)
- クライアント証明書ファイルを添付する場合に使う
- keyfile
- 秘密鍵ファイル (PEM) のパス
- keyfile_data
- 秘密鍵 (PEM)
- 秘密鍵ファイルを添付する場合に使う
- keyfilePassword
- 秘密鍵 (PEM) のパスワード※
- ciphers
- SSL/TLS 接続に利用可能な暗号を指定する文字列
- check_hostname
- 証明書がブローカーのホスト名と一致することを SSL ハンドシェイクで検証するかどうかを示す真偽値
- trustStore
- トラストストアのパス※
- trustStoreType
- トラストストアのファイルフォーマット (jks, pkcs12, …) ※
- trustStorePassword
- トラストストアのパスワード※
- keyStore
- キーストアのパス※
- keyStoreType
- キーストアのファイルフォーマット (jks, pkcs12, …) ※
- keyStorePassword
- キーストアのパスワード※
※
trustStore
,trustStoreType
,trustStorePassword
,keyStore
,keyStoreType
,keyStorePassword
,keyfilePassword
は Java APIのみで指定できるパラメータである。Python API では指定できない。
設定例
tls
パラメータに真偽値を指定する例を以下に示す。
この場合、設定値はメッセージングシステム固有のデフォルト値が使用される。
service-tls-1:
type: mqtt
brokers: mqtt.example.org
tls: true
tls
パラメータにマッピングを指定する例を以下に示す。
service-tls-2:
type: kafka
brokers:
- kafka-1:9092
tls:
ca_certs: /etc/sinetstream/ca.pem
certfile: certs/client.pem
keyfile: certs/client.key
優先順位
SINETStream の tls
パラメータを使用せず、メッセージングシステム固有のパラメータを直接指定することもできる。
一つのサービスに対して tls
パラメータとメッセージングシステム固有のパラメータを両方指定した場合は、以下の優先順位で最初に見つかった値が使用される。
- API に指定されたメッセージングシステム固有のパラメータ
- API に指定された
tls
パラメータ - 設定ファイルに記述されたメッセージングシステム固有のパラメータ
- 設定ファイルに記述された
tls
パラメータ
2.4 暗号化に関するパラメータ
SINETStream では、バックエンドの SSL/TLS による通信の暗号化とは別に、 メッセージ内容を暗号化することができる。 これにより、ブローカーに蓄積されたメッセージを第三者に見られても情報を保護することができる。
- crypto
- メッセージの暗号化に関するパラメータを YAML のマッピング (
{キー}: {値}
) で設定する crypto
を設定しただけでは暗号化処理は有効にならない。 メッセージ内容を暗号化するには、別途data_encryption
パラメータまたは API のパラメータで暗号化処理を有効にする必要がある。
- メッセージの暗号化に関するパラメータを YAML のマッピング (
crypto
の子要素となるマッピングに指定できる値を以下に示す。
- algorithm (mandatory)
- 暗号のアルゴリズムを指定する
- 指定可能な値: “AES”
- key_length (optinal)
- 鍵長 (bit) を指定する
- 指定可能な値: 128, 192, 256
- デフォルト値: 128
- mode (mandatory)
- 暗号利用モードを指定する
- 指定可能な値: “CBC”, “OFB”, “CTR”, “EAX”, “GCM”
- Android: “CBC”, “GCM”
- 補足: CBCを使う場合はpaddingにnone以外の値を指定しなければならない。
- padding (optional)
- パディング方法を指定する
- 指定可能な値: “none”, “pkcs7”
- デフォルト値: “none”
- key (mandatory; passwordと排他)
- 暗号鍵を指定する
- 暗号鍵の長さはkey_lengthに一致しなければならない。
- keyとpasswordは相互排他で同時には指定できない。
- password (mandatory; keyと排他)
- パスワードを指定する
- passwordとkeyは相互排他で同時には指定できない。
- passwordをもとにkey_derivationパラメータにしたがって鍵長がkey_lengthのkeyが導出される。
- key_derivation (optional)
- passwordからkeyを計算する鍵導出関数に関するパラメータを YAML のマッピングで指定する
- algorithm (optional)
- 鍵導出関数のアルゴリズムを指定する
- 指定可能な値: “pbkdf2”
- デフォルト値: “pbkdf2”
- salt_bytes (optional)
- ソルトのバイト数を指定する
- デフォルト値: 8
- iteration (optional)
- 反復回数を指定する
- デフォルト値: 10000
- prf (optional)
- 鍵導出関数(pseudorandom function)を指定する
- 指定可能な値: “HMAC-SHA256”
- デフォルト値: “HMAC-SHA256”
設定例
crypto
を設定する例を以下に示す。
service-aes-1:
type: kafka
brokers:
- kafka0.example.org:9092
crypto:
algorithm: AES
key_length: 256
mode: EAX
key_derivation:
algorithm: pbkdf2
iteration: 10000
password: secret-000
3. メッセージングシステム固有のパラメータ
バックエンドのメッセージングシステム固有のパラメータを透過的に指定することができる。
4. 注意事項
4.1 Python API と Java API の違い
以下のパラメータは Python API でのみ有効である。Java API で指定しても無視される。
- socket_options
- consumer_timeout_ms
- ssl_context
- ssl_crlfile
- api_version
- api_version_auto_timeout_ms
- selector
- value_serializer
- value_deserializer
以下のパラメータは Java API でのみ有効である。Python API で指定しても無視される。
- delivery_timeout_ms
- enable_idempotence
- transaction_timeout_ms
- transactional_id
- allow_auto_create_topics
- auto_offset_reset
- default_api_timeout_ms
- group_instance_id
- isolation_level
- client_rack
- client_dns_lookup
- ssl_truststore_location
- ssl_truststore_password
- ssl_truststore_type
- ssl_keystore_location
- ssl_keystore_password
- ssl_keystore_type
4.2 未対応
SINETStream v1.* は、以下のパラメータをサポートしていない。
- metric_reporters
- metrics_num_samples
- metrics_sample_window_ms
- sasl_kerberos_service_name
- sasl_kerberos_domain_name
- sasl_oauth_token_provider