eb deploy でImportError: cannot import name JSONDecodeError

AWSのElasticBeanstalkにはコマンドラインツールがあり、非常に便利なのですがわかりにくいエラーを吐き出すことも多いため調査が大変です。
今回私が遭遇したのも最初は？というものでした。
まず環境は
・Ruby2.7
・Rails6
・CircleCI2.1からのデプロイ
です。CircleCIは2018年位からDocker化を進めており、もはや1系は使えないためDocker前提でConfigも作成しないといけません。すなわち以下のようなconfigを作成することになります。

```yml:.circleci/config.yml
version: 2.1
orbs:
  ruby: circleci/ruby@0.1.2

jobs:
  build:
    working_directory: ~/myapp
    parallelism: 1
    shell: /bin/bash --login
    docker:
      - image: circleci/ruby:2.7.3-node-browsers

    steps:
      - run:
          working_directory: ~/myapp
          command: sudo apt-get update && sudo apt-get install python3-pip groff-base
      - run:
          working_directory: ~/myapp
          command: pip3 install pip==20.3.4
      - run:
          working_directory: ~/myapp
          command: pip3 install urllib3==1.26
      - run:
          working_directory: ~/myapp
          command: pip3 install awsebcli --upgrade --user
      - checkout
      - run:
          name: install dependencies
          command: |
            gem install bundler -v 2.2.0
            bundle install --jobs=4 --retry=3 --path vendor/bundle
      - run:
          name: Deploy
          command: |
            eb deploy
```

これはDockerでプラットフォームを選択して（circleci/ruby:2.7.3-node-browsers）そこにAWSEBCLI（AWSのElasticBeanstalk用のコマンドラインツール）をpipコマンドでインストールするように仕掛けています。
その後CircleCI上にソースをチェックアウトして `eb deploy`コマンドでデプロイするという仕組みです。
ところがある日突然以下のようなエラーでデプロイできなくなりました。

```
Deploy myapp
Traceback (most recent call last):
  File "/home/ubuntu/.local/bin/eb", line 11, in <module>
    load_entry_point('awsebcli==3.20.0', 'console_scripts', 'eb')()
  File "/home/ubuntu/.local/lib/python2.7/site-packages/pkg_resources/__init__.py", line 489, in load_entry_point
    return get_distribution(dist).load_entry_point(group, name)
  File "/home/ubuntu/.local/lib/python2.7/site-packages/pkg_resources/__init__.py", line 2852, in load_entry_point
    return ep.load()
  File "/home/ubuntu/.local/lib/python2.7/site-packages/pkg_resources/__init__.py", line 2443, in load
    return self.resolve()
  File "/home/ubuntu/.local/lib/python2.7/site-packages/pkg_resources/__init__.py", line 2449, in resolve
    module = __import__(self.module_name, fromlist=['__name__'], level=0)
  File "/home/ubuntu/.local/lib/python2.7/site-packages/ebcli/core/ebcore.py", line 19, in <module>
    from ebcli.core import ebglobals, base, hooks
  File "/home/ubuntu/.local/lib/python2.7/site-packages/ebcli/core/hooks.py", line 20, in <module>
    from ebcli.core import fileoperations
  File "/home/ubuntu/.local/lib/python2.7/site-packages/ebcli/core/fileoperations.py", line 32, in <module>
    from json import load, JSONDecodeError
ImportError: cannot import name JSONDecodeError

Exited with code exit status 1
```

こちらのRedditの記事（ https://www.reddit.com/r/aws/comments/ny6c3p/eb_deploy_failing_importerror_cannot_import_name/ ）を見たところ、awsebcliのバージョンが最新だとこのようなエラーになるとのこと。
2021年の5月頃に出たバージョンがよろしくない模様。バージョンを固定せよとあります。

https://pypi.org/project/awsebcli/3.20.0/#history
ここを見ると３．２０．０が２０２１年６月に出ており、これが悪さしてそうです。

ということで固定してみました。

```
      - run:
          working_directory: ~/good-good-mart/apps-goodgoodmart
          command: pip3 install awsebcli==3.19.4 --upgrade --user
```
このように変更したところエラーはなくなり、デプロイできました。

このトラブルの本質的な問題として、AWSEBCLIのインストールについて `pip3 install awsebcli --upgrade --user` と書いてある文献があまりに多く、CIで毎度Docker内に環境構築しているとCI実行都度最新版のコマンドラインツールに差し替えられてしまうというのが盲点というところでしょうか。
実際ローカル環境から `eb deploy` としても問題発生しないので何が違うのかというのをソースベースで追いかけてしまいがちです。

というところでお役に立てば幸いです。