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

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!
- erstellt er den Quellcode für einen benutzerdefinierten Golang-Ressourcenanbieter
- Es enthält alle Build-Befehle, die Sie zum Erstellen, Testen und Bereitstellen Ihres Anbieters benötigen.
- es stellt Lambdas in Buckets in allen AWS-Regionen der Welt zur Verfügung
- es bietet eine sofort einsatzbereite CI/CD-Pipeline auf AWS Codebuild
- es unterstützt die semantische Versionierung mit git-release-tag
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
$ 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
./releaseaus, 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
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