Azure Functions で Resolve-DnsName を使えるようにする

2022/05/27に公開

Azure Functions で Resolve-DnsName が使えない

いろいろあって Resolve-DnsName を Azure Functions で叩きたいねぇと思いまして。
シンプルに以下のような PowerShell script を実行してみます。

# Input bindings are passed in via param block.
param($Request, $TriggerMetadata)

Resolve-DnsName www.microsoft.com.

わーっといろいろ怒られるんですが、とりあえずそういうコマンドはないと言われています。
ただ、これは手元の Windows 11 PC では起こることはありません。

2022-05-27T12:01:57.997 [Error] ERROR: The term 'Resolve-DnsName' is not recognized as the name of a cmdlet, function, script file, or operable program.

で、$env:PSModulePath を確認してみます。

$env:PSModulePath -split ';'

結果は以下のとおりです。
なんかやたらシンプルだなという感じです。

2022-05-27T12:05:13.301 [Information] OUTPUT: C:\home\site\wwwroot\Modules
2022-05-27T12:05:13.303 [Information] OUTPUT: C:\Program Files (x86)\SiteExtensions\Functions\4.3.2\workers\powershell\7\Modules

手元の Windows 11 PC の場合にはもうちょっと数が多いです。

PS C:\Users\xxxxxxxx> $env:PSModulePath -split ';'
C:\Users\xxxxxxxx\OneDrive - Microsoft\Documents\PowerShell\Modules
C:\Program Files\PowerShell\Modules
c:\program files\powershell\7\Modules
C:\Program Files\WindowsPowerShell\Modules
C:\WINDOWS\system32\WindowsPowerShell\v1.0\Modules
C:\Program Files (x86)\Microsoft Azure Information Protection\Powershell

で、Resolve-DnsNameC:\Windows\system32\WindowsPowerShell\v1.0\Modules に入ってます。

Azure Functions 側にあるかどうか確認してみたらどうもファイルとしてはありそうなので、じゃあ足してやりゃいいじゃんということで。

Azure Functions の $Env:PSModulePath を足そう

# Input bindings are passed in via param block.
param($Request, $TriggerMetadata)

$Env:PSModulePath = $Env:PSModulePath+";C:\Windows\system32\WindowsPowerShell\v1.0\Modules"

Resolve-DnsName www.microsoft.com.

こうすれば叩けるようになっちゃいます、やったね!
今回は所用があって smtp.sendgrid.net の IP アドレスが欲しかったので以下のような感じになります。

# Input bindings are passed in via param block.
param($Request, $TriggerMetadata)

$Env:PSModulePath = $Env:PSModulePath+";C:\Windows\system32\WindowsPowerShell\v1.0\Modules"

$r = Resolve-DnsName smtp.sendgrid.net.
$r | % {$_.IPAddress}

結果はこんな感じ。

2022-05-27T12:10:09.448 [Information] OUTPUT: 13.114.210.107
2022-05-27T12:10:09.449 [Information] OUTPUT: 52.220.95.193

参考リンクはこちら。

  • $Env:PSModulePath の確認の仕方

https://www.tutorialspoint.com/where-the-powershell-modules-are-stored

  • $Env:PSModulePath の追加の仕方 (大した話ではないんですが)

https://learn.microsoft.com/powershell/module/microsoft.powershell.core/about/about_psmodulepath


ちなみに PowerShell で | %ForEach-Objectalias となってます。
Ruby でいう .map とか .collect みたいな感じで便利っすね。

PS C:\Users\kasakemi> alias %

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Alias           % -> ForEach-Object
Microsoft (有志)

Discussion