我正在構建一個解決方案來管理 AWS Lambda 從一個區域/賬戶到另一個區域/賬戶的遷移。AWS 的 Lambda 儀表板目前只支持一次匯出一個 Lambda,這對我來說太慢了。
我想使用 boto3client.get_function(...)并client.create_function(...)自動執行此操作。
按照 docs,我client.get_function("myFunc")用來獲取我的函式的配置和代碼詳細資訊:
response = client.get_function(FunctionName = "myFunc")
fConfig = response["Configuration"]
fCode = response["Code"]
print(fCode)
>>> 'RepositoryType': 'S3',
'Location': 'https://awslambda-us-east-2-tasks.s3.us-east-2.amazonaws.com/snapshots/1234567890123/myFunc-d6abcd8d-8a83...'
我的問題是如何使用fCode["Location"]來下載 Lambda 的部署包,以便我以后呼叫時可以使用它client.create_function(...)?
我已閱讀 boto3 S3 檔案,但找不到任何可以幫助我的內容。只需按照“位置”鏈接回傳:AccessDenied: No AWSAccessKey was presented.
如果有人可以請解釋如何response["Code"]使用。
uj5u.com熱心網友回復:
下面是一段將 Lambda 下載到本地機器上的 tmp 目錄的代碼片段。
import requests
import boto3
import json
lambda_client = boto3.client('lambda')
# Download the lambda
def download_lambda(function_arn):
tmp_dir = '/tmp/'
arn = function_arn
arn_parts = arn.split(':')
func_name = arn_parts[6]
func_details = lambda_client.get_function(FunctionName=function_arn)
zip_file = tmp_dir func_name '.zip'
url = func_details['Code']['Location']
r = requests.get(url)
with open(zip_file, "wb") as code:
code.write(r.content)
uj5u.com熱心網友回復:
根據檔案,Location回傳的get_function回傳一個預先簽名的 S3 URL。這意味著您應該能夠通過GET輸入此 URL來下載 zip 包。然后,您可以使用 zip 作為 .zip 檔案的輸入create_function。
我還沒有嘗試過 boto,但是當我使用 AWS cli 時, aws lambda get-function --function-name <A_FUNCTION_NAME>它的作業原理與描述的一樣。我可以在瀏覽器中打開 URL,并且可以下載該函式的 zip。
對我來說,似乎不允許 boto 使用的憑據/角色在資源上呼叫 s3:GetObject。
您可以嘗試一下它是否適用于 aws cli(確保使用與 boto 中相同的角色/用戶)!?
uj5u.com熱心網友回復:
正如@Korgen 指出的那樣,該get_function命令回傳一個S3 預簽名 URL。
我已成功生成并使用了boto3在 lambda 中使用的下載 URL ,該URL具有默認的基本執行角色和get_function權限。不需要進一步的權限(例如沒有 S3 權限)。
該 URL 可供任何人使用(例如,您可以將其粘貼到瀏覽器中)。但是,該 URL 會在 10 分鐘后過期(X-Amz-Expires=599標題)。這是預簽名 URL 的一個特性,即它是公開的,但壽命很短。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/367217.html
標籤:Python 亚马逊网络服务 亚马逊-s3 aws-lambda boto3
