在浏览器中执行python CGI脚本时,无法访问AWS凭证。
dynamodb = boto3.resource('dynamodb') 通过在python文件中使用以上行,我可以从〜/ .aws文件夹中获取凭据并在CONSOLE中执行它。
但是当我在Web浏览器中执行相同的代码时,我遇到了错误(缺少凭据)
我尝试设置环境变量,并尝试使用配置和凭据文件。但是没用。
dynamodb = boto3.resource('dynamodb')
ERRORRRR !!!!
raise NoCredentialsError
NoCredentialsError:无法找到凭据
答案 0 :(得分:1)
~
中的~/.aws
代表当前用户的主目录。当脚本从有效的控制台执行时,因为您是当前用户。通过CGI执行脚本时,当前用户是系统上的其他帐户,因此~
指向没有凭据文件的其他主目录。
如果您正在EC2服务器上运行此服务器,建议您切换到IAM实例配置文件而不是凭据文件。否则,您将需要考虑将凭证文件放置在正确的用户帐户主目录下,或将凭证设置为CGI进程的环境变量。
答案 1 :(得分:0)
通常,诸如CGI之类的环境以root
用户身份运行。但是,这取决于服务的配置方式。
您有几种选择:
root
的身份运行,则根目录的主目录为/root
。创建目录/root/.aws
。然后将目录~/.aws
的内容复制到/root/.aws
。您需要su
才能获得特权。/AWS
。将您的凭据复制到此目录。现在,在您的代码中,指定凭据文件/AWS/credentials
的路径。aws_access_key
和aws secret_access_key
。不建议您这样做,因为任何时候将凭据放入程序中都会带来安全风险。此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访问密钥加载到您的代码中。
答案 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)