tech.guitarrapc.cóm

Technical updates

PowerShell の Invoke-WebRequest や Invoke-RestMethod でセッションを利用する

本記事はPowerShell 3.0以上が対象です。

前回のSumoLogic API用のPowerShellモジュール更新が2014年1月。で、その更新の直後にSumoLogic側でAPI制限がされました。具体的にはCredentialを使ってるの接続回数の制限なのですが、そういえば対応してなかったので更新しました。今後、SumoLogicAPIを叩くときは、初回だけ認証とって以降はその際に発行されたセッションCookieを利用できます。

今回の記事はInvoke-RestMethodでこの対応ができるメモです。

PSSumoLogicAPIの流れ

認証には次のファンクションを利用します。

CommandType Name                                 ModuleName
----------- ----                                 ----------
Function    Get-PSSumoLogicApiCredential         PSSumoLogicAPI
Function    Get-PSSumoLogicApiWebSession         PSSumoLogicAPI
Function    New-PSSumoLogicApiCredential         PSSumoLogicAPI

今回加えた変更は、初回のAPIアクセス認証後にWebSessionで以降の処理ができるようにしたものです。

実際にWebSessionを使った流れを見てみます。

認証情報の保持

SumoLogicせんせーは、まだBasic認証なんです。ほげー。

ユーザー名とパスワードを入力することで、ファイルに保持します。 作ったファイルにかかれているのは、暗号化されたパスワードで復号は認証を作ったPCでのみ可能です。

Userパラメータを省略した場合、configで指定したユーザーがデフォルトでUserに入ります。

configに記述したユーザーで処理しますが、任意のユーザーでhoge@hoge.comで認証をとるには -userを指定します。

New-PSSumoLogicApiCredential -user hoge@hoge.com

これで認証情報がSecureCredentialとして保持されます。

保持した認証情報を読み取る

作成した認証ファイルを読み込んで、パスワードをSecureCredentialに復号しPSCredentialを作ります。

configで指定したユーザーがデフォルトでUserに入ります。

Get-PSSumoLogicApiCredential

もちろんユーザーの指定も可能です。

Get-PSSumoLogicApiCredential -user hoge@hoge.com

前回は、このユーザー認証を毎回のAPI Callに使ってたのでキチガイでしたね。

初回だけユーザー認証を行いセッション取得

先ほど復号した認証を利用して、セッションを取得します。以降のAPIはすべてこのセッションで叩きます。

$credential = Get-PSSumoLogicApiCredential
Get-PSSumoLogicApiWebSession

取得したセッションは、$PSSumoLogicAPI.WebSessionに格納され、暗黙で利用されるので気にすることはありません。

APIを叩く

あとは、WebSessionで好きなようにAPIを叩けます。

CommandType Name                                 ModuleName
----------- ----                                 ----------
Function    Get-PSSumoLogicApiCollector          PSSumoLogicAPI
Function    Get-PSSumoLogicApiCollectorSource    PSSumoLogicAPI
Function    Get-PSSumoLogicApiCredential         PSSumoLogicAPI
Function    Remove-PSSumoLogicApiCollector       PSSumoLogicAPI
Function    Remove-PSSumoLogicApiCollectorSource PSSumoLogicAPI
Function    Set-PSSumoLogicApiCollectorSource    PSSumoLogicAPI

Collectorを取得するならこれですね。この辺は、 すべてCredentialからWebSessionにパラメータを変えています。

Get-PSSumoLogicApiCollectors

これらの処理では、セッションを利用するので、これまでよりもAPIの応答が早くなっています。

SessionVariableの取得

Invoke-RestMethodやWebRequestで接続した時のセッションはSessionVariableパラメータで取得できます。

Invoke-RestMethod -Uri $uri -Method Get -Credential $Credential -SessionVariable SessionVariable

この場合は、 SessionVariableという変数名に入れるように指定しており$SessionVariableで取得した内容が取れます。

WebSessionは、[Microsoft.PowerShell.Commands.WebRequestSession]で返却され、その中には認証されたCookie情報も入っています。

自分で定義するとこうですね。

[Microsoft.PowerShell.Commands.WebRequestSession]@{
    Headers                        = New-Object 'System.Collections.Generic.Dictionary[string,string]'
    Cookies                        = New-Object System.Net.CookieContainer
    UseDefaultCredentials          = $false
    Credentials                    = New-Object System.Net.NetworkCredential
    Certificates                   = New-Object System.Security.Cryptography.X509Certificates.X509CertificateCollection
    UserAgent                      = "Mozilla/5.0 (Windows NT; Windows NT 6.2; ja-JP) WindowsPowerShell/4.0"
    Proxy                          = New-Object System.Net.WebProxy
    MaximumRedirection             = -1
}

SumoLogicは、このセッションに含まれるCookieで以降の接続を認証するので利用するわけです。

PowerShellでいろいろほげほげすると、結構便利にできるんですがSessionVariableは覚えておくとWebフォームの認証に利用できたりもするのでオススメです。

まとめ

ちょっとは使いやすくなりましたか?