Blog

Wie Sie einen benutzerdefinierten AWS CloudFormation-Anbieter in weniger als 5 Minuten erstellen und bereitstellen

Mark van Holsteijn

Aktualisiert Oktober 15, 2025
6 Minuten

In diesem Blog zeige ich Ihnen, wie Sie einen benutzerdefinierten AWS CloudFormation-Anbieter in weniger als 5 Minuten mithilfe einer Python-Kopiervorlage erstellen und bereitstellen können.

Es ist nicht schwer, eine benutzerdefinierte Ressource in CloudFormation zu erstellen. Dazu müssen Sie lediglich drei Methoden implementieren: Erstellen, Aktualisieren und Löschen in einem Lambda. Allerdings istdie gesamte Einrichtung zum Erstellen und Verwalten einer benutzerdefinierten Ressource recht mühsam. Früher habe ichkopiert und bestehende Setups bearbeitet, aber das wurde zu fehleranfällig und mühsam. Ich habe eine Weile überlegt, ob ich nichtein Cookie-Setup erstellen soll, aber die Tatsache, dass Sie gesicherte Cookies nicht aktualisieren können, hat mich davon abgehalten. Der Kopierer erlaubt es Ihnen, zuvor erstellte Projekte zu aktualisieren, also wollte ich es ausprobieren. Und ich muss sagen, dass es mir wirklich gefällt.

Die Vorlage verfügt über die folgenden Funktionen: - schnelle Erstellung des Quellcodes für einen CloudFormation-Ressourcenanbieter - Unterstützung für semantische Versionierung mit git-release-tag - Verteilung von Lambdas auf Buckets in allen AWS-Regionen der Welt - wiederaufzeichnungsfähige Unit-Tests mit botocore stubber recorder - bereitstellbare AWS Codebuild-Pipeline

Wir fangen an!

Angenommen, Sie möchten eine benutzerdefinierte Ressource für eine benutzerdefinierte Domäne eines AWS AppRunner-Services erstellen, , weil diese noch nicht existiert. Um zu beginnen, geben Sie ein:

pip install copier
copier  https://github.com/binxio/cloudformation-custom-provider-template /tmp/cfn-app-runner-custom-domain-provider

  the name of your custom resource type?
   AppRunnerCustomDomain
  The name of your resource provider project?
   cfn-app-runner-custom-domain-provider
  The name of your Python module?
   cfn_app_runner_custom_domain_provider
  a short description for the custom provider?
   manages app runner custom domains 
  Python version to use
   3.9
  Your full name?
   Mark van Holsteijn
  Your email address?
   mark.vanholsteijn@xebia.com
  the URL to git source repository?
   https://github.com/binxio/cfn-app-runner-custom-domain-provider
  the AWS profile name
   integration-test
  the AWS region name
   eu-central-1
  prefix for the S3 bucket name to store the lambda zipfiles?
   binxio-public
  Access to lambda zip files?
   public

> Running task 1 of 1: [[ ! -d .git ]] &&  ( git init &&  git add . &&  git commit -m 'initial import'  && git tag 0.0.0) || exit 0
Initialized empty Git repository in /tmp/cfn-app-runner-custom-domain-provider/.git/
[main (root-commit) b2ce863] initial import
 21 files changed, 619 insertions(+)
...
````
This creates a project with a working custom provider for the resource AppRunnerCustomDomain. Change to 
the directory and type make deploy-provider and make demo. Your provider will be up-and-running
in less than 5 minutes!

## what is in the box
When you type make help, you will get a list of all of available actions.

```text
build                -  build the lambda zip file
fmt                  -  formats the source code
test                 -  run python unit tests
test-record          -  run python unit tests, while recording the boto3 calls
test-templates       -  validate CloudFormation templates

deploy               -  AWS lambda zipfile to bucket
deploy-all-regions   -  AWS lambda zipfiles to all regional buckets
undeploy-all-regions -  deletes AWS lambda zipfile of this release from all buckets in all regions

deploy-provider      -  deploys the custom provider
delete-provider      -  deletes the custom provider

deploy-pipeline      -  deploys the CI/CD deployment pipeline
delete-pipeline      -  deletes the CI/CD deployment pipeline

deploy-demo          -  deploys the demo stack
delete-demo          -  deletes the demo stack

tag-patch-release    -  create a tag for a new patch release
tag-minor-release    -  create a tag for a new minor release
tag-major-release    -  create a tag for new major release

die Unit-Tests ausführen

Um die Unit-Tests auszuführen, geben Sie ein:

make test

Der Unit-Test testet die Gerüstimplementierung, die vom botocore Stubber-Recorder erzeugt wurde. Um Unit-Tests für Ihre Ressource zu erstellen, bearbeiten Sie den Quellcode unter ./tests/. Um Ihre eigene Ressource zu implementieren, bearbeiten Sie den Quellcode unter ./src/.

wiederaufzeichnbare Unit-Tests

Wenn Sie Ihren benutzerdefinierten Ressourcenanbieter haben, tätigt er zweifellos einige AWS-API-Aufrufe. Mit dem botocore Stubber Recorder können Sie Unit-Tests erstellen, indem Sie den Test gegen ein echtes Konto laufen lassen. Die Testszeichnen die tatsächlichen Aufrufe auf und generieren die Stubs. Um Ihre Unit-Tests auszuführen, geben Sie ein:

make test-record

Dadurch werden die Unit-Tests ausgeführt und die AWS-Aufrufe aufgezeichnet. Um die Unit-Tests mit den neu erstellten Stubs auszuführen, geben Sie ein:

make test

Die Integrationstests werden mit dem von Ihnen angegebenen AWS-Profil und der Region durchgeführt.

Stellen Sie die Zip-Datei im Bucket bereit

Um die Zip-Datei mit dem Quellcode des AWS Lambda des benutzerdefinierten Ressourcenanbieters zu kopieren, geben Sie ein:

aws s3 mb s3://<bucket-prefix>-<bucket-region>

Wie Sie sehen, wird die Zip-Datei in einen Bucket-Namen kopiert, der aus dem Präfix und dem Namen der Region besteht. Auf diese Weise kann die Zipdatei für die Verwendung in allen Regionen zur Verfügung gestellt werden.

Stellen Sie den benutzerdefinierten Ressourcenanbieter im Konto bereit

Jetzt, wo die Zip-Datei verfügbar ist, stellen Sie den benutzerdefinierten Ressourcenanbieter bereit, indem Sie eingeben:

make deploy-provider

Dadurch wird der Anbieter als AWS Lambda-Funktion bereitgestellt. Um die Laufzeitparameter und Berechtigungen des Lambdas zu konfigurieren, ändern Sie die CloudFormation Vorlage im Verzeichnis ./cloudformation.

Setzen Sie die benutzerdefinierte Ressource Demo ein

Um den Demo-CloudFormation-Stack unter Verwendung des benutzerdefinierten Ressourcenanbieters bereitzustellen, geben Sie ein:

make deploy-demo

Dadurch wird ein CloudFormation Stack mit einer beispielhaften benutzerdefinierten Ressource als CloudFormation Stack bereitgestellt. die Laufzeitparameter und Berechtigungen des Lambda ändern Sie die CloudFormation Vorlage in der Datei ./cloudformation/demo.yaml. Ändern Sie die Konfiguration der benutzerdefinierten Ressource, um sie an Ihre Implementierung anzupassen.

Version Ihres benutzerdefinierten Ressourcenanbieters

Um Ihren benutzerdefinierten Ressourcenanbieter zu versionieren, können Sie die folgenden Befehle verwenden:

make tag-patch-release    -  create a tag for a new patch release
make tag-minor-release    -  create a tag for a new minor release
make tag-major-release    -  create a tag for new major release

Dies wird: - den Pre-Tag-Befehl in der Datei ./release ausführen - alle ausstehenden Änderungen im Arbeitsbereich übertragen - die Übertragung mit der neuen Version markieren.

Um die aktuelle Version des Arbeitsbereichs anzuzeigen, geben Sie ein:

shell make show-version Das Dienstprogramm git-release-tag implementiert diese Funktion.

Bereitstellung des Anbieters in allen Regionen

Um die aktuelle Version Ihres Anbieters für alle Regionen bereitzustellen, geben Sie ein:

make deploy-all-regions

Dies setzt voraus, dass Sie in allen Regionen über Buckets mit dem definierten Präfix verfügen.

CI/CD-Pipeline bereitstellen

Um die CI/CD-Pipeline basierend auf AWS Codebuild bereitzustellen, stellen Sie sicher, dass das AWS-Konto auf das Quell-Repository zugreifen kann. Wenn dies der Fall ist, geben Sie ein:

make deploy-pipeline

Jedes Mal, wenn Sie eine neue Version markieren, wird sie automatisch in allen Regionen verteilt.

Fazit

Diese Kopiervorlage bietet alles, was Sie brauchen, um schnell einen neuen benutzerdefinierten AWS CloudFormation Provider zu erstellen, bereitzustellen und zu pflegen! Photo by Saffu on Unsplash


Tags:

Verfasst von

Mark van Holsteijn

Mark van Holsteijn is a senior software systems architect at Xebia Cloud-native solutions. He is passionate about removing waste in the software delivery process and keeping things clear and simple.

Contact

Let’s discuss how we can support your journey.