Serverless FrameworkでデプロイしようとしたらUnknown path formatというエラーで詰まった話

2020.06.04

水上ともうします。

かなり限定される事象になると思うのですが、今回自分が詰まった事象と解決した方法について書き残すことで同じことで困っている方の助けになればと思っています。

事象

発生した事象としてはServerless Frameworkのserverless-python-requirementsというプラグインを使用してAWS環境へデプロイをしようとした際に以下のように Unknown path formatというエラーがでてしまうというものです。

$ sls deploy
Serverless: Generated requirements from /c/work/mizukami-test/requirements.txt in /c/work/mizukami-test/.serverless/requirements.txt...
Serverless: Installing requirements from /home/mizukami/.cache/serverless-python-requirements/58d3bf3f63b7175c0a728986ca685c72bf4e083f23856d5e53284c49bd7d2b2e_slspyc/requirements.txt ...
Serverless: Docker Image: lambci/lambda:build-python3.7

Error --------------------------------------------------

Error: Unknown path format kami/.cache/serverless-python-requirements/58d3bf3f63b7175c0a728986ca685c72bf4e083f23856d5e53284c49bd7d2b2e_slspyc...

プラグインについてはここでは詳しく触れませんので以下の記事をご参照いただければと思います。

Serverless Frameworkのプラグインを利用した外部モジュールの管理

結論

いろいろ試したのですが、以下のどちらかを満たしている場合発生してしまうという結論に達しました。

以降は本当にこの条件で起きているのかを検証していきます。

  1. serverless-python-requirementsのバージョンが5.x
  2. ディレクトリがWSLのファイルシステム上(Windowsから参照できない場所)になっている

環境

検証の前に私の環境を開示します。

  • Windows10 Pro バージョン 1809(ビルド 17763.1217)
  • WSL *1 Ubuntu 18.04.4 LTS
  • Docker Desktop for Windows 2.3.0.3(44519)

検証その1(プラグインのバージョン)

検証用のディレクトリとしてWindowsのCドライブ直下のディレクトリを用意しました。 *2

つまり2の条件を除外して、1の条件のみで発生するのか確認します。

$ ln -s /c/work/ work
$ ls -l work
lrwxrwxrwx 1 mizukami mizukami 8 Jun 4 15:39 work -> /c/work/

上記のディレクトリにserverless-python-requirementsプラグインを使用している任意のアプリケーションを用意します。

$ pwd
/home/mizukami/work/mizukami-test

$ ls -l
total 0
-rw-rw-rw- 1 mizukami mizukami 497 Jun 4 15:41 handler.py
-rw-rw-rw- 1 mizukami mizukami 22 Jun 4 15:41 requirements.txt
-rw-rw-rw- 1 mizukami mizukami 277 Jun 4 15:44 serverless.yml

serverless.yml

service: mizukami-test

provider:
  name: aws
  runtime: python3.7
  region: ap-northeast-1


plugins:
  - serverless-python-requirements
functions:
  hello:
    handler: handler.hello

custom:
  pythonRequirements:
    dockerizePip: true

ではこのディレクトリにプラグインをインストールしてデプロイを実行してみましょう。

 

$ sls plugin install -n serverless-python-requirements
Serverless: Creating an empty package.json file in your service directory
Serverless: Installing plugin "serverless-python-requirements@latest" (this might take a few seconds...)
Serverless: Successfully installed "serverless-python-requirements@latest"

$ cat package.json
{
"name": "mizukami-test",
"description": "",
"version": "0.1.0",
"dependencies": {},
"devDependencies": {
"serverless-python-requirements": "^5.1.0"
}
}

執筆時点では5.1.0がインストールされました。

そしてデプロイ。

$ sls deploy
Serverless: Generated requirements from /c/work/mizukami-test/requirements.txt in /c/work/mizukami-test/.serverless/requirements.txt...
Serverless: Installing requirements from /home/mizukami/.cache/serverless-python-requirements/58d3bf3f63b7175c0a728986ca685c72bf4e083f23856d5e53284c49bd7d2b2e_slspyc/requirements.txt ...
Serverless: Docker Image: lambci/lambda:build-python3.7

Error --------------------------------------------------

Error: Unknown path format kami/.cache/serverless-python-requirements/58d3bf3f63b7175c0a728986ca685c72bf4e083f23856d5e53284c49bd7d2b2e_slspyc...

想定通り、エラーがでました!

次にプラグインのバージョンを4.3.0にしてみます。

sls plugin install -n serverless-python-requirements@4.3.0という風にコマンドを発行すればバージョン指定ができるようです。

$ sls plugin install -n serverless-python-requirements@4.3.0
Serverless: Installing plugin "serverless-python-requirements@4.3.0" (this might take a few seconds...)
Serverless: Successfully installed "serverless-python-requirements@4.3.0"

$ cat package.json
{
"name": "mizukami-test",
"description": "",
"version": "0.1.0",
"dependencies": {},
"devDependencies": {
"serverless-python-requirements": "^4.3.0"
}
}

そして、同じようにデプロイしてみます。

$ sls deploy
Serverless: Generated requirements from /c/work/mizukami-test/requirements.txt in /c/work/mizukami-test/.serverless/requirements.txt...
Serverless: Installing requirements from /c/work/mizukami-test/.serverless/requirements/requirements.txt ...
Serverless: Docker Image: lambci/lambda:build-python3.7
Serverless: Running docker run --rm -v /c/work/mizukami-test/.serverless/requirements\:/var/task\:z lambci/lambda\:build-python3.7 /bin/sh -c 'python3.7 -m pip install -t /var/task/ -r /var/task/requirements.txt && chown -R 1000\\:1000 /var/task'...
Serverless: Packaging service...
Serverless: Excluding development dependencies...
Serverless: Injecting required Python packages to package...

...........

Serverless: Stack update finished...
Service Information
service: mizukami-test
stage: dev
region: ap-northeast-1
stack: mizukami-test-dev
resources: 6
api keys:
None
endpoints:
None
functions:
hello: mizukami-test-dev-hello
layers:
None
Serverless: Removing old service artifacts from S3...
Serverless: Run the "serverless" command to setup monitoring, troubleshooting and testing.

デプロイできました。(やったね)

検証その2(ディレクトリの場所)

次はUbuntu(WSL)のホームディレクトリ上で同じ構成を用意してみます。

$ pwd
/home/mizukami/mizukami-test

$ ls -l
total 0
-rw-rw-rw- 1 mizukami mizukami 497 Jun 4 12:49 handler.py
-rw-rw-rw- 1 mizukami mizukami 22 Jun 4 12:49 requirements.txt
-rw-rw-rw- 1 mizukami mizukami 240 Jun 4 16:18 serverless.yml

先ほどは成功したバージョン4.3.0のプラグインをインストールしてデプロイしてみましょう。

$ sls plugin install -n serverless-python-requirements@4.3.0
Serverless: Creating an empty package.json file in your service directory
Serverless: Installing plugin "serverless-python-requirements@4.3.0" (this might take a few seconds...)
Serverless: Successfully installed "serverless-python-requirements@4.3.0"

$ cat package.json
{
"name": "mizukami-test",
"description": "",
"version": "0.1.0",
"dependencies": {},
"devDependencies": {
"serverless-python-requirements": "^4.3.0"
}
}
$ sls deploy
Serverless: Generated requirements from /home/mizukami/mizukami-test/requirements.txt in /home/mizukami/mizukami-test/.serverless/requirements.txt...
Serverless: Installing requirements from /home/mizukami/mizukami-test/.serverless/requirements/requirements.txt ...
Serverless: Docker Image: lambci/lambda:build-python3.7

Error --------------------------------------------------

Error: Unknown path format kami/mizukami-test/.serverless/requirements...

こちらではUnknown path formatが出てしまいました。

ということで、プラグインのバージョンに関わらずこの場所ではうまくいかないと思いました。(念のため5.1.0でも試しましたがうまくいきませんでした)

感想

今回の事象、プラグインのバージョンによるものという話はネット検索で見つけることができたのですが、ディレクトリの場所によっても発生しているとはなかなか気づけなかったです。。。

おそらくかなりおま環なことだと思っているのですが、同じことで悩んでる方をこの記事で救えることを祈ります。

脚注

  1. WSL2ではないです!
  2. この行為自体の賛否もあるかもですが、あくまで検証用なので見逃してください!