これまで何の問題もなく使えていたAzure App Serviceのコンテンツファイル更新用FTPサーバ。しかし、新たにデプロイしたらエラーが発生してFTPに接続できなくなってしまった……。こうしたトラブルとその解決策を幾つか紹介しよう。
対象:Azure App Service
Azureの「App Service」でWebサイトあるいはAPIサイトを運用していて、そこにHTMLやスクリプトなどのコンテンツファイルをアップロードするのにFTPを使っている人もいることだろう。
最近、App Serviceをデプロイあるいは新規作成したら、FTPで接続できなくなった、といったトラブルに遭遇したことはないだろうか? だとしたら、それはAzureの仕様変更の影響かもしれない。
本Tech TIPSでは、上述したようなトラブルも含めたApp Serviceのコンテンツファイル更新用FTPサーバでよくあるトラブルとその解決策を紹介する。
本Tech TIPSの執筆時点で、App Serviceを新規作成するとデプロイ用のFTPサーバの基本認証(ベーシック認証)がデフォルトで無効化される(以前はデフォルトで有効だった)。App ServiceのFTPサーバには必ず基本認証を経て接続する必要があるため、実質的にFTPサーバは機能しないといってよい。
デプロイしたApp ServiceでFTPの基本認証を有効化するには、Azureポータルで以下の画面のように設定する。
[FTP基本認証の発行資格情報]だけではなく[SCM基本認証の発行資格情報]も「オン」にすることを忘れないように注意しよう。
AzureポータルでApp Serviceを新規作成する場合は、以下の画面のように設定する。
BicepやARMテンプレートなどを使ってApp Serviceをデプロイする場合は、以下のように「Microsoft.Web/sites/basicPublishingCredentialsPolicies」というリソースの作成をテンプレートに追記して、FTPとSCMの両方の基本認証を明示的に有効化する。
param location string = resourceGroup().location
param siteName string // App Serviceの名前
// リソース生成: App Serviceのサイト本体
resource webApp 'Microsoft.Web/sites@2024-11-01' = {
name: siteName // App Service名
location: location
properties: {
// ……<省略>……
}
}
// リソース生成: FTPの基本認証ポリシー
resource webAppFtpPolicy 'Microsoft.Web/sites/basicPublishingCredentialsPolicies@2024-11-01' = {
parent: webApp // 親になるApp Serviceのリソース
name: 'ftp' // FTPが対象
properties: {
allow: true // 基本認証を有効にする
}
}
// リソース生成: SCMの基本認証ポリシー
resource webAppSCMPolicy 'Microsoft.Web/sites/basicPublishingCredentialsPolicies@2024-11-01' = {
parent: webApp // 親になるApp Serviceのリソース
name: 'scm' // SCMが対象
properties: {
allow: true // 基本認証を有効にする
}
}
App Serviceを新規作成すると、そのFTPサーバはデフォルトで暗号化していない平文(ひらぶん)のFTP接続を拒否する。暗号化されていないFTPで接続できるようにするには、App Serviceの設定を明示的に変更する必要がある。
いうまでもないことだが、暗号化していないFTPでは、その通信経路上でネットワークパケットをモニタリングすると容易にFTPの資格情報が読み取れてしまう。つまり資格情報が漏えいする危険性が高く、お勧めできる設定ではない。その危険性を踏まえてから、以下の設定をしていただきたい。
Azureポータルでは、以下の画面のように設定する。
BicepやARMテンプレートなどを使ってApp Serviceをデプロイする際に、暗号化されていないFTP接続を許可するには、次のどちらかのリソース設定が必要になる:
// ……<前略>……
// リソース生成: App ServiceのWeb設定
resource webAppConfig 'Microsoft.Web/sites/config@2024-11-01' = {
parent: webApp // 親になるApp Serviceのリソース
name: 'web'
properties: {
ftpsState: 'AllAllowed' // 暗号化していないFTP接続を許可
// ……<省略>……
}
}
// ……<後略>……
AzureポータルのApp Serviceのページで[デプロイ]−[デプロイセンター]−[FTPS資格情報]タブには、前述した「アプリケーションスコープ」の他、「ユーザースコープ」という資格情報の欄もある。
アプリケーションスコープがApp Serviceごとの資格情報であるのに対し、ユーザースコープはAzureにサインイン中のアカウントごとに作成できる資格情報だ。そのアカウントがアクセス可能なApp Serviceであればどれでも、リソースグループやサブスクリプションが異なっていても、そのアカウントにひも付いているユーザースコープの資格情報でFTP接続ができる(ユーザー名には各App Serviceの名前を加える必要がある)。
そのため、ユーザースコープの資格情報を変更する場合は注意が必要だ。Azureポータルで、あるApp Serviceの[デプロイ]−[デプロイセンター]−[FTPS資格情報]タブで、ユーザースコープの資格情報を変更した場合、その他のApp Serviceにも作用するからだ(App Service以外のリソースやFTP以外の接続/デプロイ手段にも影響する)。結果として、意図していなかった他のApp Serviceでもユーザースコープの資格情報でのログインに失敗するようになる。ユーザースコープの資格情報を変更したら、全てのFTPクライアントで新しいユーザースコープの資格情報を設定し直すのを忘れないようにしよう。
またユーザースコープのパスワードは、後から確認できない。パスワードを忘れたら新たなパスワードを再設定するしかない。複数のApp Serviceなどのリソースで利用するつもりなら、パスワードマネージャーなどに保存しておくべきだろう。
■関連リンク
Copyright© Digital Advantage Corp. All Rights Reserved.