Open2
AWS
MacOS環境でRustとPythonのクロスビルドを行うと、Docker sam local invokeできない問題。
Rust周辺を巻き込んだエラー。lambdaの開発環境をryeで構築したり、polarsを使った前処理lambdaを作成時に直面した。原因はこれらしいがRustミリしらなので理解できていない。
ざっくりと要約すると(そうやって知識の劣化コピーが始まるんだぞ)、現状Rustをバイナリビルドする際にアーキテクチャレベルでの最適化が走るらしい。ホスト側がarm64だと、Docker環境をx86でエミュレートしても最適化がローカルホストを跨いで実行されてしまい、Docker側のサポート不足で動かすことはできないとのこと。
対処法を以下に記すが、両者ともにローカルテスト時のみ推奨なのでデプロイ時には戻しておくこと。
対処法1
SAM_BUILD_MODE=debug sam build
対処法2
sam local buildで立ち上げるコンテナもarm64に揃えてしまう。肝心のlambda functionはx64アーキテクチャなのでもはやテストの意味とは...となるが。
Type: AWS::Serverless::Function
Properties:
Architectures: arm64
PolarsをRosetta上で動かすとエラーが出る。
例えば使用するマシンと目的のリモートマシンとのアーキテクチャの違いを、シェルの指定時切り替えて吸収しようとしているそこの君!
もしくは次の記事のような環境を、MacOS上のDockerでx86環境を作って達成しようとしている君! 次の警告が出ることがあります。The following required CPU features were not detected:
sse4.2, popcnt, avx, avx2, fma, bmi1, bmi2, lzcnt, pclmulqdq #ここは不定
Continuing to use this version of Polars on this processor will likely result in a crash.
Install the `polars-lts-cpu` package instead of `polars` to run Polars with better compatibility.
Hint: If you are on an Apple ARM machine (e.g. M1) this is likely due to running Python under Rosetta.
It is recommended to install a native version of Python that does not run under Rosetta x86-64 emulation.
If you believe this warning to be a false positive, you can set the `POLARS_SKIP_CPU_CHECK` environment variable to bypass this check.
warnings.warn(
前のスクラップと同様Rustがせっかくアーキテクチャを分離した仮想環境を貫通してビルドの最適化を行うのが原因...?
対処法1
polars-lts-cpuを入れる。インストール時の名前は違うが使うときは気にせず
import polars as pl
でOK
対処法2
arm64環境下に直接pythonを入れる。ryeはMacOS/Linuxならコマンドは同じで、インストールされるOSを判断してよしなにそのアーキテクチャ用のものをインストールしてくれる。ローカルホストで閉じた個人開発環境の構築時にはこれで良さそう。