- 本記事は PowerShell 3.0 以上を対象にしています
前回のSumoLogic API 用の PowerShell モジュール更新が2014年1月。で、その更新の直後に SumoLogic側で API制限がされました。
具体的には Credential を使ってるの接続回数の制限なのですが、そういえば対応してなかったので更新しました。今後、SumoLogicAPI を叩くときは、初回だけ認証とって以降はその際に発行されたセッションクッキーを利用できます。
今回の記事は、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]
で返却され、その中には認証されたクッキー情報も入っています。
自分で定義するとこうですね。
[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 は、このSessionに含まれるクッキーで以降の接続を認証するので利用するわけです。
PowerShell でいろいろほげほげすると、結構便利にできるんですが SessionVariable は覚えておくと Webフォームの認証に利用できたりもするのでオススメです。
まとめ
ちょっとは使いやすくなりましたか?