[JAVA] Ich war süchtig danach, vom Docker-Container aus keine Verbindung zu AWS-S3 herstellen zu können

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.

Ursache

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".

Was ich versucht habe Teil 1

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.

Was ich versucht habe Teil 2

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.

Was ich versucht habe Teil 3

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.

Was ich versucht habe Teil 4

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.

Was ich versucht habe Teil 5

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.

Zusammenfassung

Unten finden Sie eine Zusammenfassung meiner persönlichen Situation

Was ich versucht habe Ergebnis
Legen Sie Umgebungsvariablen im Container fest
Im Containercredentials.propertiesErstellen
Legen Sie beim Erstellen eines Containers Umgebungsvariablen fest
Beim Erstellen eines Containerscredentials.propertiesMontieren

--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

Ich war süchtig danach, vom Docker-Container aus keine Verbindung zu AWS-S3 herstellen zu können
Ich war süchtig nach der Rollmethode
Ich war süchtig nach dem Spring-Batch-Test
Ich konnte die Docker + Laravel + MySQL App für Heroku bereitstellen!
Probleme, denen ich beim Erstellen der Digdag-Umgebung mit Docker verfallen war
[Rails] Die Ursache dafür, dass nicht gepostet werden konnte, war in form_with
Ich war süchtig nach NoSuchMethodError in Cloud-Endpunkten
Ich war süchtig nach der Rollmethode
Ich war süchtig nach dem Spring-Batch-Test
Ich war süchtig danach, vom Docker-Container aus keine Verbindung zu AWS-S3 herstellen zu können
Ich wurde von der Dunkelheit Romajis verschluckt, als ich versuchte, meinen Namen in Romaji umzuwandeln
Wovon ich bei der Einführung der JNI-Bibliothek süchtig war
Ich war süchtig danach, die Update-Anweisung in MyBatis zu wiederholen
Ich war süchtig nach Laradock + VSCode + xdebug
Was ich mit der Redmine REST API süchtig gemacht habe
[Docker] Zugriff auf den Host aus dem Container heraus. http: //host.docker.internal:
Die Geschichte, nach der ich beim Einrichten von STS süchtig war
Ich war süchtig danach, sbt zu starten
Über die Sache, dass ich süchtig danach war, wie man Hashmap benutzt
Ich war süchtig nach der API-Version min23 von registerTorchCallback
[Grobe Erklärung] Ursachen und Abhilfemaßnahmen dafür, dass der Name nicht aus dem ActiveHash-Modell abgerufen werden kann
Memorandum: Wovon ich süchtig war, als ich auf die Accounting Freee API traf
Untersuchen Sie den Ersatz von Docker zu Podman.
[Rails] Ich war süchtig nach den Nginx-Einstellungen, als ich Action Cable verwendete.
Eine Geschichte, der ich beim Testen der API mit MockMVC verfallen war
Ich war süchtig danach, in @ SpringApplicationConfiguration-> @SpringBootTest umzuschreiben
[Docker] Kopieren Sie Dateien aus dem Docker-Container auf den Host
Ich war süchtig nach Scrollview, weil ich nicht auf die UIView mit variabler Größe tippen konnte
[Circle CI] Ich war süchtig nach dem automatischen Test von Circle CI (Rails + MySQL) [Memo]
Ich war ein wenig süchtig nach SSH-Verbindung von Mac zu Linux (Ubuntu)
[Docker] Stellt keine Verbindung zur MySQL Workbench her ... Einstellungen für die DB-Container-Portweiterleitung
Ich war süchtig nach Unit-Tests mit dem Pufferoperator in RxJava
Ich war ein wenig süchtig nach dem S3-Prüfsummenvergleich, machen Sie sich also eine Notiz.
Ich war süchtig nach RXTX mit Sierra
So erhalten Sie einen Heapdump aus einem Docker-Container
Kopieren Sie Dateien vom Docker-Container auf den Host (Docker-CP).
Code zum Verbinden von Rails 3 mit PostgreSQL 10
Ich habe einen Docker-Container erstellt, um Maven auszuführen
Ich war süchtig danach, onActivityResult () mit DialogFragment zu machen
Die CSV-Datei, die ich herunterladen konnte, wurde plötzlich auf der Seite angezeigt.
Der Teil, dem ich in "Einführung in Ajax in Java-Webanwendungen" von NetBeans verfallen war
Beachten Sie, dass ich von den Einstellungen des Android-Projekts von IntelliJ IDEA abhängig war
Docker für Windows: Der MySQL-Container wird bei der Migration von Hyper-v auf WSL2 nicht gestartet
[Java] Ich möchte die Differenz zum Datum berechnen
Tokoro habe ich in der Migration von Wicket 7 auf 8 umgeschrieben
Befehl, um Docker vorerst zu verwenden
Übertragen Sie ein Docker-Image von GitHub Actions in die GitHub Container Registry
Als ich jetzt ansible + docker gestartet habe, bin ich von Anfang an gestolpert, aber ich habe es geschafft, es zu starten
Von unerfahren war ich in der Lage, auch mit Corona den Job in ein selbst entwickeltes Unternehmen zu wechseln
Es ist keine große Sache, wenn Sie verstehen, dass ich süchtig danach war, E-Mails mit Java Mail von Exchange Online zu empfangen
Was ich beim Update auf Spring Boot 1.5.12 behoben habe ・ Wovon ich süchtig war
[JDBC] Ich habe versucht, von Java aus auf die SQLite3-Datenbank zuzugreifen.
Wovon ich süchtig war, als ich rspec auf Schienen benutzte
Ich war süchtig danach, default_url_options mit der Einführung von Rails zu setzen
Ich habe versucht, die Umgebung nach und nach mit Docker aufzubauen