App Service の FTP 関連設定を一覧化する

azure
Published: 2024-09-30

はじめに

App Service には FTP デプロイという仕組みがあります。

FTP/S を使用した Azure App Service へのアプリのデプロイ

この FTP デプロイで利用されるエンドポイントは、App Service を閉域化したい人にとってはイマイチな仕様になっています。このエンドポイントへの通信は IP アドレスによるアクセス制限が効きません、さらに通信をプライベートエンドポイント経由にもできません。もう一つのデプロイ手法である ZIP デプロイで利用されるエンドポイントは、IP アドレスによる通信制限が可能です。さらに通信をプライベートエンド経由にもできます。

というわけで、ネットワーク的な観点では FTP デプロイを利用する積極的な理由はありません。そんな FTP デプロイを利用できるようになっている App Service を見つけ出したいというのが本エントリの趣旨です

FTP 関連設定の罠

App Service の FTP 関連設定は App Service そのものであるリソースタイプが Microsoft.Web/sites のリソースのプロパティには含まれていません。FTP 用のベーシック認証の設定は、リソースタイプが Microsoft.Web/sites/basicPublishingCredentialsPolicies のリソースのプロパティに含まれています。FTP 自体の設定はリソースタイプが Microsoft.Web/sites/config のリソースのプロパティに含まれています。

{
  "id": "/subscriptions/SUB-ID/resourceGroups/rg-azcheck/providers/Microsoft.Web/sites/azcheckv3/basicPublishingCredentialsPolicies/ftp",
  "name": "ftp",
  "type": "Microsoft.Web/sites/basicPublishingCredentialsPolicies",
  "location": "Japan East",
  "tags": {},
  "properties": {
    "allow": false
  }
}
{
  "id": "/subscriptions/SUB-ID/resourceGroups/rg-azcheck/providers/Microsoft.Web/sites/azcheckv3/config/web",
  "name": "azcheckv3",
  "type": "Microsoft.Web/sites/config",
  "location": "Japan East",
  "tags": {},
  "properties": {
    (中略)
    "ftpsState": "AllAllowed",
  }
}

リソースの設定値を一覧化する際によく利用するサービスといえば Azure Resoruce Graph です。ですが残念なことに今回の要件では Azure Resoruce Graph を利用できません。Azure Resoruce Graph が Microsoft.Web/sites/basicPublishingCredentialsPolicies と Microsoft.Web/sites/config のリソースタイプには対応していないためです。

設定値の取得方法

仕方がないので PowerShell で設定値を収集、可視化します。Az.Websites 3.2.1 の Get-AzWebApp が次のような挙動だったので、両方の設定を API 直叩きで情報を取りに行くようにしました。トークン生成を意識しなくても API を直叩きできる Invoke-AzRest は本当に便利。

  • Get-AzWebApps は、FTP 用ベーシック認証の設定を返さない
  • Get-AzWebApps は、対象の Web Apps を指定した場合のみ FTP 自体の設定を返す
$ErrorActionPreference = "stop"

$Collection = New-Object System.Collections.ArrayList
$subs = Get-AzSubscription 

$subs | ForEach-Object {
    $sub = $_
    Select-AzSubscription -SubscriptionObject $sub | Out-Null

    Get-AzWebApp | ForEach-Object {
        $ftpsState = invoke-Azrest -Path "$($_.id)/config/web?api-version=2024-04-01"
        $ftpsState = ($ftpsState.Content | ConvertFrom-Json)
        $property = New-Object -TypeName PSObject
        $property | Add-Member -Type NoteProperty -Name "Name" -Value $_.Name
        $property | Add-Member -Type NoteProperty -Name "ftpsState" -Value $ftpsState.properties.ftpsState

        $ftpBasicAuth = invoke-Azrest -Path "$($_.id)/basicPublishingCredentialsPolicies/ftp?api-version=2024-04-01"
        $ftpBasicAuth = ($ftpBasicAuth.Content | ConvertFrom-Json)
        $property | Add-Member -Type NoteProperty -Name "ftpBasicAuth" -Value $ftpBasicAuth.properties.allow

        $Collection.add($property) | Out-Null
    }
}

Write-Output $Collection

実行すると次のように App Service ごとの FTP 設定が表示されます。便利。

Name      ftpsState  ftpBasicAuth                                                                                       
----      ---------  ------------                                                                                       
azcheckv3 AllAllowed        False                                                                                       
ym0930    FtpsOnly          False                                                                                       
ym1954    Disabled           True                                                                                       

おわり

Azure Resoruce Graph や Azure PowerShell の標準コマンドレットでは一覧化できない App Service の設定値を、API 直叩きで情報を取得して可視化しました。かゆいところに 手が届く Invoke-AzRest は本当に便利

Note

  • 当サイトは個人のブログです。このブログに示されている見解や意見は個人的なものであり、所属組織の見解や意見を表明するものではありません。
  • 公開情報を踏まえて正確な情報を掲載するよう努めますが、その内容の完全性や正確性、有用性、安全性、最新性について一切保証しません。
  • 添付文章やリンク先などを含む本サイトの内容は作成時点でのものであり、予告なく変更される場合があります。