Используйте AWS SAM для создания уровня AWS Lambda для Python (модель бессерверного приложения)
Я пытаюсь использовать модель приложения AWS SAM/Serverless для развертывания комбинации Python и собственных библиотек в Lambda в качестве слоя для использования из функции Python Lambda. Буду признателен за помощь в сборке и развертывании.
Мой первоначальный проект заключался в том, чтобы вручную создать тестовую лямбда-функцию и упаковать собственную библиотеку Oracle Instant Client в тот же лямбда-zip-архив. Это сработало нормально, поэтому теперь я развертываю его, используя «Инфраструктура как код» в качестве слоя, чтобы несколько функций могли повторно использовать клиент на этом уровне.
Вот мой шаблон SAM
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Globals:
Function:
Runtime: python3.8
Resources:
OracleInstantClientLayer:
Type: AWS::Serverless::LayerVersion
Properties:
ContentUri: LayerResources
CompatibleRuntimes:
- python3.8
Metadata:
#BuildMethod: makefile
BuildMethod: python3.8
В подкаталоге LayerResources у меня есть
- Makefile
- require.txt (в котором есть одна строка, включая cx_Oracle)
- abc.so (набор библиотечных файлов, скомпилированных для x86 Linux)
Когда в моем шаблоне указан «BuildMethod python3.8», библиотеки Python загружаются и помещаются в папку «.aws.sam\build\OracleInstantClientLayer\python», как и ожидалось, но собственная библиотека abc.so — нет. Я попробовал «sam build» и «sam build --use-container» с теми же результатами.
Я также попробовал «BuildMethod makefile» с этим make-файлом. Я пытаюсь поместить все файлы в папку «BuildTest», что, возможно, неправильно, но это было бы шагом вперед.
build-OracleInstantClientLayer:
python -m pip install -r requirements.txt -t "BuildTest"
cp LayerResources\* BuildTest\
Когда я "сам строю", вот ошибка
sam build
Building layer 'OracleInstantClientLayer'
Running CustomMakeBuilder:CopySource
Running CustomMakeBuilder:MakeBuild
Current Artifacts Directory : C:\ProjectFolder\.aws-sam\build\OracleInstantClientLayer
python -m pip install -r requirements.txt -t "BuildTest"
Collecting cx_Oracle
Using cached cx_Oracle-8.3.0-cp38-cp38-win_amd64.whl (219 kB)
Installing collected packages: cx_Oracle
Successfully installed cx_Oracle-8.3.0
cp LayerResources\* BuildTest\
Build Failed
Error: CustomMakeBuilder:MakeBuild - Make Failed: process_begin: CreateProcess(NULL, cp LayerResources* BuildTest, ...) failed.
make (e=2): The system cannot find the file specified.
make: *** [C:\ProjectFolder\LayerResources\Makefile:3: build-OracleInstantClientLayer] Error 2
Может ли кто-нибудь помочь заставить это работать? Я бы предпочел использовать AWS SAM, но я также готов создать zip-файл слоя вручную и загрузить его с помощью SAM, что является запасным вариантом, который я еще не пробовал.
1 ответ
Мой вывод: AWS SAM не предназначен для создания zip-файла слоя. Вот команды, которые я использовал. Файлы слоев помещаются в папку LayerBuild. В случае Python он должен находиться в LayerBuild\python, так как при загрузке на лямбда-сервер он разархивируется для выбора (документация здесь ).
7za a -tzip LayerBuild\LambdaLayer.zip .\LayerBuild\*
aws s3 cp --profile %1 LayerBuild\LambdaLayer.zip s3://bucketname/foldername/LambdaLayer.zip
aws lambda publish-layer-version --profile AwsProfileName --layer-name LayerName --description "xyz" --compatible-runtimes python3.9 --content S3Bucket=bucketname,S3Key=lambda/LambdaLayer.zip
Когда вы создаете свою лямбда-функцию, обязательно установите путь к библиотеке LD.
Function:
Type: AWS::Serverless::Function
Properties:
Description: Lambda function
FunctionName: Function
CodeUri: python-code/
Role: RoleName
Handler: LambdaFileName.lambda_handler
VpcConfig:
SecurityGroupIds:
- SG-ID
SubnetIds:
- Subnet1-ID
- Subnet1-ID
Environment:
Variables:
LD_LIBRARY_PATH: '/var/lang/lib:/lib64:/usr/lib64:/var/runtime:/var/runtime/lib:/var/task:/var/task/lib:/opt/lib:/opt/python'
Layers:
- Layer URI