RabbitMQ
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
開始行:
「[[マイクロソフト系技術情報 Wiki>http://techinfoofmicros...
-[[戻る>IoT関連の通信プロトコル]]
--[[Mosquitto]]
--RabbitMQ
* 目次 [#qd06bf62]
#contents
*概要 [#j1decbb5]
-AMQPブローカーのOSS
- MQTT プロトコルサポートのプラグインもある。
*詳細 [#b0ec823e]
**Windows [#c5bcbed7]
***インストール [#bce7313a]
-Erlang
--インストール(既定値)
---Erlang Programming Language~
https://www.erlang.org/downloads
--環境変数設定~
不要だった。
-RabbitMQ
--インストール(既定値)
---Installing on Windows — RabbitMQ~
https://www.rabbitmq.com/install-windows.html
***ブローカー起動 [#f90f0803]
-サービスとしてインストールされる。
-起動:メニューから[RabbitMQ Service - start]を選択
-停止:メニューから[RabbitMQ Service - stop]を選択
***送受信 [#uabecfb4]
-[[rabbitmqadmin>#k147feaf]]で動作確認。
-[[RabbitMQ.Client>#b2261bad]]で動作確認。
**その他の環境 [#v35594f3]
***Linux [#f9bc4ea2]
***Raspberry Pi [#o2016d76]
***Docker on Windows [#nb372206]
***Docker on Raspberry Pi [#w472f821]
***SaaS / PaaS [#t3f0cf64]
-Azure:[[Azure Service Bus>Azureのメッセージング・サービ...
-Azure:Amazon MQ for RabbitMQ
-GCP:Cloud Pub/Sub?
**管理ツール [#ba5d0b37]
***管理画面 [#y14216dd]
-設定
--メニューから[RabbitMQ Command Prompt (sbin dir)]を選択
--以下の2つのコマンドを実行する。
---
>rabbitmq-plugins enable rabbitmq_management
...
---
>rabbitmq-plugins enable rabbitmq_tracing
...
-アクセス~
--HTTPSではなくHTTP~
http://127.0.0.1:15672/
--アカウントは~
guest/guest
-参考
--RabbitMQのインストールと管理画面の有効化(MacOSX/Linux/W...
https://qiita.com/AKB428/items/a2662fbb624ce7659025
***rabbitmqctl [#z7c314c7]
-標準の管理ツールでvhost作成・ユーザ作成・権限付与などの...
-Windowsの場合~
以下から使用する。
--格納場所は以下のディレクトリ。
...RabbitMQ Server\rabbitmq_server-x.x.x\sbin
--.batファイルとして提供されている。
rabbitmqctl.bat
--メニューから[RabbitMQ Command Prompt (sbin dir)]を選択...
>rabbitmqctl(.bat) status
-参考
--RabbitMQ管理コマンド(rabbitmqctl)使い方 - Qiita~
https://qiita.com/tamikura@github/items/5293cda4c0026b2d7...
***rabbitmq-plugins [#x450bd99]
[[前述>#y14216dd]]のrabbitmq-pluginsでプラグインを制御で...
***rabbitmqadmin [#k147feaf]
-[[管理画面>#y14216dd]]に付属するツール(REST APIのクライ...
[[Exchange や Queue の作成、Messageの送受信>#m2c0116f]]な...
-pythonが必要で、rabbitmqadminファイルを[[管理画面>#y1421...
--Linuxルの場合~
rabbitmqadminファイルを/usr/local/binにコピーし、
$ rabbitmqadmin ...サブ・コマンド...
--Windowsの場合
rabbitmqadminファイルをコピーし(sbin dirが良いかと)、
>python.exe rabbitmqadmin ...サブ・コマンド...
-Messageの送受信
--受信
---例
rabbitmqadmin -u admin -p admin -V my-vhost get queue=my...
---初期値
rabbitmqadmin get queue=my-q ackmode=ack_requeue_true
--送信
---例
rabbitmqadmin -u admin -p admin -V my-vhost publish rout...
---初期値
rabbitmqadmin publish routing_key=my-key exchange=my-exc...
-参考
--Management Command Line Tool — RabbitMQ~
https://www.rabbitmq.com/management-cli.html
--windows RabbitMQ doesnt have rabbitmqadmin in sbin fold...
https://stackoverflow.com/questions/43547461/windows-rabb...
***... [#p5e12a9d]
***参考 [#o542b41b]
-Command Line Tools — RabbitMQ~
https://www.rabbitmq.com/cli.html
**設定ファイル [#te4b8341]
***新・旧の設定ファイル [#r68d2271]
-場所~
インストール後、設定ファイルは存在しないので、必要なら、...
--Windows:
%APPDATA%\RabbitMQ\rabbitmq.conf
C:\Users\xxxxx\AppData\Roaming\RabbitMQ\rabbitmq.conf
--Linux:
/etc/rabbitmq/rabbitmq.config
-新ファイル
--rabbitmq.conf
---新式の書き方。
---sysctl 方式で記述。
--advanced.config
---旧式の書き方。
---新スタイルの設定形式では表現できない限られた設定項目。
-旧ファイル
--rabbitmq.config
---旧式の書き方。
---Erlang の標準設定ファイル書式で記述。
-参考
--rabbitmq設定ファイルはどこにありますか? - ja.pays-taru...
https://ja.pays-tarusate.org/377570-where-is-rabbitmq-con...
***インポート・エクスポート [#o65c9989]
-エクスポート
rabbitmqadmin export c:\export.json
-インポート~
rabbitmq.confに以下を追記する。
management.load_definitions = c:\import.json
***管理ツール [#jebe6709]
前述の[[管理ツール>#ba5d0b37]]を使用して設定を行う。
**認証 [#n95ae828]
バーチャルホスト、キュー、エクスチェンジなどのリソースへ...
***パスワード [#b63d948d]
-デフォルト・ユーザー
--ユーザー名「guest」パスワード「guest」。
--バーチャルホスト「/」へのフルアクセスを許可される。
--規定ではホスト・ローカル接続にしか使用できない。~
loopback_usersの設定をnoneにすることで、~
リモートホストからの接続を許可することが可能。
-ユーザの管理
--CLI
---追加
rabbitmqctl add_user 'username' 'password'
---更新
rabbitmqctl change_password
---削除
rabbitmqctl delete_user 'username'
---一覧
rabbitmqctl list_users
---アクセス許可設定~
[[Exchange>#k283cf9f]]以下([[Queue>#g034aa64]]など)のア...
(Topicの認可というのものあるらしい(既定では無効になって...
・追加
# First ".*" for configure permission on every entity
# Second ".*" for write permission on every entity
# Third ".*" for read permission on every entity
rabbitmqctl set_permissions -p "custom-vhost" "username"...
・削除
rabbitmqctl clear_permissions -p "custom-vhost" "username"
・一括
for v in $(rabbitmqctl list_vhosts --silent); do rabbitm...
--その他
---ノードブート時の定義のインポート
---別の認証バックエンド(LDAP、HTTP、AMQPなど)
-参考
--RabbitMQ
---Authentication, Authorisation, Access Control~
https://www.rabbitmq.com/access-control.html
---Credentials and Passwords~
https://www.rabbitmq.com/passwords.html
***証明書 [#s568939e]
-サーバー認証とクライアント認証の両方が可能。
-サーバー認証~
rabbitmq-auth-mechanism-sslを有効にして、~
クライアントがEXTERNALメカニズムを使うように設定
-クライアント認証
--ユーザー名はCNと一致する。
--クライアントが提供するパスワードはすべて無視される。
-参考
--RabbitMQ
---TLS Support~
https://www.rabbitmq.com/ssl.html
---Troubleshooting TLS-enabled Connections~
https://www.rabbitmq.com/troubleshooting-ssl.html
--RabbitMQでTLS通信を有効にする - OutSystems~
https://success.outsystems.com/ja-jp/Support/Enterprise_C...
--Jeffrey A Becker's Blog - Using SSL client certificates...
https://weblogs.asp.net/jeffreyabecker/Using-SSL-client-c...
--RabbitMQをSSL対応させてみる(with Graylogでログを受け取...
https://orebibou.com/ja/home/201702/20170212_001/
**ブローカーモデル [#m2c0116f]
AMQP 1.0 で削除されたので、コレは、純粋に、RabbitMQの話。
***Producer [#a530013b]
送信する人
***Consumer [#gdf3a04b]
受信する人
***Message [#kf30e258]
送受信対象のメッセージ
***Queue [#g034aa64]
キュー
***Exchange [#k283cf9f]
Queueへの配送ルール
-direct~
routing keyとbinding keyが完全したMessageだけQueueに配送。
-fanout~
binding keyを無視して全てのQueueにMessageを配送(ブロード...
-topic~
routing keyとbinding keyで、部分一致したMessageをQueueに...
***Vhosts (Virtual Hosts) [#lac43cb7]
-固有の名前を持つ個々のコンテナ(論理的グループ)
-コンテナ中には、以下リソースがある。
--Connection
--[[Exchange>#k283cf9f]]
--[[Queue>#g034aa64]]
--Binding
--ユーザー権限
--およびその他のシステムリソース
**送受信(C#) [#d03162e8]
***RabbitMQ.Client [#b2261bad]
様々な言語向けにリリースされている。
-以下のコードは[[.NET Core]]でも大方動く。
--一箇所、変更した。
---ea.Body
>↓ ↓ ↓
---ea.Body.ToArray()
--Qiitaのサンプルをベースに弄った。
using Newtonsoft.Json;
using RabbitMQ;
using RabbitMQ.Client;
using RabbitMQ.Client.Events;
using System;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Net.Security;
using System.Security.Cryptography.X509Certificates;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
// ホスト名
var hostname = "localhost";
// Taskキャンセルトークン
var tokenSource = new CancellationTokenSourc...
Console.WriteLine($"start .Net RabbitMQ Exam...
X509Certificate2 cli = new X509Certificate2(...
// ファクトリ生成
var factory = new ConnectionFactory()
{
HostName = hostname,
//UserName = "hogecli",
//Password = "hogecli",
AuthMechanisms = new IAuthMechanismFacto...
Ssl = new SslOption
{
Enabled = true,
ServerName = hostname,
AcceptablePolicyErrors = SslPolicyEr...
| SslPolicy...
Certs = new X509CertificateCollectio...
}
};
// パブリッシャータスク
var pTask = Task.Run(() => new Action<Connec...
// コネクション&チャンネル生成
using (var conn = f.CreateConnection())
using (var channel = conn.CreateModel())
{
// Exchange生成
channel.ExchangeDeclare("test", "fan...
while (true)
{
// キャンセル待ち
if (cancel.IsCancellationRequest...
{
break;
}
var msg = new SendMessage()
{
Message = "Hello",
Timestamp = DateTime.UtcNow....
};
var body = JsonConvert.Serialize...
// Publish!!
try
{
channel.BasicPublish("test",...
Console.WriteLine($"success ...
}
catch (Exception ex)
{
Console.WriteLine($"failer s...
}
await Task.Delay(10000);
}
}
})(factory, tokenSource.Token), tokenSource....
// コンシューマータスク
var cTask = Task.Run(() => new Action<Connec...
// コネクション&チャンネル生成
using (var conn = f.CreateConnection())
using (var channel = conn.CreateModel())
{
// Exchange生成
channel.ExchangeDeclare("test", "fan...
// Queue生成
var queueName = channel.QueueDeclare...
// Bind Queue
channel.QueueBind(queueName, "test",...
// コンシューマー生成
var consumer = new EventingBasicCons...
// 受信イベント定義
consumer.Received += (_, ea) =>
{
var msg = JsonConvert.Deserializ...
Console.WriteLine($"success cons...
};
// コンシューマー登録
channel.BasicConsume(queueName, true...
while (true)
{
// キャンセル待ち
if (cancel.IsCancellationRequest...
{
break;
}
}
}
})(factory, tokenSource.Token), tokenSource....
// Ctl+C待機
Console.CancelKeyPress += (_, e) =>
{
e.Cancel = true;
tokenSource.Cancel(); // Taskキャンセル
};
Task.WaitAll(pTask, cTask);
Console.WriteLine("stop .Net RabbitMQ Exampl...
Console.ReadKey();
}
}
public class SendMessage
{
public string Message { get; set; }
public long Timestamp { get; set; }
}
public class ConsumedMessage
{
public string Message { get; set; }
public long Timestamp { get; set; }
}
}
-参考
--RabbitMQでPublisherとConsumer(C#編)~
https://qiita.com/lightstaff/items/1a8a1e602d486571cb3a
--RabbitMQ tutorial - "Hello World!" — RabbitMQ~
https://www.rabbitmq.com/tutorials/tutorial-one-dotnet.html
--より洗練された実装~
https://github.com/OpenTouryoProject/DxCommon/tree/develo...
***EasyNetQ [#df0bbf55]
-RabbitMQのための優れた.NET API
-初期の開発は、15belowがスポンサーとなって行われた。
***AMQPクライアント [#he029c15]
RabbitMQはサポートしない?
-AMQPNetLite
-Microsoft.Azure.Amqp
-...
*チュートリアル [#x8a94036]
**Windows [#ua9b4728]
***証明書の準備 [#l31f2bae]
[[Mosquittoのチュートリアル>Mosquitto#p4f5a191]]と同じ。
***SSLの設定 [#lc58e121]
-サーバー証明書を利用
--advanced.config
[
{rabbit, [
{ssl_listeners, [5671]},
{ssl_options, [{cacertfile,"c:/certs/ca.crt"},
{certfile,"c:/certs/server.crt"},
{keyfile,"c:/certs/server.key"},
{verify,verify_none},
{fail_if_no_peer_cert,false}]}
]}
].
--サービスの再起動~
[[管理画面>#y14216dd]]でSSLポートを確認する。
Listening ports
amqp/ssl 0.0.0.0 5671
amqp/ssl :: 5671
-パスワード認証~
[[管理画面>#y14216dd]]でユーザーを作成する。
-クライアント証明書を利用
--プラグインを有効化
rabbitmq-plugins enable rabbitmq_auth_mechanism_ssl
--CNと一致したユーザーを作成する。
--advanced.config
[
{rabbit, [
{ssl_listeners, [5671]},
{auth_mechanisms, ['EXTERNAL', 'PLAIN']},
{ssl_cert_login_from, common_name},
{ssl_options, [{cacertfile,"c:/certs/ca.crt"},
{certfile,"c:/certs/server.crt"},
{keyfile,"c:/certs/server.key"},
{verify,verify_peer},
{fail_if_no_peer_cert,true}]}
]}
].
--サービスの再起動~
[[管理画面>#y14216dd]]でSSLポートを確認する。
Listening ports
amqp/ssl 0.0.0.0 5671
amqp/ssl :: 5671
***プログラムからアクセス [#bd32bdbe]
-認証局の証明書(ca.crt)は、[[証明書ストア>証明書#dccdb7...
信頼されたルート証明機関に入れておく必要がある。
-サーバー証明書を利用
--以下を書き換える。
using System.Net.Security; // 追加
...
// ファクトリ生成
var factory = new ConnectionFactory()
{
HostName = hostname,
Ssl = new SslOption // 追加
{
Enabled = true,
ServerName = hostname,
AcceptablePolicyErrors = SslPolicyErrors.RemoteCerti...
| SslPolicyErrors.RemoteCer...
}
};
--デバッグ実行で動作確認~
動作した。
-パスワード認証を利用
--以下を書き換える。
var factory = new ConnectionFactory()
{
HostName = hostname,
UserName = "xxxxx", // 追加
Password = "xxxxx", // 追加
--デバッグ実行で動作確認~
動作した。
-クライアント証明書を利用
--以下を書き換える。
using System.Security.Cryptography.X509Certificates; // ...
...
X509Certificate2 cli = new X509Certificate2(@"C:\certs\c...
// ファクトリ生成
var factory = new ConnectionFactory()
{
HostName = hostname,
//UserName = "xxxxx", // 削除
//Password = "xxxxx", // 削除
AuthMechanisms = new IAuthMechanismFactory[]{ new Exte...
Ssl = new SslOption
{
Enabled = true,
ServerName = hostname,
AcceptablePolicyErrors = SslPolicyErrors.RemoteCerti...
| SslPolicyErrors.RemoteCer...
Certs = new X509CertificateCollection(new X509Certif...
}
};
--デバッグ実行で動作確認~
動作した(ssl_cert_login_fromを書く位置に注意!)。
**Linux [#jcd1f6f4]
*参考 [#y172abcc]
-RabbitMQ に入門してピョンピョンしてみた - kakakakakku bl...
https://kakakakakku.hatenablog.com/entry/2015/08/26/000853
**SIOS Tech. Lab [#g4a50d67]
-RabbitMQによる非同期処理~
https://tech-lab.sios.jp/archives/7902
-WindowsでRabbitMQ~
https://tech-lab.sios.jp/archives/7920
-Rest APIでRabbitMQ~
https://tech-lab.sios.jp/archives/7941
-.NETでRabbitMQ~
https://tech-lab.sios.jp/archives/8018
**Microsoft Docs [#dd5184c5]
-開発環境またはテスト環境の RabbitMQ でイベント バスを実...
https://docs.microsoft.com/ja-jp/dotnet/architecture/micr...
-Azure Functions における Azure RabbitMQ バインド~
https://docs.microsoft.com/ja-jp/azure/azure-functions/fu...
-Azure Functions における RabbitMQ の出力バインド~
https://docs.microsoft.com/ja-jp/azure/azure-functions/fu...
**Qiita [#r64ad8af]
-RabbitMQをインストールする(Windows/Mac/Docker)~
https://qiita.com/suke_masa/items/5d583462727660663fde
-RabbitMQ でメッセージの送受信を行うまでの環境設定につい...
https://qiita.com/ptiringo/items/c554fa66f0d985394fed
----
Tags: [[:通信技術]], [[:.NET開発]], [[:IoT]]
終了行:
「[[マイクロソフト系技術情報 Wiki>http://techinfoofmicros...
-[[戻る>IoT関連の通信プロトコル]]
--[[Mosquitto]]
--RabbitMQ
* 目次 [#qd06bf62]
#contents
*概要 [#j1decbb5]
-AMQPブローカーのOSS
- MQTT プロトコルサポートのプラグインもある。
*詳細 [#b0ec823e]
**Windows [#c5bcbed7]
***インストール [#bce7313a]
-Erlang
--インストール(既定値)
---Erlang Programming Language~
https://www.erlang.org/downloads
--環境変数設定~
不要だった。
-RabbitMQ
--インストール(既定値)
---Installing on Windows — RabbitMQ~
https://www.rabbitmq.com/install-windows.html
***ブローカー起動 [#f90f0803]
-サービスとしてインストールされる。
-起動:メニューから[RabbitMQ Service - start]を選択
-停止:メニューから[RabbitMQ Service - stop]を選択
***送受信 [#uabecfb4]
-[[rabbitmqadmin>#k147feaf]]で動作確認。
-[[RabbitMQ.Client>#b2261bad]]で動作確認。
**その他の環境 [#v35594f3]
***Linux [#f9bc4ea2]
***Raspberry Pi [#o2016d76]
***Docker on Windows [#nb372206]
***Docker on Raspberry Pi [#w472f821]
***SaaS / PaaS [#t3f0cf64]
-Azure:[[Azure Service Bus>Azureのメッセージング・サービ...
-Azure:Amazon MQ for RabbitMQ
-GCP:Cloud Pub/Sub?
**管理ツール [#ba5d0b37]
***管理画面 [#y14216dd]
-設定
--メニューから[RabbitMQ Command Prompt (sbin dir)]を選択
--以下の2つのコマンドを実行する。
---
>rabbitmq-plugins enable rabbitmq_management
...
---
>rabbitmq-plugins enable rabbitmq_tracing
...
-アクセス~
--HTTPSではなくHTTP~
http://127.0.0.1:15672/
--アカウントは~
guest/guest
-参考
--RabbitMQのインストールと管理画面の有効化(MacOSX/Linux/W...
https://qiita.com/AKB428/items/a2662fbb624ce7659025
***rabbitmqctl [#z7c314c7]
-標準の管理ツールでvhost作成・ユーザ作成・権限付与などの...
-Windowsの場合~
以下から使用する。
--格納場所は以下のディレクトリ。
...RabbitMQ Server\rabbitmq_server-x.x.x\sbin
--.batファイルとして提供されている。
rabbitmqctl.bat
--メニューから[RabbitMQ Command Prompt (sbin dir)]を選択...
>rabbitmqctl(.bat) status
-参考
--RabbitMQ管理コマンド(rabbitmqctl)使い方 - Qiita~
https://qiita.com/tamikura@github/items/5293cda4c0026b2d7...
***rabbitmq-plugins [#x450bd99]
[[前述>#y14216dd]]のrabbitmq-pluginsでプラグインを制御で...
***rabbitmqadmin [#k147feaf]
-[[管理画面>#y14216dd]]に付属するツール(REST APIのクライ...
[[Exchange や Queue の作成、Messageの送受信>#m2c0116f]]な...
-pythonが必要で、rabbitmqadminファイルを[[管理画面>#y1421...
--Linuxルの場合~
rabbitmqadminファイルを/usr/local/binにコピーし、
$ rabbitmqadmin ...サブ・コマンド...
--Windowsの場合
rabbitmqadminファイルをコピーし(sbin dirが良いかと)、
>python.exe rabbitmqadmin ...サブ・コマンド...
-Messageの送受信
--受信
---例
rabbitmqadmin -u admin -p admin -V my-vhost get queue=my...
---初期値
rabbitmqadmin get queue=my-q ackmode=ack_requeue_true
--送信
---例
rabbitmqadmin -u admin -p admin -V my-vhost publish rout...
---初期値
rabbitmqadmin publish routing_key=my-key exchange=my-exc...
-参考
--Management Command Line Tool — RabbitMQ~
https://www.rabbitmq.com/management-cli.html
--windows RabbitMQ doesnt have rabbitmqadmin in sbin fold...
https://stackoverflow.com/questions/43547461/windows-rabb...
***... [#p5e12a9d]
***参考 [#o542b41b]
-Command Line Tools — RabbitMQ~
https://www.rabbitmq.com/cli.html
**設定ファイル [#te4b8341]
***新・旧の設定ファイル [#r68d2271]
-場所~
インストール後、設定ファイルは存在しないので、必要なら、...
--Windows:
%APPDATA%\RabbitMQ\rabbitmq.conf
C:\Users\xxxxx\AppData\Roaming\RabbitMQ\rabbitmq.conf
--Linux:
/etc/rabbitmq/rabbitmq.config
-新ファイル
--rabbitmq.conf
---新式の書き方。
---sysctl 方式で記述。
--advanced.config
---旧式の書き方。
---新スタイルの設定形式では表現できない限られた設定項目。
-旧ファイル
--rabbitmq.config
---旧式の書き方。
---Erlang の標準設定ファイル書式で記述。
-参考
--rabbitmq設定ファイルはどこにありますか? - ja.pays-taru...
https://ja.pays-tarusate.org/377570-where-is-rabbitmq-con...
***インポート・エクスポート [#o65c9989]
-エクスポート
rabbitmqadmin export c:\export.json
-インポート~
rabbitmq.confに以下を追記する。
management.load_definitions = c:\import.json
***管理ツール [#jebe6709]
前述の[[管理ツール>#ba5d0b37]]を使用して設定を行う。
**認証 [#n95ae828]
バーチャルホスト、キュー、エクスチェンジなどのリソースへ...
***パスワード [#b63d948d]
-デフォルト・ユーザー
--ユーザー名「guest」パスワード「guest」。
--バーチャルホスト「/」へのフルアクセスを許可される。
--規定ではホスト・ローカル接続にしか使用できない。~
loopback_usersの設定をnoneにすることで、~
リモートホストからの接続を許可することが可能。
-ユーザの管理
--CLI
---追加
rabbitmqctl add_user 'username' 'password'
---更新
rabbitmqctl change_password
---削除
rabbitmqctl delete_user 'username'
---一覧
rabbitmqctl list_users
---アクセス許可設定~
[[Exchange>#k283cf9f]]以下([[Queue>#g034aa64]]など)のア...
(Topicの認可というのものあるらしい(既定では無効になって...
・追加
# First ".*" for configure permission on every entity
# Second ".*" for write permission on every entity
# Third ".*" for read permission on every entity
rabbitmqctl set_permissions -p "custom-vhost" "username"...
・削除
rabbitmqctl clear_permissions -p "custom-vhost" "username"
・一括
for v in $(rabbitmqctl list_vhosts --silent); do rabbitm...
--その他
---ノードブート時の定義のインポート
---別の認証バックエンド(LDAP、HTTP、AMQPなど)
-参考
--RabbitMQ
---Authentication, Authorisation, Access Control~
https://www.rabbitmq.com/access-control.html
---Credentials and Passwords~
https://www.rabbitmq.com/passwords.html
***証明書 [#s568939e]
-サーバー認証とクライアント認証の両方が可能。
-サーバー認証~
rabbitmq-auth-mechanism-sslを有効にして、~
クライアントがEXTERNALメカニズムを使うように設定
-クライアント認証
--ユーザー名はCNと一致する。
--クライアントが提供するパスワードはすべて無視される。
-参考
--RabbitMQ
---TLS Support~
https://www.rabbitmq.com/ssl.html
---Troubleshooting TLS-enabled Connections~
https://www.rabbitmq.com/troubleshooting-ssl.html
--RabbitMQでTLS通信を有効にする - OutSystems~
https://success.outsystems.com/ja-jp/Support/Enterprise_C...
--Jeffrey A Becker's Blog - Using SSL client certificates...
https://weblogs.asp.net/jeffreyabecker/Using-SSL-client-c...
--RabbitMQをSSL対応させてみる(with Graylogでログを受け取...
https://orebibou.com/ja/home/201702/20170212_001/
**ブローカーモデル [#m2c0116f]
AMQP 1.0 で削除されたので、コレは、純粋に、RabbitMQの話。
***Producer [#a530013b]
送信する人
***Consumer [#gdf3a04b]
受信する人
***Message [#kf30e258]
送受信対象のメッセージ
***Queue [#g034aa64]
キュー
***Exchange [#k283cf9f]
Queueへの配送ルール
-direct~
routing keyとbinding keyが完全したMessageだけQueueに配送。
-fanout~
binding keyを無視して全てのQueueにMessageを配送(ブロード...
-topic~
routing keyとbinding keyで、部分一致したMessageをQueueに...
***Vhosts (Virtual Hosts) [#lac43cb7]
-固有の名前を持つ個々のコンテナ(論理的グループ)
-コンテナ中には、以下リソースがある。
--Connection
--[[Exchange>#k283cf9f]]
--[[Queue>#g034aa64]]
--Binding
--ユーザー権限
--およびその他のシステムリソース
**送受信(C#) [#d03162e8]
***RabbitMQ.Client [#b2261bad]
様々な言語向けにリリースされている。
-以下のコードは[[.NET Core]]でも大方動く。
--一箇所、変更した。
---ea.Body
>↓ ↓ ↓
---ea.Body.ToArray()
--Qiitaのサンプルをベースに弄った。
using Newtonsoft.Json;
using RabbitMQ;
using RabbitMQ.Client;
using RabbitMQ.Client.Events;
using System;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Net.Security;
using System.Security.Cryptography.X509Certificates;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
// ホスト名
var hostname = "localhost";
// Taskキャンセルトークン
var tokenSource = new CancellationTokenSourc...
Console.WriteLine($"start .Net RabbitMQ Exam...
X509Certificate2 cli = new X509Certificate2(...
// ファクトリ生成
var factory = new ConnectionFactory()
{
HostName = hostname,
//UserName = "hogecli",
//Password = "hogecli",
AuthMechanisms = new IAuthMechanismFacto...
Ssl = new SslOption
{
Enabled = true,
ServerName = hostname,
AcceptablePolicyErrors = SslPolicyEr...
| SslPolicy...
Certs = new X509CertificateCollectio...
}
};
// パブリッシャータスク
var pTask = Task.Run(() => new Action<Connec...
// コネクション&チャンネル生成
using (var conn = f.CreateConnection())
using (var channel = conn.CreateModel())
{
// Exchange生成
channel.ExchangeDeclare("test", "fan...
while (true)
{
// キャンセル待ち
if (cancel.IsCancellationRequest...
{
break;
}
var msg = new SendMessage()
{
Message = "Hello",
Timestamp = DateTime.UtcNow....
};
var body = JsonConvert.Serialize...
// Publish!!
try
{
channel.BasicPublish("test",...
Console.WriteLine($"success ...
}
catch (Exception ex)
{
Console.WriteLine($"failer s...
}
await Task.Delay(10000);
}
}
})(factory, tokenSource.Token), tokenSource....
// コンシューマータスク
var cTask = Task.Run(() => new Action<Connec...
// コネクション&チャンネル生成
using (var conn = f.CreateConnection())
using (var channel = conn.CreateModel())
{
// Exchange生成
channel.ExchangeDeclare("test", "fan...
// Queue生成
var queueName = channel.QueueDeclare...
// Bind Queue
channel.QueueBind(queueName, "test",...
// コンシューマー生成
var consumer = new EventingBasicCons...
// 受信イベント定義
consumer.Received += (_, ea) =>
{
var msg = JsonConvert.Deserializ...
Console.WriteLine($"success cons...
};
// コンシューマー登録
channel.BasicConsume(queueName, true...
while (true)
{
// キャンセル待ち
if (cancel.IsCancellationRequest...
{
break;
}
}
}
})(factory, tokenSource.Token), tokenSource....
// Ctl+C待機
Console.CancelKeyPress += (_, e) =>
{
e.Cancel = true;
tokenSource.Cancel(); // Taskキャンセル
};
Task.WaitAll(pTask, cTask);
Console.WriteLine("stop .Net RabbitMQ Exampl...
Console.ReadKey();
}
}
public class SendMessage
{
public string Message { get; set; }
public long Timestamp { get; set; }
}
public class ConsumedMessage
{
public string Message { get; set; }
public long Timestamp { get; set; }
}
}
-参考
--RabbitMQでPublisherとConsumer(C#編)~
https://qiita.com/lightstaff/items/1a8a1e602d486571cb3a
--RabbitMQ tutorial - "Hello World!" — RabbitMQ~
https://www.rabbitmq.com/tutorials/tutorial-one-dotnet.html
--より洗練された実装~
https://github.com/OpenTouryoProject/DxCommon/tree/develo...
***EasyNetQ [#df0bbf55]
-RabbitMQのための優れた.NET API
-初期の開発は、15belowがスポンサーとなって行われた。
***AMQPクライアント [#he029c15]
RabbitMQはサポートしない?
-AMQPNetLite
-Microsoft.Azure.Amqp
-...
*チュートリアル [#x8a94036]
**Windows [#ua9b4728]
***証明書の準備 [#l31f2bae]
[[Mosquittoのチュートリアル>Mosquitto#p4f5a191]]と同じ。
***SSLの設定 [#lc58e121]
-サーバー証明書を利用
--advanced.config
[
{rabbit, [
{ssl_listeners, [5671]},
{ssl_options, [{cacertfile,"c:/certs/ca.crt"},
{certfile,"c:/certs/server.crt"},
{keyfile,"c:/certs/server.key"},
{verify,verify_none},
{fail_if_no_peer_cert,false}]}
]}
].
--サービスの再起動~
[[管理画面>#y14216dd]]でSSLポートを確認する。
Listening ports
amqp/ssl 0.0.0.0 5671
amqp/ssl :: 5671
-パスワード認証~
[[管理画面>#y14216dd]]でユーザーを作成する。
-クライアント証明書を利用
--プラグインを有効化
rabbitmq-plugins enable rabbitmq_auth_mechanism_ssl
--CNと一致したユーザーを作成する。
--advanced.config
[
{rabbit, [
{ssl_listeners, [5671]},
{auth_mechanisms, ['EXTERNAL', 'PLAIN']},
{ssl_cert_login_from, common_name},
{ssl_options, [{cacertfile,"c:/certs/ca.crt"},
{certfile,"c:/certs/server.crt"},
{keyfile,"c:/certs/server.key"},
{verify,verify_peer},
{fail_if_no_peer_cert,true}]}
]}
].
--サービスの再起動~
[[管理画面>#y14216dd]]でSSLポートを確認する。
Listening ports
amqp/ssl 0.0.0.0 5671
amqp/ssl :: 5671
***プログラムからアクセス [#bd32bdbe]
-認証局の証明書(ca.crt)は、[[証明書ストア>証明書#dccdb7...
信頼されたルート証明機関に入れておく必要がある。
-サーバー証明書を利用
--以下を書き換える。
using System.Net.Security; // 追加
...
// ファクトリ生成
var factory = new ConnectionFactory()
{
HostName = hostname,
Ssl = new SslOption // 追加
{
Enabled = true,
ServerName = hostname,
AcceptablePolicyErrors = SslPolicyErrors.RemoteCerti...
| SslPolicyErrors.RemoteCer...
}
};
--デバッグ実行で動作確認~
動作した。
-パスワード認証を利用
--以下を書き換える。
var factory = new ConnectionFactory()
{
HostName = hostname,
UserName = "xxxxx", // 追加
Password = "xxxxx", // 追加
--デバッグ実行で動作確認~
動作した。
-クライアント証明書を利用
--以下を書き換える。
using System.Security.Cryptography.X509Certificates; // ...
...
X509Certificate2 cli = new X509Certificate2(@"C:\certs\c...
// ファクトリ生成
var factory = new ConnectionFactory()
{
HostName = hostname,
//UserName = "xxxxx", // 削除
//Password = "xxxxx", // 削除
AuthMechanisms = new IAuthMechanismFactory[]{ new Exte...
Ssl = new SslOption
{
Enabled = true,
ServerName = hostname,
AcceptablePolicyErrors = SslPolicyErrors.RemoteCerti...
| SslPolicyErrors.RemoteCer...
Certs = new X509CertificateCollection(new X509Certif...
}
};
--デバッグ実行で動作確認~
動作した(ssl_cert_login_fromを書く位置に注意!)。
**Linux [#jcd1f6f4]
*参考 [#y172abcc]
-RabbitMQ に入門してピョンピョンしてみた - kakakakakku bl...
https://kakakakakku.hatenablog.com/entry/2015/08/26/000853
**SIOS Tech. Lab [#g4a50d67]
-RabbitMQによる非同期処理~
https://tech-lab.sios.jp/archives/7902
-WindowsでRabbitMQ~
https://tech-lab.sios.jp/archives/7920
-Rest APIでRabbitMQ~
https://tech-lab.sios.jp/archives/7941
-.NETでRabbitMQ~
https://tech-lab.sios.jp/archives/8018
**Microsoft Docs [#dd5184c5]
-開発環境またはテスト環境の RabbitMQ でイベント バスを実...
https://docs.microsoft.com/ja-jp/dotnet/architecture/micr...
-Azure Functions における Azure RabbitMQ バインド~
https://docs.microsoft.com/ja-jp/azure/azure-functions/fu...
-Azure Functions における RabbitMQ の出力バインド~
https://docs.microsoft.com/ja-jp/azure/azure-functions/fu...
**Qiita [#r64ad8af]
-RabbitMQをインストールする(Windows/Mac/Docker)~
https://qiita.com/suke_masa/items/5d583462727660663fde
-RabbitMQ でメッセージの送受信を行うまでの環境設定につい...
https://qiita.com/ptiringo/items/c554fa66f0d985394fed
----
Tags: [[:通信技術]], [[:.NET開発]], [[:IoT]]
ページ名: