我无法使用CGI-Python脚本加载AWS凭证

时间:2019-01-23 17:20:45

标签: python amazon-web-services cgi boto3 credentials

在浏览器中执行python CGI脚本时,无法访问AWS凭证。

dynamodb = boto3.resource('dynamodb') 通过在python文件中使用以上行,我可以从〜/ .aws文件夹中获取凭据并在CONSOLE中执行它。

但是当我在Web浏览器中执行相同的代码时,我遇到了错误(缺少凭据)

我尝试设置环境变量,并尝试使用配置和凭据文件。但是没用。

dynamodb = boto3.resource('dynamodb')

ERRORRRR !!!!

raise NoCredentialsError

NoCredentialsError:无法找到凭据

4 个答案:

答案 0 :(得分:1)

~中的~/.aws代表当前用户的主目录。当脚本从有效的控制台执行时,因为您是当前用户。通过CGI执行脚本时,当前用户是系统上的其他帐户,因此~指向没有凭据文件的其他主目录。

如果您正在EC2服务器上运行此服务器,建议您切换到IAM实例配置文件而不是凭据文件。否则,您将需要考虑将凭证文件放置在正确的用户帐户主目录下,或将凭证设置为CGI进程的环境变量。

答案 1 :(得分:0)

通常,诸如CGI之类的环境以root用户身份运行。但是,这取决于服务的配置方式。

您有几种选择:

  1. 如果服务以root的身份运行,则根目录的主目录为/root。创建目录/root/.aws。然后将目录~/.aws的内容复制到/root/.aws。您需要su才能获得特权。
  2. 创建一个目录,例如/AWS。将您的凭据复制到此目录。现在,在您的代码中,指定凭据文件/AWS/credentials的路径。
  3. 在程序中指定aws_access_keyaws secret_access_key。不建议您这样做,因为任何时候将凭据放入程序中都会带来安全风险。
  4. 如果您的服务在EC2中运行,则为该实例分配一个角色,并从元数据中获取您的AWS访问密钥。

此AWS文档详细说明了凭证的管理方式。花时间从上到下阅读它。

Credentials

我还建议从使用boto3 resource切换到boto3 client。这将为您提供更多的代码选择。

示例:通过硬编码凭据指定凭据(不推荐):

import boto3

session = boto3.Session(
    # Hard coded strings as credentials, not recommended.
    aws_access_key_id='AKIAIO5FODNN7EXAMPLE',
    aws_secret_access_key='ABCDEF+c2L7yXeGvUyrPgYsDnWRRC1AYEXAMPLE',
)

dynamodb = boto3.resource('dynamodb')

您可以以所需的任何文件格式存储AWS凭证,然后读回该文件以将AWS访问密钥加载到您的代码中。

答案 2 :(得分:0)

基于Mark B answer,我设法解决了一个类似的问题,尝试了好几个星期。

我的python脚本在Windows服务器上的IDEL本地完美运行

但是,当Web客户端调用它(Java脚本)时出现错误

botocore.exceptions.NoCredentialsError: Unable to locate credentials

问题完全与Mark指出的与主目录有关,当脚本在本地运行时(例如在Windows中),它是C:\ Users \ USER_NAME,因此它可以在默认位置C:\ Users \ USER_NAME中找到凭据。 \ .aws \ credentials为the documentation states,但是当它使用CGI运行时,主目录是不同的

因此要解决此问题:

1-知道您的主目录(运行时)

from pathlib import Path

在尝试访问AWS服务之前放置这些行

home = str(Path.home())
print('Home %s'%home)

复制完整的主路径

2-转到该目录,然后在其中放置.aws目录的副本。

3-授予读取.aws内部文件的权限

对于IIS服务器

cd {full_home_path} + \.aws  //Remove {} and + 
icacls . /grant "NT AUTHORITY\IUSR:(OI)(CI)(R)"
icacls . /grant "Builtin\IIS_IUSRS:(OI)(CI)(R)"

4-重新启动服务器

5-从Web客户端尝试python脚本

6-应该可以。

答案 3 :(得分:0)

我使用 Google Colab 尝试了 Amazon Translate,它完全正常。

在云IDE中安装boto3客户端

pip install boto3

导入客户端及其配置

import boto3
from botocore.config import Config

致电亚马逊翻译服务

translate = boto3.client(service_name='translate', region_name='us-east-2', use_ssl=True,aws_access_key_id = 'YOUR ACCESS KEY ID',aws_secret_access_key='YOUR ACCESS KEY' )
result = translate.translate_text(Text="YOUR TEXT TO TRANSLATE", SourceLanguageCode="en", TargetLanguageCode="ta")

您可以以 JSON 格式访问结果

print(result)