我想使用郵遞員將小尺寸的影像、音頻檔案從表單上傳到 S3 進行測驗。我從本地機器上運行的應用程式成功上傳了 AWS S3 存盤桶中的檔案。以下是我用于檔案上傳的部分代碼。
import boto3
s3_client = boto3.client('s3',aws_access_key_id =AWS_ACCESS_KEY_ID,aws_secret_access_key = AWS_SECRET_ACCESS_KEY,)
async def save_file_static_folder(file, endpoint, user_id):
_, ext = os.path.splitext(file.filename)
raw_file_name = f'{uuid.uuid4().hex}{ext}'
# Save image file in folder
if ext.lower() in image_file_extension:
relative_file_folder =user_id '/' endpoint
contents = await file.read()
try:
response = s3_client.put_object(Bucket = S3_BUCKET_NAME,Key = (relative_file_folder '/' raw_file_name),Body = contents)
except:
return FileEnum.ERROR_ON_INSERT
我從另一個端點呼叫了這個函式,表單資料(例如姓名、出生日期和其他詳細資訊)成功保存在 Mongodb 資料庫中,檔案上傳到 S3 存盤桶中。
此應用程式使用 fastapi,檔案上傳到 S3 存盤桶中,同時在本地計算機上部署此應用程式。
相同的應用程式作為存盤部署在 AWS lambda 和 S3 存盤桶中。為了處理整個應用程式,在端點檔案中添加了以下內容。
handler = Mangum(app)
在 AWS 中部署應用程式后,從 AWS 的根用戶帳戶創建 lambda 函式,檔案沒有上傳到 S3 存盤桶中。
如果我在表單期間沒有提供檔案,那么 AWS API 端點可以成功運行。表單資料存盤在 MongoDB 資料庫(Mongodb atlas)中,并且應用程式使用 Lambda 托管運行良好。
使用 Lambda 函式部署的應用程式成功運行,但表單中的檔案上傳除外。對于本地機器,S3 中的檔案上傳成功。
編輯
在 Cloudwatch 中跟蹤時出現以下錯誤
exception An error occurred (InvalidAccessKeyId) when calling the PutObject operation: The AWS Access Key Id you provided does not exist in our records.
我多次檢查 AWS 訪問密鑰 ID 和秘密密鑰,它們是正確的,并且保留了根用戶憑證。
uj5u.com熱心網友回復:
看起來您已經使用執行 IAM 角色配置了您的 Lambda 函式,但您在這里覆寫了提供給 boto3 開發工具包的 AWS 憑證:
s3_client = boto3.client('s3',aws_access_key_id =AWS_ACCESS_KEY_ID,aws_secret_access_key = AWS_SECRET_ACCESS_KEY,)
您不需要明確提供憑據,因為 boto3 SDK(和所有語言 SDK)會自動為您動態檢索憑據。因此,請確保您的 Lambda 函式配置了正確的 IAM 角色,然后按如下方式更改您的代碼:
s3_client = boto3.client('s3')
順便說一句,您表示您可能正在使用 AWS根憑證。不使用根憑證通常是 AWS 中的最佳安全實踐。相反,創建 IAM 角色和 IAM 用戶。
我們強烈建議您不要將 root 用戶用于日常任務,即使是管理任務。相反,請遵循僅使用 root 用戶創建您的第一個 IAM 用戶的最佳實踐。然后安全地鎖定 root 用戶憑據并使用它們僅執行少數帳戶和服務管理任務。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/378535.html
標籤:蟒蛇-3.x 亚马逊网络服务 亚马逊-s3 aws-lambda
上一篇:將S3私有檔案作為流回傳
