Wenn Sie Lambda-Funktionen erstellen und die Funktionen mit CloudFormation bereitstellen, kann der Python-Code inline oder in einer Zip-Datei verpackt sein. Wenn keine Pakete von Drittanbietern erforderlich sind oder Tests erstellt werden, funktioniert Inline gut. Für sehr einfache Anwendungsfälle ist das in Ordnung. Wenn Sie in der Lage sein wollen, die Python-Funktion lokal zu testen, sollte sie eine separate Datei sein (und nicht Teil der CloudFormation-Vorlage). Es gibt viele Möglichkeiten, Lambda-Funktionen zu verpacken, und dies ist einer der einfachsten Wege. Es ist nur ein einziger Befehl und erfordert nur Docker auf Ihrem Rechner.
CloudFormation
Betrachten Sie die folgende CloudFormation-Vorlage. Sie werden feststellen, dass der Parameter Version ziemlich wichtig ist. Wenn Sie den Code aktualisieren, aber nichts an der Vorlage ändern, wird die Funktion nicht ersetzt (die Bereitstellung schlägt sogar fehl). In diesem Beispiel verwende ich einfach ein Bash-Skript mit automatischer Inkrementierung, um eine neue Zip-Datei zu erzeugen und dieses Präfix beim Hochladen zu verwenden. CloudFormation denkt nun, dass die Funktion neu ist, stellt die Vorlage bereit und ersetzt die Funktion.
Parameters:
Version:
content: Lambdas are written in a version directory, which is auto incremented on upload
Type: String
Resources:
LambdaFunction:
Type: AWS::Lambda::Function
Properties:
Handler: lambda_function.lambda_handler
Timeout: 30
Role: !GetAtt 'LambdaBasicExecutionRole.Arn'
Runtime: python3.6
Code:
S3Bucket: "mybucketname"
S3Key: !Sub "${Version}/<lambda_name>.zip"
LambdaBasicExecutionRole:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Statement:
- Effect: Allow
Principal:
Service: lambda.amazonaws.com
Action: sts:AssumeRole
Path: /
ManagedPolicyArns:
- arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
Dies ist die Dateistruktur, die Sie verwenden sollten. Die .gitignore ist wichtig, um zu verhindern, dass die Build-Artefakte in Ihrem Git-Repository landen (es handelt sich um eine Zip-Datei, die ziemlich groß werden kann). Sie können in diesem Ordner auch benutzerdefinierte Abhängigkeiten hinzufügen.
└── src
└── <lambda_name>
├── lambda_function.py
├── readme.md
└── requirements.txt
└── ...
└── build
└── <lambda_name>.zip
└── ...
└── .gitignore
└── version.txt
└── template.yml
Führen Sie nun den Befehl aus, um alle Funktionen zu verpacken, einschließlich des Versionstricks, und laden Sie sie in einen S3-Bucket hoch.
docker run -v $(pwd)/src:/src
-v $(pwd)/build:/build
binxio/python-lambda-packager
version=`cat version.txt`
version=$[$version+1]
echo $version > version.txt
aws s3 cp --recursive
--acl public-read
./build s3://mybucketname/stack/${version}
Jetzt können Sie den CloudFormation-Stack mit den hochgeladenen Lambdas und der Beispielvorlage bereitstellen, indem Sie den folgenden Befehl verwenden.
version=`cat version.txt`
aws cloudformation deploy
--stack-name <stack name>
--template-file template.yml
--capabilities CAPABILITY_IAM
--parameter-overrides version=${version}
Fazit
Es ist jetzt sehr einfach geworden, Ihre Lambda-Funktionen einschließlich ihrer Abhängigkeiten zu verpacken.
Verfasst von
Martijn van Dongen
Unsere Ideen
Weitere Blogs
Contact




