簡體   English   中英

具有相同 CodeUri 的 AWS 多個 lambda

[英]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"

創建源 zip

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}'

為 lambdas 創建空的 zip

Cloudformation 必須為 lambda 上傳 zip,因此我們希望它創建一個空的 zip。 但它會從與template.yaml相同的目錄中的requirements.txt文件中掃描依賴項。 我們希望它上傳一些空的東西。 因此它必須在另一個文件夾中。 為了解決這個問題,我將template.yaml復制到一個空目錄並添加空的requirements.txt文件。 之后,我們可以像往常一樣運行sam buildsam deploy 請注意,我們必須傳遞給它LambdaCodeUriBucketLambdaCodeUriKey

#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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM