Contents
開発環境のセットアップと必須ツールのインストール
ローカルで Python 製 Azure Functions を快適に開発するには、公式が提供している Azure CLI と Azure Functions Core Tools の最新版を導入し、Python 仮想環境で依存関係を管理することが基本です。ここではインストール手順と、ネイティブ依存ライブラリ・セキュリティ設定の留意点も合わせて解説します。
Azure CLI と Functions Core Tools のインストールとバージョン確認
Azure CLI と Functions Core Tools はどちらも Homebrew(macOS / Linux)や公式インストーラで取得できます。導入後は必ずバージョンを確認し、最新版であることを確かめましょう。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# Azure CLI のインストール (Homebrew) brew update && brew install azure-cli # バージョン確認 az version # {"azure-cli": "x.x.x", …} # Functions Core Tools のインストール (v4 系が推奨) brew tap azure/functions brew install azure-functions-core-tools@4 # バージョン確認 func --version # 例: func version 4.x.x |
ポイント
-az upgradeで CLI の自動更新が可能です。
- Windows 環境では MSI パッケージ、Linux(Debian 系)では APT リポジトリを利用してください。
Python 仮想環境と依存関係管理、ネイティブライブラリへの対応
Python 3.11 をベースに仮想環境を作成し、requirements.txt にすべてのパッケージをロックします。暗号化やデータ解析系のライブラリは C コンパイラが必要なことが多いため、事前に OS のビルドツールをインストールしておくとトラブルが減ります。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
# プロジェクトディレクトリ作成 mkdir myfunc && cd myfunc # 仮想環境作成 (Python 3.11 がインストールされている前提) python3.11 -m venv .venv source .venv/bin/activate # Windows: .venv\Scripts\activate # OS のビルドツールをインストール(Ubuntu の例) sudo apt-get update && sudo apt-get install -y build-essential libssl-dev libffi-dev python3-dev # パッケージインストール & ロック pip install --upgrade pip pip install azure-functions pytest pip freeze > requirements.txt |
セキュリティ観点
- 仮想環境外のシステムパスに依存しないよう、--target .venv/lib/python3.11/site-packagesで明示的にインストールすると安全です。
-requirements.txtは CI のビルド時に必ず検証し、脆弱性情報(GitHub Dependabot 等)と照合してください。
プロジェクト構成とコードの配置
適切なディレクトリ構造はデプロイ時のパッケージングをシンプルにし、CI/CD パイプラインでも扱いやすくなります。以下は実務で広く採用されている構成例です。
推奨ディレクトリ構造
src/ 配下に関数本体を配置し、テストコードと設定ファイルはプロジェクトルートに置きます。これにより func pack や zip デプロイ時に余計なファイルが混入するのを防げます。
|
1 2 3 4 5 6 7 8 9 10 11 12 |
myfunc/ ├─ src/ # 関数コード │ ├─ HttpTrigger/ │ │ ├─ __init__.py # 関数本体 │ │ └─ function.json # トリガー定義 │ └─ __init__.py ├─ tests/ # ユニットテスト │ └─ test_http_trigger.py ├─ requirements.txt # 依存パッケージ一覧 ├─ host.json # Functions ランタイム設定 └─ .funcignore # デプロイ除外ファイル(任意) |
関数単位の実装例と依存管理
各関数は独立したサブフォルダーに function.json と __init__.py を置き、共通の requirements.txt でライブラリを一元管理します。
|
1 2 3 4 5 6 7 8 9 10 |
# src/HttpTrigger/__init__.py import logging import azure.functions as func def main(req: func.HttpRequest) -> func.HttpResponse: name = req.params.get('name') if not name: return func.HttpResponse("Please pass a name.", status_code=400) return func.HttpResponse(f"Hello, {name}!", status_code=200) |
requirements.txt の例(最低限):
|
1 2 |
azure-functions==1.18.* |
ポイント
- ライブラリのバージョンは*でマイナーバージョンまで固定し、パッチ更新による互換性問題を回避します。
- テストコードはローカルの仮想環境だけで実行できるようにpytestを利用してください。
Azure への Function App 作成(Linux Consumption と Premium)
Python 3.11 がサポートされた Linux ベースのプランは Consumption と Premium の二つが主流です。CLI による作成手順と、プラン選択時に考慮すべきセキュリティ設定をまとめます。
Azure CLI を用いた Function App の作成手順
以下のコマンドは変数部分(リソース名・リージョン)だけを書き換えればどちらのプランでも利用できます。--runtime-version 3.11 がポイントです。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
# 共通:リソースグループとストレージアカウント作成 az group create --name rg-myfunc --location japaneast az storage account create \ --name stmyfunc$(date +%s) \ --resource-group rg-myfunc \ --location japaneast \ --sku Standard_LRS # Consumption プランで Function App を作成 az functionapp create \ --resource-group rg-myfunc \ --consumption-plan-location japaneast \ --runtime python \ --runtime-version 3.11 \ --functions-version 4 \ --name myfunc-consume \ --storage-account stmyfunc$(date +%s) # Premium プランで Function App を作成(事前に App Service Plan が必要) az appservice plan create \ --name premium-plan \ --resource-group rg-myfunc \ --location japaneast \ --sku EP1 \ --is-linux az functionapp create \ --resource-group rg-myfunc \ --plan premium-plan \ --runtime python \ --runtime-version 3.11 \ --functions-version 4 \ --name myfunc-premium \ --storage-account stmyfunc$(date +%s) |
留意点
- Premium プランでは VNet 統合や常駐インスタンスが利用でき、セキュリティ要件が高い場合に有効です。
- Consumption は従量課金でコスト最適化に向きますが、Cold Start が発生する点に注意してください。
ランタイム設定・プラン選択のベストプラクティスとセキュリティ設定
| 項目 | Consumption | Premium |
|---|---|---|
| 起動遅延(Cold Start) | あり(数秒〜十数秒) | なし(常駐インスタンス) |
| 最大同時実行数 | 自動スケール、上限はプランに依存 | 手動で最小/最大インスタンス数指定可 |
| VNet 統合 | 非対応 | 対応 |
| コスト | 実行回数+使用リソースの従量課金 | プロビジョニングされたインスタンス単位 |
セキュリティ強化オプション(CLI 例)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
# Managed Identity の有効化 az functionapp identity assign -g rg-myfunc -n myfunc-premium # VNet 統合(Premium プランのみ) az functionapp vnet-integration add \ -g rg-myfunc -n myfunc-premium \ --vnet myVnet --subnet mySubnet # CORS 設定例 az functionapp cors add -g rg-myfunc -n myfunc-premium --allowed-origins https://myfrontend.example.com # HTTPS のみ強制 az functionapp config set -g rg-myfunc -n myfunc-premium --https-only true # Azure Key Vault からシークレットを参照 az functionapp config appsettings set \ -g rg-myfunc -n myfunc-premium \ --settings "MY_SECRET=@Microsoft.KeyVault(SecretUri=https://mykv.vault.azure.net/secrets/MySecret/)" |
デプロイ方法と CI/CD パイプライン
ローカルでの手動デプロイと、GitHub Actions を用いた自動化の両方を紹介します。どちらも zip パッケージングが基本です。
手動 zip デプロイと自動化の選択肢
まずは src/ 以下だけを対象にした zip ファイルを作成し、CLI でアップロードします。手順はシンプルですが、CI に組み込むことで再現性が向上します。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
# 仮想環境がアクティブな状態で依存パッケージをローカルにインストール pip install -r requirements.txt --target ./.python_packages # zip パッケージ作成(src と .python_packages のみ) cd src zip -r ../function.zip . ../.python_packages cd .. # 手動デプロイ(Function App 名は適宜置換) func azure functionapp publish myfunc-consume --python # CI 用に Azure CLI で zip デプロイ az functionapp deployment source config-zip \ -g rg-myfunc -n myfunc-premium --src function.zip |
ポイント
---targetオプションでネイティブ依存ライブラリを含めた形にすると、Linux 環境でもビルド不要です。
- デプロイ前にローカルでfunc startして動作確認する習慣がトラブル防止につながります。
GitHub Actions によるビルド・テスト・デプロイ例
以下のワークフローはプッシュ時に自動でパッケージを生成し、Azure にデプロイします。シークレット管理やログ取得も含めた実装例です。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
name: Deploy Azure Functions (Python) on: push: branches: [ main ] jobs: build-deploy: runs-on: ubuntu-latest steps: # ソースコード取得 - uses: actions/checkout@v4 # Python 環境構築 - name: Set up Python 3.11 uses: actions/setup-python@v5 with: python-version: "3.11" - name: Install build dependencies (Linux) run: | sudo apt-get update && sudo apt-get install -y build-essential libssl-dev libffi-dev python3-dev # 仮想環境作成 & 依存インストール - name: Create virtual environment & install packages run: | python -m venv .venv source .venv/bin/activate pip install --upgrade pip pip install -r requirements.txt --target ./.python_packages # テスト実行 - name: Run unit tests run: | source .venv/bin/activate pytest tests/ # zip 作成(src とパッケージ) - name: Package function app run: | cd src zip -r ../function.zip . ../../.python_packages # Azure へログイン - uses: azure/login@v1 with: creds: ${{ secrets.AZURE_CREDENTIALS }} # デプロイ実行 - name: Deploy to Function App run: | az functionapp deployment source config-zip \ -g rg-myfunc -n myfunc-premium --src function.zip # ログストリームでデプロイ結果を確認(オプション) - name: Tail logs (optional) if: failure() run: | az functionapp log tail -g rg-myfunc -n myfunc-premium |
セキュリティ考慮
-AZURE_CREDENTIALSは Service Principal の JSON を暗号化して保存し、最小権限(Contributor + Managed Identity 付与)に限定します。
- 環境変数やシークレットは Azure Key Vault 経由で取得し、コードベースに平文を書かないようにします。
よくあるエラーと対策
実務で頻出する障害をあらかじめ把握しておくことで、デバッグ時間を大幅に削減できます。ここでは三つの典型的なケースを取り上げます。
Python バージョン不一致の防止
| 症状 | 原因 | 解決策 |
|---|---|---|
Unsupported Python version エラーが Function App 起動時に出る |
ローカルで作成した仮想環境と Azure のランタイムバージョンが食い違っている | 1. python --version でローカルのバージョンを確認2. ポータルまたは CLI ( az functionapp config set --runtime python --runtime-version 3.11) で Azure 側も同一に設定 |
ImportError: No module named 'azure.functions' |
デプロイ時に requirements.txt が古い、または zip にパッケージが含まれていない |
CI のビルドステップで必ず pip freeze > requirements.txt を実行し、--target でパッケージを zip に同梱 |
ネイティブ依存ライブラリやファイルパス問題への対応
- ビルドツール不足:
cryptography,pandas,lxml等は C コンパイラが必要です。Linux の CI ランナーではbuild-essential libssl-dev libffi-dev python3-devを事前にインストールしてください。 - 相対パスの誤り:ローカル実行時はプロジェクトルートから参照できても、デプロイ後は
/home/site/wwwrootがカレントです。コード内ではos.path.join(os.getenv("HOME"), "site", "wwwroot", "data")のように環境変数ベースで組み立てましょう。 - zip に除外漏れ:
.funcignoreに__pycache__/,.venv/など不要ファイルを列記し、サイズ肥大化とデプロイ失敗を防ぎます。
ログ確認とトラブルシューティングのポイント
- Azure Portal の「Log stream」
- リアルタイムでコンテナ標準出力が取得でき、スタックトレースが即座に見える。
- CLI からのログ取得
bash
az functionapp log tail -g rg-myfunc -n myfunc-premium - Application Insights の有効化(推奨)
az monitor app-insights component createで作成し、WEBSITE_MONITORING_ENABLE=trueを設定すると、詳細な依存関係とレイテンシが可視化できる。
まとめと実践チェックリスト
- ツールは公式最新版:Azure CLI と Functions Core Tools は導入後必ずバージョン確認。
- Python 環境は統一:ローカル仮想環境と Azure Runtime を同一(3.11)に保つ。
- ディレクトリ構造は
src/主体:関数コード・テスト・設定を明確に分離し、zip 作成対象を限定。 - ネイティブ依存はビルドツールで事前対策:Linux CI では必須パッケージを apt 経由でインストール。
- セキュリティ設定は忘れずに:Managed Identity、VNet 統合、CORS、HTTPS 強制、Key Vault からのシークレット取得。
- デプロイは zip + CLI:手動は
func publish、CI はaz functionapp deployment source config-zipを使用。 - エラーログは即確認:Portal の Log stream、CLI tail、Application Insights のいずれかで原因を特定。
上記の手順とベストプラクティスに沿って構築すれば、2024 年以降も安定した Python Azure Functions の開発・デプロイが実現できます。ぜひ本チェックリストを作業前に確認し、継続的インテグレーションのフローに組み込んでください。