Mein Node.JS-Projekt enthält Verweise auf private NPM-Repositorys, die auf GitHub gehostet werden. Dies funktioniert lokal gut, aber ich habe Probleme, dies auf Elastic Beanstalk zum Laufen zu bringen.
dependencies: {
...
"express": "^4.12.4",
"jsonwebtoken": "^5.0.5",
"my-private-module": "[email protected]:<my-user>/<my-repo>.git#<my-version>",
...
}
–
Was ich brauche, ist in der Lage zu sein, eine funktionierende SSH-Konfiguration für Git auf meinen Elastic Beanstalk-Instances einzurichten, ohne geheime Schlüssel usw. in der Quellcodeverwaltung speichern zu müssen.
Offensichtlich verfügen die EB-Instanzen nicht über die erforderlichen SSH-Schlüssel, um auf meine privaten Github-Repos zuzugreifen. Wenn ich HTTPS-Stil-Git-URLs mit verwende username:[email protected]
Inline, es funktioniert gut. Es funktioniert auch mit der oauth-Token-Methode angeboten von github (was im Wesentlichen ein user:pass ist). Ich möchte jedoch nicht, dass Anmeldeinformationen in die Quellcodeverwaltung eingecheckt werden, daher versuche ich, das Klonen von Github über SSH auf meinen EB-Instanzen zum Laufen zu bringen.
Ich habe eine Million Möglichkeiten ausprobiert, einschließlich npm preinstall
Skripte gem diesen Blogbeitrag, die bis npm2 funktionierte, wo eine Änderung vor der Installation vorgenommen wurde, um ausgeführt zu werden, nachdem der Baum erstellt wurde, und die PR zur Behebung dieses Problems steht noch aus.
Ich habe es versucht .ebextensions
Befehlskonfiguration, die versucht anzurufen git config
ein platzieren insteadof
auf [email protected] in eine HTTPS-URL mit einem OAUTH-Token, das von einer Umgebungsvariablen stammt (an sich schon schwierig, da env-Variablen zu diesem Zeitpunkt im Startzyklus nicht gesetzt sind und das Fehlen von $HOME die git-Konfiguration verwirrt).
Ich habe auch verschiedene Möglichkeiten ausprobiert .ebextensions
um SSH auf meinen EB-Instanzen einzurichten, einschließlich diese Lösung aus den Kommentaren zum erwähnten Blogbeitrag. Das ist im Grunde, wo ich jetzt feststecke.
- Ich habe erfolgreich ein Schlüsselpaar erstellt, es in meinem Github-Profil eingerichtet und verifiziert, dass der private Schlüssel von meinem lokalen Client zum Klonen meines Repos verwendet werden kann
- Ich habe meinen privaten Schlüssel und eine ssh-Konfigurationsdatei in einem privaten S3-Bucket abgelegt
- Ich habe eine erstellt
.ebextensions
files
Konfiguration, die diese beiden Dateien aus meinem S3-Bucket in kopiert/tmp/.ssh/
, gemäß dieses Beispiel - Ich habe eine Debug erstellt
commands
.ebextensions
Konfiguration, die /tmp/.ssh auflistet und zeigt, dass die Dateien erfolgreich von S3 heruntergeladen wurden:
/tmp/.ssh/config enthält:
Host github.com
IdentityFile /tmp/.ssh/deploy_key
IdentitiesOnly yes
UserKnownHostsFile=/dev/null
StrictHostKeyChecking no
/tmp/.ssh/deploy_key enthält meinen privaten Schlüssel, der nachweislich lokal funktioniert.
Git gibt jedoch immer noch einen Fehler aus:
npm ERR! Command failed: git clone --template=/tmp/.npm/_git-remotes/_templates --mirror ssh://[email protected]/[.....]
npm ERR! Cloning into bare repository '/tmp/.npm/_git-remotes/git-ssh-git-github-com-[...]
npm ERR! Host key verification failed.
npm ERR! fatal: Could not read from remote repository.
npm ERR!
npm ERR! Please make sure you have the correct access rights
npm ERR! and the repository exists.
Mir gehen jetzt die Ideen aus. Meine beste Vermutung wäre, dass /tmp/.ssh nicht der Pfad ist, in dem git nach der ssh-Konfigurationsdatei sucht – es könnte gewesen sein, als die verknüpfte Lösung vorgeschlagen wurde, sich aber möglicherweise in späteren AMIs usw. geändert hat. Die verwendete Umgebung beim Starten von EB scheint es etwas eingeschränkt zu sein; Befehle werden als Benutzer ausgeführt nodejs
aber /tmp scheint als Home-Verzeichnis verwendet zu werden, obwohl $HOME nirgendwo gesetzt ist.
Wie kann ich Git dazu bringen, meine SSH-Konfiguration abzurufen und folglich meinen SSH-Schlüssel zu verwenden? Wie kann ich herausfinden, wo Git nach einer SSH-Konfigurationsdatei sucht? Normalerweise ist es in ~/.ssh, aber da $HOME nicht gesetzt ist, nun ja… Das sollte einfach sein, aber es macht mich wahnsinnig.