Ich war unerwartet süchtig danach, die Dateien auf AWS-S3 von der Anwendung (JVM) im Docker-Container abzurufen, der auf der AWS-EC2-Instanz gestartet wurde. Ich werde darauf hinweisen, dass diese Informationen für jemanden nützlich sein können. Wenn Sie es eilig haben, lesen Sie bitte nur die endgültige Zusammenfassung.
Der aufgetretene Fehler war ungefähr so.
Unable to load AWS credentials from any provider in the chain
at com.amazonaws.auth.AWSCredentialsProviderChain.getCredentials(AWSCredentialsProviderChain.java:131)
at com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:3820)
at com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:3778)
at com.amazonaws.services.s3.AmazonS3Client.listObjectsV2(AmazonS3Client.java:649)
Ich war wütend ohne den "Ausweis".
Wenn dies nicht erfolgreich war, konnte ich die Anwendung nicht einmal starten. Daher habe ich vorerst die Umgebungsvariablen wie unten im Container gezeigt festgelegt und versucht, sie neu zu starten.
export AWS_ACCESS_KEY_ID=xxxxxxxxxxxxxxxx
export AWS_SECRET_ACCESS_KEY=xxxxxxxxxxxxxxx
Als Ergebnis habe ich den gleichen Fehler erhalten. Es scheint die Umgebungsvariablen nicht zu lesen. Wenn ich "env | grep AWS" mache, sieht es so aus, als ob die Umgebungsvariablen richtig eingestellt sind.
Als nächstes habe ich vorerst eine Anmeldeinformationsdatei im Container erstellt. Als Startbenutzer der Anwendung habe ich die folgende Datei mit dem Namen "$ HOME / .aws / credentials.properties" erstellt.
accessKey=AKIAJZJ4UAXAC4QVVW5Q=xxxxxxxxxxxxxxxx
secretKey=FXNnRbZjAlg5Z9SWkFbpKXKLRpGVKLTlwNoKDHuP=xxxxxxxxxxxxxxxx
Als Ergebnis habe ich den gleichen Fehler erhalten. Es scheint nicht "credentials.properties" zu lesen. Ich habe auch "Anmeldeinformationen" für alle Fälle vorbereitet, aber es hat nicht funktioniert.
Als ich hierher kam, entschied ich mich schließlich, es beim Erstellen des Containers richtig einzustellen. Ich erinnere mich an das Wort Eile.
Ich habe "docker-compose.yml" so geändert, dass es wie folgt aussieht.
version: '2.0'
services:
my-app:
command: /bin/bash
container_name: my-app
image: xxxx/xxxx/my-app:my-app-1.2.3
network_mode: bridge
ports:
- 9000:9000/tcp
stdin_open: true
tty: true
volumes:
- /var/log/my-app:/var/log/my-app:rw
environment: #← Hinzufügen
- AWS_ACCESS_KEY_ID=xxxxxxxxxxxxxxxx #← Hinzufügen
- AWS_SECRET_ACCESS_KEY=xxxxxxxxxxxxxxx #← Hinzufügen
Als Ergebnis habe ich den gleichen Fehler erhalten. Es scheint die Umgebungsvariablen nicht zu lesen. Ich habe auch versucht, eine "env" -Datei zu erstellen, aber es hat nicht funktioniert. Wenn ich im Container "env | grep AWS" mache, sieht es so aus, als ob die Umgebungsvariablen richtig eingestellt sind.
Zu diesem Zeitpunkt dachte ich: "Es spielt keine Rolle, weil ich wütend bin, dass es keinen" Berechtigungsnachweis "gibt." Kann ich jedoch eine Verbindung zu dem S3-Bucket herstellen, den ich von dieser EC2-Instanz aus sehen möchte? Ich begann mir darüber Sorgen zu machen. Es gibt keine Hilfe dafür. Installieren Sie also "aws-cli" auf dem Host-Computer und überprüfen Sie die Verbindung. Erstellen Sie die oben erwähnte Datei "credentials.properties" auf dem Hostcomputer.
# credentials.Erstellung von Eigenschaften
touch $HOME/.aws/credentials.properties
(Schreiben und speichern Sie den Zugangsschlüssel und den geheimen Schlüssel mit vi)
#Eingeführt, weil pip nicht enthalten war
curl "https://bootstrap.pypa.io/get-pip.py" -o "get-pip.py"
sudo python get-pip.py
# aws-CLI-Einführung
sudo pip install awscli
#Bestätigung
aws s3 ls s3://xxxxx/xxxxx
Ich konnte die Dateiliste sicher von S3 abrufen. Es scheint, dass Sie problemlos eine Verbindung vom Host-Computer aus herstellen können.
Versuchen Sie, beim Erstellen des Containers "credentials.properties" auf dem Host-Computer bereitzustellen.
Die Datei docker-compose.yml
wurde wie folgt umgeschrieben.
Das Verzeichnis auf der Containerseite sollte das Verzeichnis ".aws" unter dem Ausgangsverzeichnis des Anwendungsstartbenutzers sein.
version: '2.0'
services:
my-app:
command: /bin/bash
container_name: my-app
image: xxxx/xxxx/my-app:my-app-1.2.3
network_mode: bridge
ports:
- 9000:9000/tcp
stdin_open: true
tty: true
volumes:
- /var/log/my-app:/var/log/my-app:rw
- $HOME/.aws/credentials.properties:/home/my-app/.aws/credentials.properties #← Hinzufügen
Infolgedessen konnte ich die Datei erfolgreich aus S3 abrufen und die Anwendung starten! Warum hat die andere Methode nicht funktioniert? Wurde nicht richtig untersucht und ist unbekannt.
Unten finden Sie eine Zusammenfassung meiner persönlichen Situation
Was ich versucht habe | Ergebnis |
---|---|
Legen Sie Umgebungsvariablen im Container fest | ☓ |
Im Containercredentials.properties Erstellen |
☓ |
Legen Sie beim Erstellen eines Containers Umgebungsvariablen fest | ☓ |
Beim Erstellen eines Containerscredentials.properties Montieren |
◯ |
--Premise: Sie können vom Host-Computer aus eine Verbindung zu S3 herstellen ――Der Grund, warum es auf andere Weise nicht funktioniert hat → Ich weiß nicht (nicht untersucht)
Es tut mir leid für die Libelle, die abgeschnitten ist, aber das ist alles von der Szene. Wenn Sie eine Vorstellung von der Ursache haben, würde ich es begrüßen, wenn Sie es mir sagen könnten.
Recommended Posts