Serverless Frameworkを使ったデプロイ時にInvalid cross-device linkが発生したときの対処法

2020.12.07

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

大阪オフィスの西村祐二です。

久しぶりにServerless Frameworkを使ってデプロイしようとした際に「OSError: [Errno 18] Invalid cross-device link」なるエラーで発生してハマってしまったので、その対処策を共有したいと思います。

  STDERR: ERROR: Exception:
  Traceback (most recent call last):
    File "/var/lang/lib/python3.8/shutil.py", line 788, in move
      os.rename(src, real_dst)
  OSError: [Errno 18] Invalid cross-device link: '/tmp/pip-target-j7urt8o9/lib/python/numpy' -> '/var/task/numpy'

※2020/12/7現在の情報です。

対処法

早速ですが、dockerアプリケーションの設定にあるUse gRPC FUSE for file sharingをOFFにすることでエラーが解消されてデプロイできるようになりました。

下記のISSUEに対処法がコメントされていました。ここにたどり着くまで時間がかかりました。。

https://github.com/UnitedIncome/serverless-python-requirements/issues/556

環境

  • Serverless Framework:2.4.0

  • ランタイム:python3.8

  • serverless-python-requirements:5.1.0

原因

Lambdaで非pureなPythonライブラリ(numpyなど)を利用するため、プラグインの「serverless-python-requirements 」を利用していました。

このライブラリはとても便利で、非pureなPythonライブラリを利用するためにLambdaの環境を模したコンテナlambci/lambdaを使って自動的にビルドして依存関係を解決してデプロイしてくれる機能があります。

その際に、裏でDockerのアプリケーションを利用しており、アプリケーション側の設定に影響を受けたということになるかと思います。

さいごに

「OSError: [Errno 18] Invalid cross-device link」エラーの対処法について記載しました。

Serverless Frameworkの「serverless-python-requirements」を使っていて同じエラーに遭遇して困っている人の助けになれたら幸いです。