Wie verwende ich private Composer-Repositories bei der Bereitstellung mit Amazon AWS Elastic Beanstalk in einer PHP-Umgebung? Speziell mit GitHub (Q & Ein Stil, Antwort folgt)AWS Elastic Beanstalk mit PHP mit privaten Composer-Repositorys
Antwort
Wir mussten eine private Bibliothek für eines unserer PHP-Projekte verwenden, die wir über AWS Elastic Beanstalk (EB) bereitstellen. Diese private Bibliothek wird auf GitHub gehostet, obwohl ähnliche Git-Hosting (Ihr eigener Server, BitBucket, etc.) wahrscheinlich ähnliche Authentifizierung hat und diese Lösung für die Bereitstellung verwenden könnte.
Wir verwendeten SSH-Anmeldeinformationen auf das private Git-Repository zu bekommen. Da wir GitHub verwenden, verwenden wir GitHub Deploy Keys (https://help.github.com/articles/managing-deploy-keys#deploy-keys) Diese Schlüssel ermöglichen schreibgeschützten Zugriff auf ein bestimmtes Repository, das für unsere Bedürfnisse perfekt ist. Evaluieren Sie die beste Lösung für Ihre Anforderungen, GitHub hat großartige Vor- und Nachteile für jede Methode aufgelistet.
Unsere ausgewählte Lösung bettet den Bereitstellungsschlüssel in das Repository ein. Dies ist ein kleines Sicherheitsloch. Wir haben es mit allen privaten Repos zu tun, mit (idealerweise) sicheren Servern, aber das ist immer noch ein gewisses Sicherheitsrisiko.
All dies endete ein bisschen mühsam mit der Art, wie der PHP-Stack mit Elastic Beanstalk bereitgestellt wird, composer.json wurde zu früh automatisch ausgeführt und die Tasten waren vorher nicht vorhanden. Wir haben einen Workaround gefunden.
Dies setzt voraus, dass Sie bereits über die Einrichtung der Bereitstellung verfügen, aber bei der Bereitstellung von Schlüsseln bleiben. Wir haben die von AWS bereitgestellten eb-cli-Tools (eb init, eb branch, eb start usw.) verwendet, um die Dinge in Gang zu bringen und die git-hooks, git aws.push zu deployen.
Sobald wir unsere Deploy Keys haben, können wir unsere Bibliothek in unseren composer.json Datei mit dem SSH-Adresse:
{
...
"require": {
"repository/project": ">=1.0.0"
},
...
"repositories": [
{
"type": "git",
"url": "[email protected]:repository/project.git"
}
]
}
Konfigurieren Sie Ihren .gitignore so die composer.lock Datei verpflichtet, und in Ihrem Repository sowie die Lieferanten Ordner ohne seinen Inhalt:
[remove composer.lock from file if it exists]
vendor/*
Wir bevorzugen die composer.lock Datei im Repository zu halten sowieso, wie es in t sperrt Die Version wird beim Testen verwendet. Wenn wir in eine Produktionsumgebung wechseln, stellen wir sicher, dass die Anwendung mit denselben Bibliotheken ausgeführt wird, mit denen wir getestet haben. Der Vendor-Ordner wird benötigt, um EB dazu zu bringen, den composer.phar-Installationsprozess nicht automatisch auszuführen. Wir müssen es warten, bis wir die SSH-Schlüssel an Ort und Stelle haben.
Einrichten der Schlüssel: Ich konnte keine gute Möglichkeit finden, den Schlüssel zu verknüpfen und github.com als einen bekannten Host über Skripting zu akzeptieren. Ich endete SSHing auf dem EB verwalteten Server mit der halb bereitgestellten Software, fügte die id_rsa- und id_rsa.pub-Schlüsseldateien zu ~ root/.ssh/hinzu (mit 400 perms erinnere mich!) Und versuchte dann ssh -T [email protected]
(wie github empfiehlt) Dies wird zur Eingabeaufforderung um den Host zu akzeptieren und einen Eintrag zur Datei ~ root/.ssh/known_hosts hinzuzufügen. Kopieren Sie den Inhalt dieser Datei an die Stelle, an der Sie am Projekt arbeiten.
Wir erstellen alle Setup-Skripts im Ordner .expectedSions/, um den Linux-Server für die Bereitstellung zu konfigurieren. Dieser Ordner wird (von dem, was ich sagen kann) nach der Vorbereitungsstufe vom Server entfernt. Wir verwenden die PHP 5.5 64bit Amazon AMI Lösung. Verschieben Sie die Schlüssel id_rsa und id_rsa..pub in den neuen Ordner .ebextensions.Fügen Sie auch eine Datei mit dem Namen known_hosts in den Ordner mit dem Inhalt von known_hosts ein, den wir zuvor bereitgestellt haben. Nachdem wir nun die drei Dateien, die wir brauchen, müssen wir eine endgültige Bereitstellung Anweisungsdatei erstellen: 01-Github-deploy-keys.config (benennen Sie die Datei wie Sie wollen)
container_commands:
11-move-priv-key:
command: "mv ~root/.ssh/id_rsa ~root/.ssh/id_rsa.bak; cp .ebextensions/id_rsa ~root/.ssh/id_rsa; chmod 400 ~root/.ssh/id_rsa;"
12-move-pub-key:
command: "mv ~root/.ssh/id_rsa.pub ~root/.ssh/id_rsa.pub.bak; cp .ebextensions/id_rsa.pub ~root/.ssh/id_rsa.pub; chmod 400 ~root/.ssh/id_rsa.pub;"
12-known-hosts:
command: "mv ~root/.ssh/known_hosts ~root/.ssh/known_hosts.bak; cp .ebextensions/known_hosts ~root/.ssh/known_hosts; chmod 644 ~root/.ssh/known_hosts;"
20-install-composer:
command: "./composer.phar install;"
Denken Sie daran, YAML-Dateien verwendet 4 Leerzeichen, keine Tabs! In der AWS-Dokumentation finden Sie Informationen dazu, wie diese container_commands funktionieren: http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/customize-containers-ec2.html#customize-containers-format-commands Sie werden ausgeführt, nachdem die Dateien aus dem Repository abgerufen wurden. Diese Befehle im Abschnitt "container_commands" haben ein Arbeitsverzeichnis Ihres Projekts, daher werden lokale Pfade bevorzugt.
Fügen Sie alle diese Dateien hinzu, die hinzugefügt und in das Repository übernommen werden müssen. Führen Sie Ihre git aws.push zur Bereitstellung aus.
Um das Setup ordnungsgemäß zu testen, müssen Sie den Server aus dem EB-Lösungsstapel entfernen und neu hinzufügen. Ich gehe einfach in das EC2 Control Panel und finde den verwalteten Server für dieses Projekt und beende es. EB erstellt automatisch ein neues für Sie und hängt es an, sobald es fertig ist. Überprüfen Sie Ihre Protokolle, speziell die /var/log/cfn-init.log Abschnitt. Es ist wahrscheinlich am besten, den SSH-Zugriff auf die Server über die Sicherheitsgruppe zu diesem Zeitpunkt zu deaktivieren. Ich glaube, dass EB Logins root über SSH beschränkt, aber nur um sicher zu sein, dass Sie den SSH-Zugriff alle zusammen über Firewall/Sicherheitsgruppen deaktivieren möchten. Sie sollten nicht in einzelne Felder für die Konfiguration wechseln, da sie als flüchtig angesehen werden sollten.
Dies wurde als Q & A am 2014-02-20 geschrieben, bitte posten Sie Kommentare oder Korrekturen.
Danke, - Seth
TLDR: Verwenden ~/.composer/auth.json, Github-oauth auf composer.json oder einen benutzerdefinierten Skript wie das unten erstellen:
Diese ist meine 02-github-deploy-keys.config Datei. Es funktioniert gerade jetzt. Die einzige Problemumgehung bestand darin, StrictHostKeyChecking zu deaktivieren. Sie können jedoch StrictHostKeyChecking aktivieren, nachdem dieses Skript ausgeführt wurde.
Ich habe Git hinzugefügt (ohne Datei), um zu verhindern, dass AWS Composer automatisch ausführt, bevor die Schlüssel OK waren. Um dies zu tun habe ich eine .gitignore Datei in/vendor, mit dieser:
*
!.gitignore
ich die Schlüssel zu speichern (id_rsa) auf einem S3 Eimer, wo i erlaubt „Berechtigte“ Menschen, die Datei zu lesen, aber Sie können die Datei in Ihr GitHub-Repository stellen. Diese Schlüssel wurden auf einem Computerbenutzer generiert (https://developer.github.com/guides/managing-deploy-keys/#machine-users).
files:
"/home/ec2-user/sshgit/composer.sh":
mode: "00755"
owner: ec2-user
group: ec2-user
encoding: plain
content: |
if [ ! -f /home/ec2-user/id_rsa ] ; then
aws s3 cp s3://eb-files/id_rsa /home/ec2-user/id_rsa
chmod 0400 /home/ec2-user/id_rsa
fi
eval `ssh-agent -s`
ssh-add /home/ec2-user/id_rsa
echo 'StrictHostKeyChecking no' >> /etc/ssh/ssh_config
export COMPOSER_HOME=/root
COMPOSER_HOME=/root
/opt/elasticbeanstalk/support/composer.phar install --no-interaction
container_commands:
01-run-composer:
command: "/home/ec2-user/sshgit/composer.sh"
Ich wollte nur darauf hinweisen, dass es ein einfacher (vielleicht riskanter) Weg, dies dies zu composer.json indem zu tun:
"config": {
"github-oauth": {
"github.com": "YOUR-OAUTH-KEY"
}
}
Und es gibt eine dritte Art und Weise, die i-Test did't , aber Sie können eine ~/.poserver/auth.json erstellen, und Composer wird Ihre Token dort wahrscheinlich verstehen.
Ich kämpfte damit. Ich habe Repos in AWS CodeCommit und suchte nach dem Weg des geringsten Widerstands, um es zu lösen. Ich habe versucht, ~/.poserver/auth.json, aber es scheint, dass Komponist ausgeführt wird, bevor ich die Datei an Ort und Stelle etc. usw.
Ich ging für einen Ansatz, der das Lieferantenverzeichnis in meinem Repo enthält (loswerden. Git-Ordner innerhalb, so dass es nicht behandelt sie als Submodule) und das Ganze wird dann veröffentlicht, um Elastic Beanstalk über ZIP-Datei dieser Ordner.
Anmerkung: Github deploy Schlüssel tatsächlich volle Lese- erlauben/Schreibzugriff auf einen einzigen Repository –
Befehle: removeHost: Befehl: 'ssh-keyscan -R github.com' AddHost: Befehl: ‚ssh-keyscan -t rsa github.com> /root/.ssh/known_hosts – PachinSV