[英]AWS multiple lambdas with same CodeUri
我的 AWS 無服務器項目中有多個 lambda,它們都有相同的CodeUri
,它是我項目中的一個文件夾。 例如,它們都指向src/
。
在基本用法或至少我如何使用它時, sam build
選項為每個 lambda 創建一個文件夾。 所有文件夾都包含相同的代碼。 然后,在運行sam deploy
時,每個 zip 都會上傳到 S3。 拉鏈都是一樣的,上傳它們需要大量的冗余時間。
是否有“告訴”山姆只上傳一次的選項?
我看到我可以手動構建 zip,然后將其上傳到 S3。 然后如何在 lambda 的CodeUri
中設置 uri? 我應該使用外部參數還是有專門的方式來發出信號?
謝謝
經過艱苦的努力,使用大衛康德的想法,我設法找到了一些解決方案。 我們想要實現的是一次上傳 lambda 的 zip(及其所有依賴項)並指向所有 lambda 以使用此 zip。
這個過程分為幾個步驟,我將盡可能詳細地描述這些步驟。 其中一些可能與您的情況不完全相關。
一般的想法是創建一個包含我們要上傳一次的代碼的層。 然后,對於每個 lambda,指定它使用該層。 每個 lambda 都會讓它的處理程序指向源目錄中的某個位置。 因此,“從層”運行代碼。 但。 我們必須為 lambda 指定代碼以運行/附加 zip - 即使它不會運行,也可以跳過它。 我們將為其附加一個“空”代碼。
首先,創建一個我們將要工作的構建文件夾,例如: mkdir -p.build/
此外,定義以下變量:
s3_bucket="aaaaaaaa"
s3_prefix="aaaaaaaa"
s3_lambda_zip_suffix="$s3_prefix/lambda.zip"
s3_lambda_zip="s3://$s3_bucket/$s3_lambda_zip_suffix"
lambda 解壓后,其內容被寫入工作目錄。 解壓縮層時,會按照 AWS 中的說明將其解壓縮到/opt
中。 因為我們的 lambda 需要找到我們的源代碼,這是一個“依賴項”,它需要在/opt
下找到它。 為了實現它,我們需要將它解壓縮到/opt/python
中。 我們可以通過將python/...
壓縮到 zip 文件中來做到這一點。
首先,我們創建文件夾,將依賴項安裝到 python 文件夾中:
mkdir -p.build/lambda_zip/python
pip3 install -q --target.build/lambda_zip/python -r requirements.txt
然后我們zip吧:
pushd.build/lambda_zip/ > /dev/null
zip --quiet -r./lambda.zip./python
popd > /dev/null
現在,您可能想要添加您的 src 目錄:
zip --quiet -r.build/lambda_zip/lambda.zip src
#上傳到 S3 現在,我們必須將 zip 上傳到 S3 以便我們的 lambda 加載它。
aws s3 cp ".build/lambda_zip/lambda.zip" $s3_lambda_zip_path
template.yaml
現在,我們需要將該層添加到我們的template.yaml
文件中,您可以在閱讀 AWS 文檔后復制以下代碼:
Parameters:
LambdaCodeUriBucket:
Type: String
LambdaCodeUriKey:
Type: String
Resources:
OnUpHealthLayer:
Type: AWS::Lambda::LayerVersion
Properties:
CompatibleRuntimes:
- python3.8
Content:
S3Bucket: !Sub '${LambdaCodeUriBucket}'
S3Key: !Sub '${LambdaCodeUriKey}'
Cloudformation 必須為 lambda 上傳 zip,因此我們希望它創建一個空的 zip。 但它會從與template.yaml
相同的目錄中的requirements.txt
文件中掃描依賴項。 我們希望它上傳一些空的東西。 因此它必須在另一個文件夾中。 為了解決這個問題,我將template.yaml
復制到一個空目錄並添加空的requirements.txt
文件。 之后,我們可以像往常一樣運行sam build
和sam deploy
。 請注意,我們必須傳遞給它LambdaCodeUriBucket
和LambdaCodeUriKey
:
#create "empty" environment for the template to be built in
mkdir -p .build/empty_template
cp template.yaml .build/empty_template
pushd .build/empty_template > /dev/null
touch requirements.txt
sam build --template template.yaml
sam deploy \
--template-file .aws-sam/build/template.yaml \
--capabilities "CAPABILITY_IAM" \
--region $region \
--s3-bucket $s3_bucket \
--s3-prefix $s3_prefix \
--stack-name $stack_name \
--parameter-overrides LambdaCodeUriBucket=$s3_bucket LambdaCodeUriKey=$s3_lambda_zip_suffix
popd > /dev/null
請注意,雖然我們復制了模板.yaml 並在新模板上調用了sam build
,但我們已經將 zip 文件上傳到 s3。
您必須做的重要事情是指定.
作為您的 lambda 的CodeUri
。 因為他們現在使用“空拉鏈”。
未來,我們將能夠做到:
InlineCode: |
def handler(event, context):
pass
並且不指定文件夾.
.
但是,目前sam
不支持python3.8
的內聯代碼,因此我們使用.
. 無論如何,您必須將其移動到單獨的文件夾以刪除它的依賴項。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.