【问题标题】:ImportError: No module named boto3 on AWS EC2 instanceImportError:AWS EC2 实例上没有名为 boto3 的模块
【发布时间】:2019-07-04 17:41:53
【问题描述】:

我正在运行我的 AWS EC2 实例,当我尝试运行我的 Web 应用程序 MyCoolApp.py 时,我收到以下错误:

Traceback (most recent call last):   
File "MyCoolApp.py", line 9, in <module>
    import boto3
ImportError: No module named boto3

这是在我尝试启动我所做的应用程序之后,并且在我使用以下命令进行最新更改之前曾经这样做过:

[ec2-user@ip-XXX-XXX-XXX-XXX CoolApp]$ sudo python MyCoolApp.py

您可以猜到我正在尝试导入 Boto3 以供使用,我在我的 python 应用程序中使用以下代码在我的程序顶部执行此操作:

from werkzeug.security import check_password_hash, generate_password_hash
from datetime import datetime
import time, os, random, json
import urllib
import boto3

最后,因为我知道你会问这个,是的,我已经安装了 Boto3,当我运行 pip freeze 时,我可以看到它。这是下面的输出:

[ec2-user@ip-XXX-XXX-XXX-XXX CoolApp]$ pip freeze
alembic==0.9.9
aws-cfn-bootstrap==1.4
awscli==1.15.83
Babel==0.9.4
backports.ssl-match-hostname==3.4.0.2
blinker==1.4
boto==2.48.0
boto3==1.9.87
botocore==1.12.87
chardet==2.0.1
click==6.7
cloud-init==0.7.6
colorama==0.2.5
configobj==4.7.2
docutils==0.14
ecdsa==0.11
Flask==1.0.2
Flask-Login==0.4.1
Flask-Mail==0.9.1
Flask-Migrate==2.1.1
Flask-Mobility==0.1.1
Flask-SQLAlchemy==2.3.2
futures==3.2.0
hibagent==1.0.0
iniparse==0.3.1
itsdangerous==0.24
Jinja2==2.10
jmespath==0.9.3
jsonpatch==1.2
jsonpointer==1.0
kitchen==1.1.1
lockfile==0.8
Mako==1.0.7
MarkupSafe==1.0
mysql-connector-python==8.0.11
paramiko==1.15.1
PIL==1.1.6
pip-tools==3.3.2
ply==3.4
protobuf==3.5.2.post1
pyasn1==0.1.7
pycrypto==2.6.1
pycurl==7.19.0
pygpgme==0.3
pyliblzma==0.5.3
pystache==0.5.3
python-daemon==1.5.2
python-dateutil==2.7.3
python-editor==1.0.3
pyxattr==0.5.0
PyYAML==3.10
requests==1.2.3
rsa==3.4.1
s3transfer==0.1.13
simplejson==3.6.5
six==1.11.0
SQLAlchemy==1.2.7
urlgrabber==3.10
urllib3==1.24.1
virtualenv==15.1.0
Werkzeug==0.14.1
yum-metadata-parser==1.1.4

现在因为我怀疑有人会建议这个,所以我现在要阻止它。我将这些软件包全部安装到我的 --user 中。我没有使用虚拟环境,是的,我知道我应该使用,但我不认为我会需要一个,因为一切都在一台服务器上运行。是的,我承认这可能是一个错误,我在其他任何地方都使用它们,但如果我能在这个错误上得到一些帮助,那将不是重点。它在我的本地机器上启动并且运行良好,只是当我尝试在我的服务器上运行它时它失败了。

最后,如果这是由于与我的服务器上的软件包发生冲突,如果有人可以帮助我弄清楚如何删除它们,那就太好了,因为我在 AWS AMI Linux 上,所以将不胜感激。

【问题讨论】:

  • 您使用sudo 运行脚本但没有使用pip freeze,并且您注意到您使用--user 标志运行pip install。你是 pip install --user 是 root(即 sudo)还是你本地的 ec2-user
  • 您使用的是 Python 2 还是 Python 3?确保调用 pip 并且您的脚本使用相同的 Python 版本。
  • @Dunedan 我正在使用 Python 2.7。
  • @metatoaster 我不完全确定你在问什么,但我认为这是你的答案。我运行以下代码来安装pip install --user -r requirements.txt 我无法使用pipsudo 在同一行中运行任何东西,所以我使用--user 标志进行安装。
  • 因此,当您运行 sudo python MyCoolApp.py 时,它将无法访问使用 pip install --user 安装的软件包,因为这些软件包安装在 ec2-user 本地(根据 ec2-user@ip-... 中包含的提示)你的日志)。 sudo 的行为以 root 用户身份运行脚本,因此它无法访问您的 ec2-user 用户本地 Python 包。

标签: python amazon-web-services boto3


【解决方案1】:

因此,根据问题中提供的详细信息,我们有一个 Python 脚本及其将在其中执行的环境的场景:

  1. 对某些包的依赖;
  2. 没有使用 virtualenv,而是使用 Python 用户安装目录(作为ec2-user 用户),以简化脚本依赖项的安装;
  3. 但是,该脚本需要 root 权限才能运行(由于 usage of low ports,通过 sudo(作为 root 用户)获得提升的权限。

当然,以root 运行脚本,而依赖项安装在root 以外的用户本地,这意味着该脚本实际上无法访问任何依赖项。由于依赖项安装在site.USER_BASEec2-user 下,为了使脚本能够在root 用户下执行时导入其依赖项,可以使用PYTHONUSERBASE 环境变量定义位置.

要在使用sudo 时实现这一点,请尝试:

$ sudo PYTHONUSERBASE=/home/ec2-user/.local python MyCoolApp.py

如果可行,那太好了,如果需要,我们可以采用更清洁的方法,因为这种方法可能会导致ec2-user 用户无法从其.local 目录中删除文件,例如.pyc文件将作为根写入那里。

可以采用多种方法:

  1. 最懒惰的方式:sudo pip,全局安装包;伴随着拥有全球可用的 python 包的所有问题。
  2. 改用sudo pip --user - 仅对 root 用户本地。
  3. A number of approaches at the OS level that is available on Linux may be attempted
  4. 使用 virtualenv,并使用 virtualenv 创建的 env/bin/python 启动 Python 脚本(sudoroot)。示例(使用/var/tmp/env 作为演示基础):
$ virtualenv /var/tmp/env
Using base prefix '/usr'
New python executable in /var/tmp/env/bin/python3.6
Also creating executable in /var/tmp/env/bin/python
Installing setuptools, pip, wheel...done.
$ . /var/tmp/env/bin/activate
(env) $ pip install -r requirements.txt
...
(env) $ deactivate
$ sudo /var/tmp/env/bin/python MyCoolApp.py

最后,在端口开放后对drop root privileges back to the original user(或其他受限用户)可能会有所帮助,以改善运行环境的安全状况。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-03
    • 2018-10-03
    • 2020-09-25
    • 1970-01-01
    • 2020-01-02
    • 2017-12-20
    相关资源
    最近更新 更多