繁体   English   中英

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

[英]I am not able to load AWS credentials using CGI-Python script

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

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

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

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

dynamodb = boto3.resource('dynamodb')

错误!!!!

raise NoCredentialsError

NoCredentialsError:无法找到凭据

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

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

根据Mark B 的回答,我设法解决了类似的问题,我尝试了数周。

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

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

botocore.exceptions.NoCredentialsError: Unable to locate credentials

问题正是 Mark 指出的与主目录相关的问题,当脚本在本地运行时,例如在 Windows 中,它是 C:\\Users\\USER_NAME 所以它可以在默认位置 C:\\Users\\USER_NAME\\.aws 中找到凭据\\credentials 如文档所述,但是当它使用 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-它应该工作。

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

您有多种选择:

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

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

证书

我还建议从使用 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 访问密钥加载到您的代码中。

我用 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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM