AWS Germany – Amazon Web Services in Deutschland

Neu: Swift-Packages jetzt in AWS CodeArtifact

von Sébastien Stormacq, übersetzt von Tobias Nitzsche.

Ab sofort können Swift [EN, Extern]-Entwickler:innen, die für Apple-Plattformen (iOS [EN, Extern], iPadOS [EN, Extern], macOS [EN, Extern], tvOS [EN, Extern], watchOS [EN, Extern], oder visionOS [EN, Extern]) oder serverseitige Swift-Apps [EN, Extern] programmieren, AWS CodeArtifact verwenden. Dies dient dazu, ihre Paketabhängigkeiten sicher zu verwalten. Dabei lässt sich CodeArtifact problemlos mit gängigen Tools wie Xcode [EN, Extern], xcodebuild [EN, Extern] und dem Swift Package Manager [EN, Extern] verbinden.

Viele Anwendungen, ob klein oder groß, sind auf zahlreiche Pakete angewiesen. Diese erleichtern die Arbeit, indem sie fertigen Code für alltägliche Aufgaben bereitstellen, etwa für Netzwerkanfragen oder Datenverarbeitung. Entwickler:innen nutzen zudem SDKs, wie die AWS SDKs, um externe Services zu integrieren. Diese Pakete können entweder intern oder von Dritten wie zum Beispiel Open-Source-Projekten stammen. Die Verwaltung dieser Packages und derer Abhängigkeiten ist ein zentraler Bestandteil der Softwareentwicklung. Vielen modernen Sprachen, wie Maven [EN, Extern] für Java, NuGet [EN, Extern] für C# oder npm [EN, Extern] und yarn [EN, Extern] für JavaScript und pip [EN, Extern] für Python bieten hierzu spezialisierte Tools an. Für Apple-Plattformen stehen CocoaPods [EN, Extern] und der Swift Package Manager (SwiftPM) [EN, Extern] zur Verfügung.

Das Herunterladen und Einbinden von Paketen gehört zum Alltag von Anwendungsentwickler:innen. Doch für Organisationen gibt es zwei große Herausforderungen:
Erstens geht es ums Rechtliche. Es ist wichtig, dass die Lizenzen von Drittpaketen mit dem geplanten Projektgebrauch übereinstimmen und keine geistigen Eigentumsrechte verletzen.
Zweitens steht die Sicherheit im Vordergrund. Der Code in den Paketen sollte sicher sein, ohne Hintertüren oder Schwachstellen, die Ihre Anwendung gefährden könnten. Das bewusste einsetzen solcher Schwachstellen in Open-Source-Projekten sind als Supply-Chain-Angriffe bekannt und nehmen seit Jahren zu.

Um diese Herausforderungen zu meistern, setzen Organisationen oft private Paketserver ein, sei es vor Ort oder in der Cloud. Nur geprüfte Pakete, die von Sicherheits- und Rechtsteams freigegeben wurden, stehen Entwickler:innen über private Repositories zur Verfügung.

AWS CodeArtifact ist ein verwalteter Dienst, der Ihnen die Verteilung von Paketen an interne Entwicklerteams erleichtert. Sie brauchen sich nicht um Installation, Verwaltung oder Skalierung der zugrundeliegenden Infrastruktur kümmern; Das erledigen wir, damit Sie sich auf Ihre Apps konzentrieren können, anstatt auf die Softwareentwicklungs-Infrastruktur.

Ich freue mich, ankündigen zu können, dass CodeArtifact nun auch Swift-Pakete, neben bereits bekannten Formaten wie npm, PyPI, Maven, NuGet und weiteren, generischen Paket-Formaten unterstützt. Swift-Pakete sind eine beliebte Möglichkeit, wiederverwendbare Swift-Codeelemente zu verpacken und zu verteilen. Dieses Tutorial [EN, Extern] zeigt Ihnen, wie Sie Ihr Swift-Paket erstellen. Zudem gibt es inzwischen über 6.000 Swift-Pakete aus der Community [EN, Extern] für Ihre Anwendungen.

Sie können jetzt Swift-Pakete im CodeArtifact-Repository auf AWS hochladen und abrufen. Der CodeArtifact SwiftPM ist kompatibel mit gängigen Entwicklertools wie Xcode [EN, Extern], VSCode [EN, Extern] und dem Swift Package Manager Command Line Tool [EN, Extern]. Einmal in CodeArtifact gespeichert, integrieren Sie die Pakete einfach in Ihre Project-Datei Package.swift – ähnlich wie bei Git-Endpunkten für öffentliche Swift-Pakete.

Nachdem Sie alles eingerichtet haben, lädt Ihr isoliertes Build-System Pakete aus CodeArtifact. Dies garantiert die ausschließliche Nutzung von genehmigten und sicheren Paketen während des Build-Vorgangs.

Einführung

Wie üblich, zeige ich Ihnen in diesem Beitrag auch, wie es funktioniert. Nehmen wir beispielhaft an, Sie möchten mit dem AWS SDK für Swift [EN, Extern] an einer iOS-Anwendung arbeiten, die Amazon DynamoDB als Datenbank nutzt. Dabei halten wir uns auch an firmeninterne Richtlinien.

Vorbereitung: Ich nutze für das Beispiel eine iOS-App, die auf Amazon DynamoDB zugreift. Für die Verbindung setze ich das AWS SDK für Swift ein.
Richtlinien-Konformität: Unsere Organisation hat eine festgelegte Version des AWS SDK für Swift, die bereits geprüft und freigegeben wurde. Diese Version möchte ich verwenden.
Demo-Vorgang: Ich werde Ihnen zeigen, wie man die Umgebung einrichtet, das benötigte Paket ins Repository hochlädt, und dieses Paket dann in meinem Projekt einbindet.

In dieser Anleitung liegt der Fokus auf den Besonderheiten für Swift-Pakete. Falls Sie sich mit CodeArtifact vertraut machen möchten, empfehle ich das Tutorial von meinem Kollegen Steven [EN].

Für dieses Beispiel arbeite ich mit einem bereits eingerichteten AWS-Konto, das über ein Paket-Repository namens MySwiftRepo und einer Domäne namens stormacq-test verfügt.

Um SwiftPM mit meinem CodeArtifact-Repository zu verbinden, hole ich zuerst ein Authentifizierungstoken von CodeArtifact. Dieses Token ist 12 Stunden gültig. Nach Ablauf muss ich ein neues Token anfordern.

export CODEARTIFACT_AUTH_TOKEN=`aws codeartifact get-authorization-token \
                                     --domain stormacq-test              \
                                     --domain-owner 012345678912         \
                                     --query authorizationToken          \
                                     --output text`

Danach rufe ich den Repository-Endpunkt auf und gebe den domain-namen sowie die AWS-Konto-ID (domain owner) an. Beachten Sie die Verwendung der Option --format swift.

export CODEARTIFACT_REPO=`aws codeartifact get-repository-endpoint  \
                               --domain stormacq-test               \
                               --domain-owner 012345678912          \
                               --format swift                       \
                               --repository MySwiftRepo             \
                               --query repositoryEndpoint           \
                               --output text`

Mit dem Repository-Endpunkt und dem Token setze ich die AWS Command Line Interface (AWS CLI) ein, um SwiftPM auf meinem Computer einzurichten.

SwiftPM speichert Repository-Konfigurationen entweder auf Benutzerebene [EN, Extern] in ~/.swiftpm/configurations oder auf Projektebene [EN, Extern] in <Ihr Projekt>/.swiftpm/configurations. Der CodeArtifact-Login-Befehl legt standardmäßig eine Konfiguration für jedes Projekt an. So können Sie für unterschiedliche Projekte verschiedene CodeArtifact-Repositories nutzen.

Für die Konfiguration von SwiftPM auf meiner Build-Maschine nutze ich die AWS CLI:

aws codeartifact login          \
    --tool swift                \
    --domain stormacq-test      \
    --repository MySwiftRepo    \
    --namespace aws             \
    --domain-owner 012345678912

Der Befehl startet swift package-registry login mit den richtigen Einstellungen. Dadurch werden SwiftPM-Konfigurationsdateien für das Repository MySwiftRepo und den Bereich aws erstellt.

Nachdem meine Build-Maschine eingerichtet ist, mache ich die von meiner Organisation genehmigte AWS SDK-Version für Swift bereit und lade sie ins Repository.

git clone https://github.com/awslabs/aws-sdk-swift.git
pushd aws-sdk-swift
swift package archive-source
mv aws-sdk-swift.zip ../aws-sdk-swift-0.24.0.zip
popd

Schließlich lade ich diese Paketversion in das Repository hoch.

Wenn Sie Swift 5.9 oder neuer nutzen, können Sie das Paket mit dem SwiftPM-Befehl in Ihr privates Repository hochladen:

swift package-registry publish           \
                       aws.aws-sdk-swift \
                       0.24.0            \
                       --verbose

Versionen von Swift vor 5.9 bieten keinen swift package-registry publish-Befehl. Daher verwende ich stattdessen diesen curl-Befehl:

curl  -X PUT 
      --user "aws:$CODEARTIFACT_AUTH_TOKEN"               \
      -H "Accept: application/vnd.swift.registry.v1+json" \
      -F source-archive="@aws-sdk-swift-0.24.0.zip"       \
      "${CODEARTIFACT_REPO}aws/aws-sdk-swift/0.24.0"

Bitte beachten: Die Struktur des Paketnamens in der Repository-URI lautet: <Scope>/<Paketname>/<Paketversion>. Die Paketversion sollte dem semantischen Versionierungsschema [EN, Extern] entsprechen.

Um zu prüfen, ob das Paket im Repository gelistet ist, können Sie entweder die CLI oder die Konsole verwenden.

    "versions": [
        {
            "version": "0.24.0",
            "revision": "6XB5O65J8J3jkTDZd8RMLyqz7XbxIg9IXpTudP7THbU=",
            "status": "Published",
            "origin": {
                "domainEntryPoint": {
                    "repositoryName": "MySwiftRepo"
                },
                "originType": "INTERNAL"
            }
        }
    ],
    "defaultDisplayVersion": "0.24.0",
    "format": "swift",
    "package": "aws-sdk-swift",
    "namespace": "aws"
}

Das Paket ist nun verfügbar und kann in meinen Projekten wie üblich genutzt werden.

Für Xcode nutze ich die SwiftPM-Tools und die von mir erstellten Konfigurationsdateien. Um ein Paket in Xcode hinzuzufügen, klicke ich links auf den Projektnamen und dann auf Paketabhängigkeiten (Package Dependencies). Dort sehe ich bereits eingebundene Pakete. Für private Pakete klicke ich einfach auf das + unter Paketen (Packages).

Ich suche oben rechts nach aws.aws-sdk-swift (Format: <Scope-Name>.<Paketname>). Kurz darauf zeigt die Liste den Paketnamen. Rechts oben lässt sich das Quell-Repository prüfen, neben Registry. Bevor ich auf Pakete Hinzufügen (Add Packages) klicke, wähle ich noch die passende Version aus – genau wie bei öffentlichen Paketen.

Alternativ füge ich für meine serverseitigen oder Befehlszeilenanwendungen die Abhängigkeit in der Package.swift-Datei hinzu. Ich verwende auch das Format (<Scope>.<Paketname>) als ersten Parameter der .package(id:from:)-Funktion.

    dependencies: [
        .package(id: "aws.aws-sdk-swift", from: "0.24.0")
    ],

Durch Eingabe von swift package update wird das Paket von SwiftPM aus dem CodeArtifact-Repository geladen.

Wichtige Hinweise vor dem Hochladen von Swift-Paketen

  • Aktualisieren Sie stets auf die neueste Version der CLI, bevor Sie einen Befehl ausführen.
  • Verwenden Sie mindestens Swift Version 5.8, um CodeArtifact mit dem swift package-Befehl zu nutzen. Auf macOS ist Swift 5.8 mit macOS 13 (Ventura) und Xcode 14 verfügbar. Für Linux und Windows können Sie die Swift-Toolchain von swift.org herunterladen [EN, Extern].
  • Bei der Entwicklung von Apps für iOS, iPadOS, tvOS oder watchOS benötigen Sie Xcode 15. Mein Test wurde mit Xcode 15 beta8 durchgeführt.
  • Ab Swift 5.9 steht der Befehl swift package-registry publish zur Verfügung. Bei Swift 5.8 können Sie den Befehl curl nutzen, um Pakete hochzuladen, wie in meiner Demo gezeigt.
  • Swift-Pakete nutzen das Konzept der Scopes [EN, Extern]: Ein Scope ist wie ein Namensraum für verwandte Pakete in einem Repository. Diese Scopes korrespondieren mit CodeArtifact-Namensräumen.
  • Das Authentifizierungstoken hat eine Gültigkeit von 12 Stunden. Es ist ratsam, ein Skript zur automatischen Erneuerung zu erstellen oder eine geplante AWS Lambda-Funktion zu verwenden. Bewahren Sie das Token sicher zum Beispiel im AWS Secrets Manager auf.

Fehlerbehebung

Kann Xcode Ihr privates Paket nicht finden? Folgen Sie diesen Schritten:

  • Sehen Sie in ~/.swiftpm/configurations/registries.json nach und prüfen Sie die Registry-Konfiguration.
  • Achten Sie darauf, dass der Scope-Name gelistet ist.
  • Kontrollieren Sie, ob das Authentifizierungstoken im Schlüsselbund ist. Der Eintragsname ist die URL Ihres Repositorys.
  • Nutzen Sie die Anwendung /Application/Utilities/Keychain Access.app, um Schlüsselbundeinträge zu überprüfen, oder das security (Sicherheits-) Befehlszeilentool:
security find-internet-password                                                  \
          -s "stormacq-test-012345678912.d.codeartifact.us-west-2.amazonaws.com" \
          -g

So sieht die SwiftPM-Konfiguration auf meinem Computer aus:

cat ~/.swiftpm/configuration/registries.json

{
  "authentication" : {
    "stormacq-test-012345678912.d.codeartifact.us-west-2.amazonaws.com" : {
      "loginAPIPath" : "/swift/MySwiftRepo/login",
      "type" : "token"
    }
  },
  "registries" : {
    "aws" : { // <-- this is the scope name!
      "url" : "https://stormacq-test-012345678912.d.codeartifact.us-west-2.amazonaws.com/swift/MySwiftRepo/"
    }
  },
  "version" : 1
}

Preise und Verfügbarkeit

Die CodeArtifact-Kosten für Swift-Pakete sind dieselben wie für die anderen bereits unterstützten Paketformate. Die CodeArtifact-Abrechnung hängt von drei Metriken ab: dem Speicher (gemessen in GB pro Monat), der Anzahl der Anfragen und der Datenübertragung ins Internet oder in andere AWS-Regionen. Für die Datenübertragung zu AWS-Diensten in derselben Region fallen keine Gebühren an. Das bedeutet, dass Sie Ihre CICD-Jobs beispielsweise auf Amazon EC2-Mac-Instanzen ausführen können, ohne dass eine Gebühr für die CodeArtifact-Datenübertragung anfällt. Wie üblich finden Sie auf der Preisseite die Details.

CodeArtifact für Swift-Pakete sind in allen 13 Regionen verfügbar, in denen CodeArtifact verfügbar ist.

Legen Sie los! Erstellen Sie Ihre Swift-Anwendungen und speichern Sie Ihre privaten Pakete in CodeArtifact.

seb [Extern] & Tobi [Extern]

PS: Wussten Sie schon? Mit Swift können Sie Lambda-Funktionen erstellen. Schauen Sie in den Schnellstart-Leitfaden [EN, Extern] oder dieses 35-minütige Tutorial [EN, Extern].

Über die Autoren

Sébastien Stormacq
Sébastien Stormacq programmiert bereits seit den mittleren 80er Jahren, als er zum ersten Mal Kontakt mit einem Commodore 64 hatte. Er motiviert Entwickler:innen, das Potenzial der AWS-Cloud zu entdecken, indem er Leidenschaft, Begeisterung, Kundenorientierung, Neugier und Kreativität kombiniert. Er interessiert sich besonders für Softwarearchitektur, Entwicklertools und mobile Technologien. Wenn Sie Seb etwas anbieten möchten, sollte es über eine API verfügen. Sie können ihm auf X (Twitter) unter @sebsto folgen.