簡體   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