Azure Pipelines から Azure Static Web Apps にデプロイする AzureStaticWebApp@0 タスクが用意されていますが、今回はこのタスクを使用せず、 Static Web App CLI と Service Principal でデプロイする方法を紹介します。
概要
冒頭に記載の通り Azure Pipelines から Azure Static Web Apps に対してデプロイを行う方法として、標準タスクの AzureStaticWebApp@0 が用意されています。
このタスクでデプロイを実行することはもちろんできますが、残念ながらこのタスクはデプロイトークンを使用する方法のみサポートされており、 Service Principal を使用することができません。
こちらのブログ記事にて、 Static Web App CLI ではデプロイトークンの他に、 Azure CLI のログイン情報を使用した Service Principal でのデプロイがサポートされていると紹介されています。
記事の内容は GitHub Actions を使用した方法に言及されていましたが Azure Pipelines は名前が出るにとどまります。
本記事では Azure Pipelines から Static Web App CLI + Service Principal でデプロイを行う方法を紹介します。
Azure Static Web Apps にデプロイする
Azure Pipelines で Azure CLI を使用する最も簡単な方法は AzureCLI@2 タスクを使用することです。
AzureCLI@2 は指定したサービスコネクションを使用して Azure CLI にログインした状態で PowerShell や Bash で Azure CLI の操作ができるというタスクです。このタスクとサービスコネクションを使用すると、サブスクリプションや Service Principal 、シークレットと言った重要な情報の扱いを隠蔽した状態で Azure 操作を実行することができます。
実際にデプロイ操作を実行する YAML はこのようになります。
trigger: - main pool: vmImage: ubuntu-latest steps: - task: UseNode@1 inputs: version: 20.x - script: | npm i -g @azure/static-web-apps-cli - task: AzureCLI@2 inputs: azureSubscription: $(ServiceConnection) # サービスコネクションの名前を設定 useGlobalConfig: true # SWA CLI使用時は必ずtrueを設定する scriptType: bash scriptLocation: inlineScript inlineScript: | swa deploy \ --app-location=$(アプリのパス) \ --env=production \ --app-name=$(デプロイ先アプリの名前) \ --no-use-keychain \ --verbose=silly exit $?
注意すべき点は以下の3点です。
まず第1に、サービスコネクションで使用する認証形式はクライアントシークレットでもフェデレーション認証でも、どちらでも問題ありません。ただし該当の Service Principal にデプロイ先 Static Web Apps の RBAC 共同作成者 ロール等の付与は必須です。*1
第2に、 AzureCLI@2 タスクの useGlobalConfig オプションを true に設定することです。 AzureCLI@2 タスクのデフォルト設定ではこの設定は false となっており、その場合の挙動は以下ログの通り、 Azure CLI の設定ファイルを格納するディレクトリが標準のディレクトリから一時的なディレクトリに変更されます。
Setting AZURE_CONFIG_DIR env variable to: /home/vsts/work/_temp/.azclitask
しかしながら Static Web App CLI は Azure CLI のログイン情報を取得する際、 AZURE_CONFIG_DIR を考慮せずに Azure CLI の標準ディレクトリを固定で参照しています。そのためにログイン情報の取得に失敗しデプロイエラーとなります。
第3に、 exit $? と CLI デプロイコマンドの実行結果を Pipeline 側に返すようにすることです。これをしないとデプロイ結果が成功・失敗に関わらず常にタスク成功と見なされてしまうため、適切な後処理を行うことができません。
おわりに
今回は Azure Pipelines から Azure Static Web Apps に対して Service Principal を使用してデプロイする方法を紹介しました。
先日筆者が試した際は Azure CLI の設定ディレクトリが変更されていることに気付けず、また標準に戻す方法が提供されていたことにも気付かず、数時間悩む結果となりました。
本記事が皆様の手助けになれば幸いです。
*1:特権ロールですが、ちょうど良い組み込みロールが無いので共同作成者にしています