Blog

Python Lambda Packager

Martijn van Dongen

Aktualisiert Oktober 21, 2025
2 Minuten

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

Contact

Let’s discuss how we can support your journey.