This is the first time I’m deploying stuff to elasticbeanstalk, and when I’m trying to deploy my private project, I realized the eb cli I download is the version 2 and has different syntax. I installed the version 3, and it seems like it can only be installed using python package manager pip. After installing it, this is what I get:

rowanto@Rowanto-Deb ~ $ eb
Traceback (most recent call last):
  File "/usr/local/bin/eb", line 9, in <module>
    load_entry_point('awsebcli==3.0.10', 'console_scripts', 'eb')()
  File "/usr/local/lib/python2.7/dist-packages/pkg_resources/__init__.py", line 519, in load_entry_point
    return get_distribution(dist).load_entry_point(group, name)
  File "/usr/local/lib/python2.7/dist-packages/pkg_resources/__init__.py", line 2630, in load_entry_point
    return ep.load()
  File "/usr/local/lib/python2.7/dist-packages/pkg_resources/__init__.py", line 2310, in load
    return self.resolve()
  File "/usr/local/lib/python2.7/dist-packages/pkg_resources/__init__.py", line 2316, in resolve
    module = __import__(self.module_name, fromlist=['__name__'], level=0)
  File "/usr/local/lib/python2.7/dist-packages/ebcli/core/ebcore.py", line 23, in <module>
    from ..controllers.initialize import InitController
  File "/usr/local/lib/python2.7/dist-packages/ebcli/controllers/initialize.py", line 16, in <module>
    from ..core.abstractcontroller import AbstractBaseController
  File "/usr/local/lib/python2.7/dist-packages/ebcli/core/abstractcontroller.py", line 21, in <module>
    from ..core import io, fileoperations, operations
  File "/usr/local/lib/python2.7/dist-packages/ebcli/core/operations.py", line 25, in <module>
    from ..lib import elasticbeanstalk, s3, iam, aws, ec2, elb
  File "/usr/local/lib/python2.7/dist-packages/ebcli/lib/elasticbeanstalk.py", line 25, in <module>
    from ..lib import aws
  File "/usr/local/lib/python2.7/dist-packages/ebcli/lib/aws.py", line 17, in <module>
    import botocore_eb.session
  File "/usr/local/lib/python2.7/dist-packages/botocore_eb/session.py", line 27, in <module>
    import botocore_eb.credentials
  File "/usr/local/lib/python2.7/dist-packages/botocore_eb/credentials.py", line 27, in <module>
    from botocore_eb.utils import InstanceMetadataFetcher, parse_key_val_file
  File "/usr/local/lib/python2.7/dist-packages/botocore_eb/utils.py", line 22, in <module>
    from botocore_eb.vendored import requests
  File "/usr/local/lib/python2.7/dist-packages/botocore_eb/vendored/requests/__init__.py", line 53, in <module>
    from .packages.urllib3.contrib import pyopenssl
  File "/usr/local/lib/python2.7/dist-packages/botocore_eb/vendored/requests/packages/urllib3/contrib/pyopenssl.py", line 55, in <module>
    orig_connectionpool_ssl_wrap_socket = connectionpool.ssl_wrap_socket
AttributeError: 'module' object has no attribute 'ssl_wrap_socket'
rowanto@Rowanto-Deb ~ $ 

And I’m like, what? Googling around the last line returns you many result, but not those relevant with the eb cli v3. There’s also a post which suggest that we use the bundle version (it’s a zip file) of aws cli, but I can’t find a bundle version of eb cli. Long story short, I found this post which helped me to fix the problem. Thanks to @guss77!

You just need to run these two lines:

sudo apt-get purge python-ndg-httpsclient
sudo pip install ndg-httpsclient==0.3.1

Basically, it just removes the problematic package and install it using the python package manager (a.k.a pip). It works for me, and I hope it works for you too!