Private NPM Registry mit AWS CodeArtifact

Mit AWS CodeArtifact lassen sich einfach Paketverwaltungen für die Verwendung mit Maven, Gradle, npm, yarn, twine, und pip betreiben. Durch die grundlegende Absicherung mit AWS IAM lassen sich so auch ohne großen Aufwand private Registries mit granularen Zugriffsrechten verwalten und in eine bereits bestehende AWS Servicelandschaft integrieren.

Für die Verwendung mit NPM und Node.js lässt sich die private Registry für alle Pakete innerhalb eines Namespace konfigurieren. NPM Pakete sind durch einen eindeutigen Namen referenziert, z.B. aws-sdk, die Unterstützung für Namespaces und darin befindliche Pakete führt dann zu Paketbezeichnungen wie @superluminar/example.

Struktur in AWS CodeArtifact

Die oberste Entität in AWS CodeArtifact ist eine sogenannte Domain, unterhalb der Domain befinden sich Repositories und in einem Repository werden die Pakete verwaltet.

Alle Pakete innerhalb des Repositories, bzw. innerhalb der Domain, können wie bei AWS üblich mit einem Schlüssel aus KMS abgesichert werden.

Wie eingangs erwähnt, unterstützt AWS CodeArtifact diverse Protokolle für die Paketverwaltung und ein verwaltetes Repository ist nicht auf eine Programmiersprache oder eine Paketverwaltung begrenzt. So können NPM Pakete wie auch Abhängigkeiten die über pip verwaltet werden in dem identischen Repository abgespeichert werden.

Verwendung mit NPM

Durch die Unterteilung von Paketen mit Namespaces in NPM lassen sich einfach öffentliche NPM Pakete und private selbstverwaltete Abhängigkeiten gleichzeitig verwalten.

Um bei dem Beispiel von oben zu bleiben: Das Paket aws-sdk soll natürlich aus der öffentlichen NPM Paketverwaltung installiert werden und das private Paket @superluminar/example aus der privaten Paketverwaltung die mit AWS CodeArtifact betrieben wird. Die Notwendigen Schritte zur Konfiguration von NPM finden sich direkt in der AWS Management Console von AWS CodeArtifact.

Das aktuelle AWS CLI bietet eine automatisch Konfiguration von NPM:

aws codeartifact login \
    --tool npm \
    --domain-owner 395925006881 \ # AWS Account ID
    --domain superluminar \ # AWS CodeArtifact Domain
    --repository example \ # AWS CodeArtifact Repository
    --namespace superluminar # NPM Namespace

Nach dieser Konfiguration wird beim Ausführen von npm install aws-sdk die öffentliche NPM Registry angefragt und npm install @superluminar/example versucht das Paket von AWS CodeArtifact zu installieren.

Pakete veröffentlichen

Durch die direkte Integration von AWS CodeArtifact in den jeweiligen Paketmanager, ändert sich am Vorgang zum Veröffentlichen von Paketen nichts. Soll ein Paket innerhalb des konfigurierten Namespace veröffentlicht werden, so wird der Aufruf npm publish das Paket @superluminar/example automatisch zu AWS CodeArtifact veröffentlichen und nicht in der öffentlichen NPM Registry.

Fazit

Vermutlich war es nie einfacher eine private Verwaltung von Abhängigkeiten zu betreiben als mit AWS CodeArtifact. Durch die Integration in das grundlegende Tooling ist neben der initialen Konfiguration kein weiterer Mehraufwand notwendig. Bestehende Prozesse können also unverändert weiterverwendet werden.

Durch die standardmäßige Nutzung von AWS KMS lassen sich auch problemlos erweiterte Sicherheitsstandards mit AWS CodeArtifact sicherstellen.

Einzig die Informationsarchitektur von AWS CodeArtifact mit Domains und Repositories mag auf den ersten Blick komplex wirken, dies liegt daran, dass eine Hierarchie betrieben werden muss, die eine gemeinsame Schnittmenge der unterstützten Tools zur Paketverwaltungen abbildet.

Neben AWS CodeArtifact existieren natürlich auch eine Vielzahl anderer Möglichkeiten für den Betrieb eigener Paketverwaltungen; GitHub unterstützt dies auch.

photo of Sebastian

Sebastian is a Senior Cloud Consultant at superluminar GmbH, AWS Serverless Hero and AWS Certified Solutions Architect. He writes here in German about AWS, Serverless, Software development, Go, TypeScript and React. English Articles can be found on his Website sbstjn.com and he can be found on Twitter under @sbstjn.