はじめに

MacからLambdaへPythonのプログラムをデプロイしたらRuntimeエラーになったので対処法を備忘録として残します。

やり方

まず、MacからLambdaへデプロイしたところ下記のエラーが発生しました。

Runtime.ImportModuleError: Unable to import module 'main': cannot import name 'cygrpc' from 'grpc._cython'

調べてみると、パッケージの依存関係の一部にネイティブパッケージが含まれているのが原因で、
Macでローカルビルドすることこのようなエラーが発生するようです。

解決策として、
EC2(Amazon Linux2)上でビルドするなど環境をクラウドに寄せてデプロイする方法が見つかりますが、
もっと簡単に解決する方法がないか色々試したところ、Lambdaのアーキテクチャを「arm64」にする方法を見つけました。

理屈としては、
M1 MacのMチップと同じCPUのアーキテクチャ(arm64)になったことでエラーが解消しています。

Lambdaのx86_64とarm64アーキテクチャについて

Lambda 関数の命令セットアーキテクチャの選択と設定
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/foundation-arch.html

ドキュメントから簡単に説明すると、
Lambdaのアーキテクチャとは、Lambdaの実行に使用するCPUの種類のことです。

  • arm64(Graviton 2)
    arm64はArm社がライセンスを持っているCPUのアーキテクチャで、
    Gravitonは、AWSが独自に設計したarmベースのCPUのことです。
  • x86_64
    x86_64は一般的なPCで使われていてるCPUのアーキテクチャで、
    Intel CoreシリーズやAMD RyzenシリーズなどのCPUのことです。

Lambdaにおいてコストやパフォーマンスでarm64の方が優れているという特徴もあります。
さらに詳しく知りたい場合は、上記のドキュメントをご参照ください。

ただし、構成を変更する場合、開発環境やCI/CDツールがx86_64の環境からデプロイする際に、
パッケージやレイヤーで互換性の問題が出る可能性が高くなるので注意が必要です。

それらの問題を考えてなくてもいい場合、arm64環境にしてみるのが楽です。

以上です。

さいごに

誰かのお役に立てれば幸いです。