GIT für AWS CodeCommit Repo einrichten
Kategorie Software Engineering | Keine Kommentare »
Im letzten Beitrag habe ich die AWS MultiAccount Strategie erläutert. Für das Login nutze ich nur noch Single-Sign On Nutzer, die über IAM Rollen Zugriff auf unterschiedliche AWS Accounts bekommen. Wie muss man nun aber GIT konfigurieren, um Zugriff auf ein AWS CodeCommit Repository zu erhalten?
AWS CodeCommit
AWS CodeCommit ist ein AWS Dienst, über den man Quellcode Repositories bereitstellen kann. Will man ausschließlich in AWS entwickeln, macht es Sinn, auch den Quellcode selbst in AWS zu hosten.
AWS CodeCommit bietet Basisfunktionalität wie Pull Requests und Commit Benachrichtigungen. Weitergehende Features wie Branch Berechtigungen oder Branch Richtlinien gibt es nicht und man müsste auf einen Dienst wie GitHub, GitLab oder BitBucket ausweichen.
AWS CLI installieren
Damit der GIT Zugriff auf AWS CodeCommit gelingt, muss das AWS CLI Tool installiert sein. Die Installation ist entsprechend der offiziellen Anleitung in einer Minute geschafft.
In einem anderen Artikel habe ich die Kommandos zusammengefasst, falls der geneigte Leser zu einem späteren Zeitpunkt das AWS CLI aktualisieren möchte.
AWS CLI Credentials einrichten
Für IAM Nutzer kann man ssh Zugangsdaten generieren. In der AWS MultiAccount Strategie werden aber keine IAM Nutzer verwendet, um Entwicklern Zugriff auf AWS Accounts zu geben.
Stattdessen erfolgt der Zugriff über Single-Sign On Nutzer, die durchaus Zugriff auf unterschiedliche AWS Accounts haben können. Für solch einen SSO Nutzer kann man sich zwar temporäre AWS Credentials beim Login über den Browser generieren lassen, aber diese haben nur eine Gültigkeit für standardmäßig 1 Stunde.
Die Lösung besteht aus zwei Bestandteilen:
- man verwendet das GIT Plugin git-remote-codecommit, damit GIT mit URLs der Form codecommit://AWS-CLI-PROFILE@REPO-NAME umgehen kann
- man richtet ein AWS CLI Profil für den SSO Nutzer im Zielaccount ein
- man muss sich mittels AWS CLI per SSO im jeweiligen Profil anmelden
Die ersten beiden Punkte muss man natürlich nur einmal erledigen. Das Login muss man täglich tun oder wenn man das Profil wechseln muss. Doch Schritt für Schritt…
GIT Plugin git-remote-codecommit installieren
Damit GIT mit Repository URLs der Form
codecommit://AWS-CLI-PROFILE@REPO-NAME
umgehen kann, benötigt man das GIT Plugin git-remote-codecommit. Die Installation ist denkbar einfach, falls man schon Python 3.7 oder neuer installiert hat:
sudo pip install git-remote-codecommit
Session Timeout für SSO Logins erhöhen
Standardmäßig setzt AWS SSO ein Timeout von 1 Stunde für jedes Permission Set. Erfolgt während der Stunde keine Interaktion, wird die Session beendet. Für Entwicklerarbeit ist das zu kurz, da man nicht ständig mit GIT arbeitet, sich aber nicht mehrmals täglich neu einloggen möchte.
Deshalb sollte man die Sessiondauer für das zu verwendende Permission Set hochsetzen, etwa auf 8 Stunden, was einem normalen Arbeitstag entspricht. Dazu loggt man sich als Administrator, der AWS SSO verwaltet, ein und klickt in SSO auf AWS Accounts -> Permission Sets -> DAS-GEWÜNSCHTE-CODE-COMMIT-SET. Hier kann man die Länge von Sessions anpassen. Anschließend muss man das Permission Set erneut auf alle gewünschten AWS Accounts anwenden, aber das steht dann auch nochmal im UI als Hinweis.
Weiterhin sollte man versuchen, dass möglichst alle Code Commit Repositories, mit dem ein Entwickler typischerweise arbeitet, im gleichen AWS Account liegen. Ansonsten müsste ich jedesmal mich erneut in einen AWS Account einloggen, wenn ich mit einem anderen GIT Repo arbeiten möchte.
AWS CLI für SSO Nutzer einrichten
Das AWS CLI kann mit mehreren Zugriffsprofilen arbeiten, deren Details es im Ordner ~/.aws ablegt. Möchte man das AWS CLI mit einem SSO Nutzer verwenden, erfolgt die Einrichtung eines neuen Profils über:
aws configure sso --profile=PROFILE-NAME
Ich vergebe immer kurze sprechende Profilnamen, also etwa devPower oder prodReady.
Bei der Einrichtung werden einmalig die Parameter für das SSO Profil abgefragt wie:
- die SSO Login URL (https://ALIAS.awsapps.com/start)
- SSO Region
- Standardregion
- Name des zu verwendenden Permission Sets, also etwa AWSPowerUserAccess
Da diese Informationen keine sensitiven Informationen enthalten, werden sie in der ~/.aws/config Datei gespeichert.
AWS CLI Login für SSO Nutzer
Nachdem ich alle Parameter eingegeben habe, führt das AWS CLI gleich ein Testlogin durch. Später löse ich dieses Login zu Beginn des Arbeitstags folgendermaßen aus:
aws sso login --profile=PROFILE-NAME
AWS CLI öffnet meinen Standardbrowser. In diesem muss ich Nutzername, Passwort und MFA Code meines SSO Nutzers eingeben. Hat das geklappt, kann ich den Browser wieder schließen.
Die Session Information speichert AWS CLI in verschiedenen JSON Dateien unterhalb von ~/.aws/sso/. Dadurch steht sie mir nicht nur im aktuellen Terminalfenster zur Verfügung, sondern bei allen Aufrufen per AWS CLI.
Eine Abmeldung ist über
aws sso logout --profile=PROFILE-NAME
jederzeit möglich.
GIT Zugriff auf CodeCommit ohne IAM Nutzer
In der Regel starte ich mit einem lokal eingerichteten GIT Repo, das ich nach AWS CodeCommit pushen möchte. Falls noch nicht getan, generiere ich mir ein neues Repo mittels:
mkdir my-repo
cd my-repo
git init .
echo "# my-repo" >> README.md
git add -A
git commit -m "initial commit"
Jetzt muss ich den Zugriff für dieses GIT Repo konfigurieren. Wenn ein GIT Kommando Zugriff auf das zugehörige AWS CodeCommit Repo benötigt, muss es das AWS CLI nutzen, um Zugriff zu erhalten. Ich füge ein neues GIT Remote hinzu:
git remote add origin codecommit://PROFILE-NAME@REPO-NAME
git fetch
git push -u
In Zeile 1 habe ich das CodeCommit Repo als neues Remote Repo mit dem Namen origin in meinem lokalen GIT Repo bekannt gemacht. Über das zuvor installierte GIT Plugin, weiß GIT nun mit dieser Art URLs umzugehen.
In Zeile 2 teste ich den Zugriff. Abschließend schiebe ich meinen lokalen Branch in das CodeCommit Repo und teile GIT über den Parameter -u mit, dass mein lokaler Branch ab sofort dem gerade in CodeCommit erstellten Branch folgen soll.
Falls ich noch kein lokales Repo habe, kann ich natürlich auch das AWS CodeCommit Repo clonen:
git clone codecommit://PROFILE-NAME@REPO-NAME
Abgesehen vom morgendlichen
aws sso login --profile=PROFILE-NAME
merke ich keinen Unterschied bei der Arbeit mit GIT im Vergleich zu einem per ssh für mich erreichbaren GIT Repo bei GitHub & Co.
Fazit
Wenn alles gut gegangen ist, sehe ich nun auch in CodeCommit den gleichen Inhalt, wie ich ihn lokal habe. Ab diesem Zeitpunkt kann ich ganz normal mit meinem lokalen GIT Repo arbeiten. Immer, wenn GIT Zugriff auf das CodeCommit Repo benötigt, ruft es das AWS CLI auf, um über meine aktuelle SSO Session Zugriff zu erhalten. Glücklicherweise merke ich davon aber nichts und muss mich auch nicht mit den kryptografischen Details beschäftigen :-)
Update
Noch komfortabler wird die Sache, wenn man das aws-sso-util verwendet. Damit kann ich zwischen den verschiedenen Rollen meines SSO Nutzers wechseln, ohne mich jedesmal erneut anmelden zu müssen. Die Details, wie man aws-sso-util verwendet, habe ich in einem neuen Beitrag beschrieben.