AWSのElasticBeanstalkにはコマンドラインツールがあり、非常に便利なのですがわかりにくいエラーを吐き出すことも多いため調査が大変です。
今回私が遭遇したのも最初は?というものでした。
まず環境は
・Ruby2.7
・Rails6
・CircleCI2.1からのデプロイ
です。CircleCIは2018年位からDocker化を進めており、もはや1系は使えないためDocker前提でConfigも作成しないといけません。すなわち以下のようなconfigを作成することになります。
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
ここを見ると3.20.0が2021年6月に出ており、これが悪さしてそうです。
ということで固定してみました。
- 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
としても問題発生しないので何が違うのかというのをソースベースで追いかけてしまいがちです。
というところでお役に立てば幸いです。