はじめに

記事の目的

M1 MacのローカルでVSCodeを使ってAzure Functionを作成しようとした際にエラーが発生し、解決策を調べていたが英語のドキュメントしかなかったため、日本語向けに記事を作成します。

M1 MacでのAzure Functions Core Toolsのエラーについて

M1 MacでAzure Functions Core Toolsを実行すると、以下リンクのようなエラーが表示されます。GitHubのIssueには報告されていますが、まだ対応されていないようです。

Microsoft.Azure.WebJobs.Script: Architecture Arm64 is not supported for language python
Support running on M1 Macs [Python] · Issue #915 · Azure/azure-functions-python-worker
Hey, i am running into issues with python azure function under VSCode. FYI the same example I will present is working fine with JS. Set up: Mac M1 Big Sur v11.2.1 python 3.9.1 Core Tools Version: 3…

解決策: Rosetta を利用してAzure Functions Core Toolsを実行する

残念ながら、この対応をしてもVSCodeの拡張機能から起動できません、RosettaのTerminalから起動します。面倒ですが、我慢してください。

Terminalを複製してRosetta起動を作る

ターミナルを以下のように複製します。

Rosetta起動のためのターミナルで、「情報を見る」から「Rosettaを使用して開く」をONに設定します。

Homebrewをインストール

Homebrewは、起動時のアーキテクチャごとに別々にインストールされるそうです。Rosettaを起動してインストールし、必要に応じて自分で使用しているものを追加してください。

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

ただし、起動ごとにアーキテクチャを確認して使い分けが必要です。.zshrcを以下のように変更します。

if [ "$(arch)" = "arm64" ]; then
    eval "$(/opt/homebrew/bin/brew shellenv)"
else
    eval "$(/usr/local/bin/brew shellenv)"
fi
Setting up M1 Macs for x86 development with Homebrew
Setting up M1 Macs for x86 development with Homebrew - README.md

Python(pyenv)とAzure Functions Core Toolsのインストール

Pythonは、直接インストールしても構いませんし、pyenvを使用しても構いません。好みに合わせてインストールしてください。ここではpyenvを使用します。

brew install pyenv

pyenvの場合、起動ごとにアーキテクチャで設定が必要です。以下が設定例です。

if [ "$(arch)" = "arm64" ]; then
    eval "$(/opt/homebrew/bin/brew shellenv)"
else
    eval "$(/usr/local/bin/brew shellenv)"

    #pyenv settings
    alias pyinstaller=”$HOME/.pyenv-i386/shims/pyinstaller”
    export PYENV_ROOT=~/.pyenv-i386
fi

#pyenv
if command -v pyenv 1>/dev/null 2>&1; then
    if [ $(arch) = "i386" ]; then
        echo "pyenv i386 settings"
        export PATH="$HOME/.pyenv-i386/bin:$PATH"
        eval "$(pyenv init -)"
    else
        export PATH="$HOME/.pyenv/bin:$PATH"
        eval "$(pyenv init -)"
    fi
fi
pyenv on multiple architectures (arm & x86_64) with pyinstaller
switching architectures ARM64 / x86_64

以下のようにアーキテクチャごとにインストールが可能になります。

Azure Functions Core Toolsのインストール

Rosettaを起動したターミナルでインストールを行います。

brew tap azure/functions
brew install azure-functions-core-tools@4

プロジェクトに移動し、起動します。

func start

なお、Rosettaを起動していないターミナルでは、エラーが発生することに注意してください。

Work with Azure Functions Core Tools
Learn how to code and test Azure Functions from the command prompt or terminal on your local computer before you run them on Azure Functions.

vscodeの設定

VSCodeから使用できないと使いにくいため、設定を追加します。設定画面を開いて、以下の内容を入力します。

    "terminal.integrated.profiles.osx": {
        "rosetta": {
            "path": "arch",
            "args": [
                "-x86_64",
                "zsh",
                "-l"
            ],
            "overrideName": true
        }
    }

これでRosettaが追加されます。

ここから起動してください。

Develop Azure Functions by using Visual Studio Code
Learn how to develop and test Azure Functions by using the Azure Functions extension for Visual Studio Code.

まとめ

  • M1 MacでAzure Functions Core Toolsを使う際のエラー解決方法を紹介
  • 今後の修正されることが期待されるが、現状ではこの方法が最適解