我正在創建一個將按計劃觸發的 Lambda。它的目的是使用webdavclient3 Python 庫將檔案從 WebDAV 服務器復制到 S3 存盤桶。
在 webdavclient3 庫中,我使用了以下示例:
from webdav3.client import Client
options = {
'webdav_hostname': "https://webdav.server.ru",
'webdav_login': "w_login",
'webdav_password': "w_password",
'cert_path': "/etc/ssl/certs/certificate.crt",
'key_path': "/etc/ssl/private/certificate.key"
}
client = Client(options)
我當前的問題源于在 S3 中使用檔案路徑正確填充 cert_path 和 key_path 引數。我的 Lambda 確實具有必要的 IAM 權限。
我當前的實作看起來像這樣,但這是將資料放入變數而不是檔案的位置。
certPath = s3.get_object(
Bucket = "bucketName",
Key = 'folder/securityStuff.crt'
)
certPathFile = certPath["Body"].read()
我得到的錯誤表明我傳遞的是內容而不是密鑰:
"errorMessage": "Could not find the TLS certificate file, invalid path: b'-----BEGIN CERTIFICAT..etc...
我也試過只使用certPath變數,但后來我得到了一個 TypeError,因為該專案是一個物件而不是一個字串。
我覺得我缺少一些基本的東西,任何幫助將不勝感激。
uj5u.com熱心網友回復:
webdavclient3期望證書和密鑰是本地檔案。因此,您不必將 S3 中的物件讀入變數或指向 S3 URL,而是必須將物件從 S3 復制到 AWS Lambda 函式的本地檔案系統。您可以這樣做:
import boto3
from webdav3.client import Client
s3 = boto3.client("s3")
s3.download_file(
Bucket="bucketName",
Key="folder/certificate.crt"
Filename="/tmp/certificate.crt"
)
s3.download_file(
Bucket="bucketName",
Key="folder/certificate.key"
Filename="/tmp/certificate.key"
)
options = {
"webdav_hostname": "https://webdav.server.ru",
"webdav_login": "w_login",
"webdav_password": "w_password",
"cert_path": "/tmp/certificate.crt",
"key_path": "/tmp/certificate.key"
}
client = Client(options)
資料在/tmp同一容器中運行的多個 AWS Lambda 執行之間保留,因此您只需在每次 AWS Lambda 冷啟動時復制檔案一次。
如果您不需要將檔案存盤在 S3 中,一個更簡單的解決方案可能是將它們與您的 Python 代碼打包在一起,避免從 S3 復制到本地檔案系統作為 AWS Lambda 函式執行的一部分。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/338576.html
