PowerShellでRabbitMQ

こんにちは、サイオステクノロジー技術部 武井です。今回は、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 http://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 = "http://$([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になっています。まぁ、ソースを修正すれば大丈夫そうですね。

Be the first to comment

コメント投稿

Your email address will not be published.


*