本記事は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フォームの認証に利用できたりもするのでオススメです。
まとめ
ちょっとは使いやすくなりましたか?