Blog

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

Mark van Holsteijn

Mark van Holsteijn

Aktualisiert Oktober 15, 2025
6 Minuten

In diesem Blog zeige ich Ihnen, wie Sie mit einer Kopiervorlage in weniger als 5 Minuten einen benutzerdefinierten Golang AWS CloudFormation Provider erstellen und bereitstellen können.

Die Erstellung einer benutzerdefinierten Ressource in CloudFormation ist wirklich einfach. Sie implementieren einfach eine Methode zum Erstellen, Aktualisieren und Löschen in einem Lambda und schon sind Sie fertig. Aber das ist der einfache Teil: Sie müssen noch Zip-Dateien, Unit-Tests, Dokumentation, Demos, CI/CD-Bereitstellungspipelines und mehr erstellen. Diese Kopiervorlage hat alles!

Wir fangen an!

Nehmen wir an, Sie möchten eine benutzerdefinierte Ressource für ein ECR Container Image erstellen, so dass Sie öffentliche Images in ein ECR Repository klonen können. Es gibt zwar eine Python-Bibliothek, die dies implementiert, aber sie wird leider nicht mehr unterstützt. Glücklicherweise gibt es eine Golang-Bibliothek go-containerregistry, die diesen Trick erledigt. Um ein Projekt zur Implementierung eines benutzerdefinierten Anbieters auf der Basis von Golang zu starten, geben Sie ein:

$ pip install 'copier>=8.0.0'
$ copier copy --trust 
   https://github.com/binxio/cloudformation-custom-provider-golang-template 
   /tmp/cfn-container-image-provider

  the name of your custom resource type?
   ContainerImage
  The name of your resource provider?
   cfn-container-image-provider
  a short description for the custom provider?
   manages container images
  golang version to use
   1.20
  Your full name?
   Mark van Holsteijn
  Your email address?
   mark.vanholsteijn@xebia.com
  the go module name
   github.com/binxio/cfn-container-image-provider
  the URL to git source repository?
   https://github.com/binxio/cfn-container-image-provider.git
  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
  
Copying from template version 0.1.0
 ...
 > Running task 1 of 1: [ ! -f go.sum ] &&  (go mod download || echo "WARNING: failed to run go mod">&2); [ ! -d .git ] && ( git init && git add . && git commit -m 'initial import' && git tag 0.0.0) || exit 0
Initialized empty Git repository in ...
[main (root-commit) c97b9e2] initial import
 15 files changed, 529 insertions(+)

Quellcode-Verzeichnis

Der Kopierer erzeugt das folgende Quellcode-Verzeichnis:

├── Dockerfile.lambda                   # creates the zip file
├── Makefile.mk                         # generic build steps for the provider
├── Makefile                            # customization of build steps
├── cloudformation
│   ├── cfn-custom-image-provider.yaml  # to deploy the provider
│   ├── cicd-pipeline.yaml              # to deploy the Codebuild CI/CD pipeline
│   └── demo.yaml                       # to deploy the demo
├── doc
│   └── ContainerImage.md               # start documentation of resource
├── go.mod
├── go.sum
├── main.go                             # main entrypoint
└── pkg
    └── resources
        └── container_image
            └── handler.go              # sample code

Das ist alles, was nötig ist, um ein Projekt mit einem funktionierenden benutzerdefinierten Anbieter für die Ressource ContainerImage zu erstellen. Wenn Sie in das Verzeichnis wechseln und eingeben:

$ make deploy-provider
$ make deploy-demo

Ihr Provider ist in weniger als 5 Minuten einsatzbereit! Jetzt liegt es an Ihnen, die Implementierung so umzugestalten, dass sie die gewünschte Funktionalität bietet.

Verfügbare Build-Befehle

um Ihnen bei der Entwicklung zu helfen, stehen Ihnen die folgenden Build-Befehle zur Verfügung:

$ make help

build                -  build the lambda zip file
fmt                  -  formats the source code

test                 -  run unit tests
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

show-version         -  shows the current version of the workspace
help                 -  Show this help.

Stellen Sie die Zip-Datei im Bucket bereit

Um die Zip-Datei mit dem Quellcode des AWS Lambda des benutzerdefinierten Ressourcenanbieters zu kopieren, müssen die Buckets bereits existieren. Wenn dies nicht der Fall ist, geben Sie ein:

$ BUCKET=<bucket-prefix>-<bucket-region>
$ aws s3 mb s3://$BUCKET
$ aws s3api put-bucket-ownership-controls 
    --bucket $BUCKET --ownership-controls 
    'Rules=[{ObjectOwnership=BucketOwnerPreferred}]'

Das Build-System erwartet, dass der Bucket-Name aus dem Präfix und dem Namen der Region besteht. Dadurch kann der Anbieter in allen Regionen zur Verfügung gestellt werden.

Stellen Sie den benutzerdefinierten Ressourcenanbieter im Konto bereit

Um die Laufzeitparameter und Berechtigungen Ihres Providers zu konfigurieren, ändern Sie die CloudFormation-Vorlage im Verzeichnis ./cloudformation. Sobald dies geschehen ist, geben Sie ein:

$ make deploy-provider

Setzen Sie die benutzerdefinierte Ressource Demo ein

Um einen CloudFormation-Stack mit einem Beispiel für die Verwendung der benutzerdefinierten Ressource bereitzustellen, geben Sie ein:

$ make deploy-demo

Version Ihres benutzerdefinierten Ressourcenanbieters

Die semantische Versionierung des Anbieters wird mit dem Dienstprogramm git-release-tag implementiert. Wenn Sie git-release-tag nicht installiert haben, geben Sie ein:

$ pip install git-release-tag

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:

  • führen Sie den Befehl pre-tag in der Datei ./release aus, um alle Dateien mit Verweisen auf die semantische Version zu aktualisieren
  • alle ausstehenden Änderungen im Arbeitsbereich übertragen
  • Markieren Sie die Übergabe mit der neuen Version

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

make show-version

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 Golang-angepassten AWS CloudFormation Provider zu erstellen, bereitzustellen und zu pflegen! Wenn Sie Fragen, Probleme oder Feedback haben, kontaktieren Sie mich bitte oder fügen Sie Themen hinzu unter https://github.com/binxio/cloudformation-custom-provider-golang-template.

Wenn Sie Ihren Ressourcenanbieter in Python erstellen möchten, haben wir auch dafür eine Lösung!


Bild von Michal Jarmoluk aus Pixabay


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.