こんにちは、サイオステクノロジー技術部 武井です。今回は、PowerShellでRabbitMQでアクセスしたいと思います。
早速試してみよう
RabbitMQにアクセスするためのPowerShellはRabbitMQ公式ページで紹介されている以下のGitHubから入手出来ます。
https://github.com/mariuszwojcik/RabbitMQTools
上記のGitHubからCloneしてきて下さい。
Cloneしたものは、PowerShellのモジュールを置くフォルダに配置します。以下のコマンドを実行すると、モジュールを置くべきフォルダがわかります。
PS C:\ > $env:PSModulePath -split ';' C:\Users\siosadmin\Documents\WindowsPowerShell\Modules C:\Program Files\WindowsPowerShell\Modules C:\Windows\system32\WindowsPowerShell\v1.0\Modules
上記のフォルダに置くと、Install-Moduleするだけで、モジュールが読み込まれます。
では早速・・・
PS C:\ > Import-Module RabbitMQTools Import-Module : Errors occurred while loading the format data file: C:\Program Files\WindowsPowerShell\Modules\RabbitMQTools\RabbitMqTools.Format.Ps1xml, , C:\Program Files\WindowsPowerShell\Modules\RabbitMQTools\RabbitMqTools.Format.Ps1xml: The file was skipped because of following validation exception: File C:\Program Files\WindowsPowerShell\Modules\RabbitMQTools\RabbitMqTools.Format.Ps1xml cannot be loaded. The file C:\Pro Files\WindowsPowerShell\Modules\RabbitMQTools\RabbitMqTools.Format.Ps1xml is not digitally signed. You cannot script on the current system. For more information about running scripts and setting execution policy, see about_Execution_Policies at https://go.microsoft.com/fwlink/?LinkID=135170.. At line:1 char:1 + Import-Module RabbitMQTools + ~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidOperation: (:) [Import-Module], RuntimeException + FullyQualifiedErrorId : FormatXmlUpdateException,Microsoft.PowerShell.Commands.ImportModuleCommand
ああ(´;ω;`)ブワッ
どうやらデフォルトの設定だと、信頼のおける発行者からの署名がないとスクリプトを実行出来ないようです。マイクロソフト認定のPowerShellでないとダメだということでしょうか?
この制限を回避するために、以下のようにします。
Set-ExecutionPolicy -ExecutionPolicy Bypass
PS C:\ > Import-Module RabbitMQTools
今度はOKでした。
では、実際に何か実行してみましょう。
PS C:\ > GetMessage -HostName localhost -UserName guest -Password guest -VirtualHost / -Name test -Remove # Queue R Payload --- ----- - ------- 1 test hoge
おお(`・ω・´)シャキーン
取得できました。
それぞれのパラメーターは以下のとおりです。
HostName:RabbitMQ Serverのホスト名
UserName:RabbitMQ Serverに登録したユーザーのユーザー名
Password:RabbitMQ Serverに登録したユーザーのパスワード
VirtualHost:RabbitMQのVirtual Host
Name:メッセージ取得対象のキューの名前
Remove:メッセージ取得後、そのメッセージを削除
ソースコード
GetMessage.ps1のソースコードを見てみました。一部抜粋です。
$url = "https://$([System.Web.HttpUtility]::UrlEncode($ComputerName)):15672/api/queues/$([System.Web.HttpUtility]::UrlEncode($VirtualHost))/$([System.Web.HttpUtility]::UrlEncode($Name))/get" Write-Verbose "Invoking REST API: $url" $body = @{ "count" = $Count "requeue" = -not [bool]$Remove "encoding" = $Encoding } if ($Truncate) { $body.Add("truncate", $Truncate) } $bodyJson = $body | ConvertTo-Json Write-Debug "body: $bodyJson" $result = Invoke-RestMethod $url -Credential $Credentials -AllowEscapedDotsAndSlashes -DisableKeepAlive -ErrorAction Continue -Method Post -ContentType "application/json" -Body $bodyJson
あれ?よくよく見ると、内部的にはこちらで紹介したRest APIを叩いているだけなんですね。
注意事項
このPowerShellは現時点(2018年2月28日)で最新のRabbitMQ(バージョン3.7.3)では動きません。3.7.3では、Rest APIの仕様が今までと違うようです。
さっきのソースコードにもあったようにメッセージを取得するRest APIのRequest Bodyは以下であるべきです。
{ "count\":5, "requeue":false, "encoding":"auto" }
確かに、3.3.5の時点の仕様を見ても、上記のようになっています。
https://cdn.rawgit.com/rabbitmq/rabbitmq-management/rabbitmq_v3_3_5/priv/www/api/index.html
しかし、最新のAPIの仕様では以下のようになっています。
https://rawcdn.githack.com/rabbitmq/rabbitmq-management/v3.7.3/priv/www/api/index.html
{ "count":5, "ackmode":"ack_requeue_true", "encoding":"auto" }
3.5.3ではrequeueだったのが、最新バージョンではackmodeになっています。まぁ、ソースを修正すれば大丈夫そうですね。