しばやん雑記

Azure Serverless とメイドさんが大好きなフリーランスのプログラマーのブログ

Azure Functions への Zip Deploy を Publish Profile を使って行う方法

普段は Visual Studio からデプロイ先の Azure Functions を選んで Zip Deploy 用のプロファイルを作成していますが、たまに Visual Studio で Publish Profile を使った Zip Deploy を行う場合に、その手順を毎回忘れてしまうのでメモとして残します。

おまけとして Publish Profile についても少し触れています。Zip Deploy については何回も書いているはずなので、以前書いたエントリを参照してください。公式ドキュメントもあります。

最近は Visual Studio に色々統合されているので Publish Profile を使う機会が減ってしまったので、基本的なところも軽く紹介しておきます。

ダウンロードボタンは App Service / Azure Functions の Overview ツールバーにあります。

f:id:shiba-yan:20201226004221p:plain

Publish Profile に含まれている認証情報は再生成も出来ますが、場所が昔から大きく変わっています。今は Deployment Center (Preview) の Manage publish profile から行います。

f:id:shiba-yan:20201226004228p:plain

ここまで理解しておけば大体 OK です。特に Publish Profile の再生成は分かりにくいので注意。

Publish Profile の仕組み

ダウンロードした Publish Profile は Minify されていて読みにくいのですが、フォーマットしなおすと以下のような構造になっています。

昔は Web Deploy と FTP しかなかったのですが、最近は Zip Deploy と ReadOnly FTP が増えていました。

<publishData>
  <publishProfile profileName="serverlesstest-1 - Web Deploy" publishMethod="MSDeploy" publishUrl="***.scm.azurewebsites.net:443" msdeploySite="***" userName="$***" userPWD="***" destinationAppUrl="http://***.azurewebsites.net" SQLServerDBConnectionString="" mySQLDBConnectionString="" hostingProviderForumLink="" controlPanelLink="http://windows.azure.com" webSystem="WebSites">
    <databases />
  </publishProfile>
  <publishProfile profileName="serverlesstest-1 - FTP" publishMethod="FTP" publishUrl="ftp://***.ftp.azurewebsites.windows.net/site/wwwroot" ftpPassiveMode="True" userName="***\***" userPWD="***" destinationAppUrl="http://***.azurewebsites.net" SQLServerDBConnectionString="" mySQLDBConnectionString="" hostingProviderForumLink="" controlPanelLink="http://windows.azure.com" webSystem="WebSites">
    <databases />
  </publishProfile>
  <publishProfile profileName="serverlesstest-1 - Zip Deploy" publishMethod="ZipDeploy" publishUrl="***.scm.azurewebsites.net:443" userName="***" userPWD="***" destinationAppUrl="http://***.azurewebsites.net" SQLServerDBConnectionString="" mySQLDBConnectionString="" hostingProviderForumLink="" controlPanelLink="http://windows.azure.com" webSystem="WebSites">
    <databases />
  </publishProfile>
  <publishProfile profileName="serverlesstest-1 - ReadOnly - FTP" publishMethod="FTP" publishUrl="ftp://***.ftp.azurewebsites.windows.net/site/wwwroot" ftpPassiveMode="True" userName="***\***" userPWD="***" destinationAppUrl="http://***.azurewebsites.net" SQLServerDBConnectionString="" mySQLDBConnectionString="" hostingProviderForumLink="" controlPanelLink="http://windows.azure.com" webSystem="WebSites">
    <databases />
  </publishProfile>
</publishData>

Publish Profile の中身としては userNameuserPWD が重要な情報です。それ以外はどうでも良いです。

この userNameuserPWD は Site Credential というものになり、FTP の接続情報として確認できるものと同じです。大昔に書いた気がしますが、App Service は User Credential と Site Credential が存在しています。

f:id:shiba-yan:20201226004516p:plain

Site Credential を持っていると Kudu の API を自由に叩けるようになるので、当然ながら扱いには注意が必要ですが、App Service のデプロイ API は Kudu 側に用意されているので便利です。

コマンドを使ってデプロイ

あまり使わないと思いますが、API を知るには都合が良いので curl を使って Zip Deploy を行ってみます。

デプロイ API は /api/zipdeploy という分かりやすいエンドポイントにあるので、そこに Site Credential で Zip ファイルをアップロードするだけです。

curl -X POST -u "$serverlesstest-1" --data-binary @"FunctionApp16.zip" https://serverlesstest-1.scm.azurewebsites.net/api/zipdeploy

他にも WAR 向けエンドポイントもあるのですが、将来的にはこの辺りが統合されそうです。今後は POST 時に特殊なヘッダーを付けることで、Deployment Center 向けのメタデータを送信できるようになりそうです。

Visual Studio を使ってデプロイ

Azure Functions のみで利用できる方法になりますが、Visual Studio を使ったデプロイ時に Azure サブスクリプションを紐づけておけば Zip Deploy を行えるようになっています。

しかし Publish Profile をインポートする場合には Web Deploy しか認識してくれません。

f:id:shiba-yan:20201226010214p:plain

Publish Profile 自体には Zip Deploy の定義は含まれていますが、今の Visual Studio では正しく認識してくれないため、手動で pubxml を弄って Zip Deploy 向けに書き換えます。

Visual Studio で Publish Profile をインポートすると Properties の中に pubxml が作成されます。単なる MSBuild 定義ですが、中にはデプロイに必要な情報が記載されています。

f:id:shiba-yan:20210105150333p:plain

この pubxml を以下のように修正することで、Web Deploy から Zip Deploy へ変更できます。

  • WebPublishMethodZipDeploy
  • PublishUrl に SCM の URL*1 を指定して追加
  • DeployIisAppPathMSDeploy が含まれている項目を一応削除

修正後にデプロイを行うと、以下のように Zip Deploy が行われていることが確認できます。

f:id:shiba-yan:20210105023255p:plain

多少手間はかかりますが、Visual Studio に複数の Azure サブスクリプションを追加したくないケースもあるので、Publish Profile でサクッとデプロイ出来るようになっておくと便利です。

GitHub Actions を使ってデプロイ

おまけ的に GitHub Actions を使う時の情報も載せておきます。とは言っても、以前に書いてあるエントリを紹介するぐらいに留めておきます。

App Service へのデプロイに使う azure/webapps-deploy@v2 は最初から Publish Profile に対応しているので、複数アプリケーションへのデプロイが必要ない場合には簡単に始められます。

Deployment Center (Preview) が良くなっている話

あまり内容とは関係ないですが、Deployment Center (Preview) が良い感じにアップデートされて、デプロイ履歴もしっかり確認出来るようになっています。

f:id:shiba-yan:20210105023454p:plain

GitHub Actions との連携が推されていましたが、個人的には履歴の確認やメタデータから該当のコミットに簡単に飛べる機能などのがありがたいので、今後もアップデートに期待しています。

ちなみにこのデプロイ履歴は Kudu の API で取れるので、Site Credential があれば自由にアクセス出来ます。