[JAVA] J'étais accro à ne pas pouvoir me connecter à AWS-S3 à partir du conteneur Docker

J'étais de manière inattendue accro à essayer d'obtenir les fichiers sur AWS-S3 à partir de l'application (JVM) dans le conteneur Docker lancé sur l'instance AWS-EC2. Je noterai que ces informations peuvent être utiles à quelqu'un. Si vous êtes pressé, veuillez consulter uniquement le résumé final.

Cause

L'erreur qui se produisait était quelque chose comme ça.

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)

J'étais en colère sans le "titre".

Ce que j'ai essayé partie 1

Si cela ne passait pas, je ne pouvais même pas démarrer l'application, donc pour le moment, j'ai défini les variables d'environnement comme indiqué ci-dessous dans le conteneur et j'ai essayé de redémarrer.

export AWS_ACCESS_KEY_ID=xxxxxxxxxxxxxxxx
export AWS_SECRET_ACCESS_KEY=xxxxxxxxxxxxxxx

En conséquence, j'ai eu la même erreur. Il ne semble pas lire les variables d'environnement. ʻEnv | grep AWS` Ensuite, il semble que les variables d'environnement sont correctement définies.

Ce que j'ai essayé partie 2

Ensuite, pour le moment, j'ai créé un fichier d'informations d'identification dans le conteneur. En tant qu'utilisateur de démarrage de l'application, j'ai créé le fichier suivant avec le nom $ HOME / .aws / credentials.properties.

accessKey=AKIAJZJ4UAXAC4QVVW5Q=xxxxxxxxxxxxxxxx
secretKey=FXNnRbZjAlg5Z9SWkFbpKXKLRpGVKLTlwNoKDHuP=xxxxxxxxxxxxxxxx

En conséquence, j'ai eu la même erreur. Il ne semble pas lire «credentials.properties». J'ai également préparé des «informations d'identification» au cas où, mais cela n'a pas fonctionné.

Ce que j'ai essayé partie 3

Enfin, quand je suis arrivé ici, j'ai décidé de le paramétrer correctement lors de la création du conteneur. Je me souviens du mot dépêchez-vous.

J'ai modifié docker-compose.yml pour ressembler à ce qui suit.

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:                              #← Ajouter
  - AWS_ACCESS_KEY_ID=xxxxxxxxxxxxxxxx    #← Ajouter
  - AWS_SECRET_ACCESS_KEY=xxxxxxxxxxxxxxx #← Ajouter

En conséquence, j'ai eu la même erreur. Il ne semble pas lire les variables d'environnement. J'ai aussi essayé de créer un fichier ʻenv, mais cela n'a pas fonctionné. Quand je fais ʻenv | grep AWS dans le conteneur, il semble que les variables d'environnement sont correctement définies.

Ce que j'ai essayé partie 4

À ce stade, j'ai pensé: "Cela n'a pas d'importance parce que je suis en colère qu'il n'y ait pas d'informations d'identification", mais puis-je me connecter au compartiment S3 que je veux voir à partir de cette instance EC2 en premier lieu? J'ai commencé à m'inquiéter à ce sujet. Il n'y a aucune aide pour cela, alors installez ʻaws-clisur la machine hôte et vérifiez la connexion. Créez le fichiercredentials.properties` mentionné ci-dessus sur la machine hôte.

# credentials.Création de propriétés
touch $HOME/.aws/credentials.properties
(Écrivez et enregistrez la clé d'accès et la clé secrète avec vi)

#Introduit parce que pip n'était pas inclus
curl "https://bootstrap.pypa.io/get-pip.py" -o "get-pip.py"
sudo python get-pip.py

# aws-introduction cli
sudo pip install awscli

#Vérification
aws s3 ls s3://xxxxx/xxxxx

J'ai pu obtenir la liste des fichiers de S3 en toute sécurité. Il semble que vous puissiez vous connecter depuis la machine hôte sans aucun problème.

Ce que j'ai essayé partie 5

Essayez de monter credentials.properties sur la machine hôte lors de la création du conteneur. Le fichier docker-compose.yml a été réécrit comme suit. Le répertoire côté conteneur doit être le répertoire .aws sous le répertoire personnel de l'utilisateur de démarrage de l'application.

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 #← Ajouter

En conséquence, j'ai réussi à récupérer le fichier depuis S3 et à lancer l'application! Pourquoi l'autre méthode n'a-t-elle pas fonctionné? N'a pas fait l'objet d'une enquête appropriée et est inconnu.

Résumé

Voici un résumé de ma situation personnelle

Ce que j'ai essayé résultat
Définir les variables d'environnement dans le conteneur
Dans le containercredentials.propertiesCréer
Définir des variables d'environnement lors de la création d'un conteneur
Lors de la création d'un conteneurcredentials.propertiesMonter

--Premise: vous pouvez vous connecter à S3 à partir de la machine hôte ―― La raison pour laquelle cela n'a pas fonctionné d'une autre manière → Je ne sais pas (pas d'enquête)

Je suis désolé pour la libellule qui est coupée, mais c'est tout de la scène. Si vous avez une idée de la cause, je vous serais reconnaissant de bien vouloir me le dire.

Recommended Posts

J'étais accro à ne pas pouvoir me connecter à AWS-S3 à partir du conteneur Docker
J'étais accro à la méthode du rouleau
J'étais accro au test Spring-Batch
J'ai pu déployer l'application Docker + laravel + MySQL sur Heroku!
Problèmes auxquels j'étais accro lors de la création de l'environnement digdag avec docker
[Rails] La cause de l'impossibilité de publier des messages était form_with
J'étais accro à NoSuchMethodError dans Cloud Endpoints
J'étais accro à la méthode du rouleau
J'étais accro au test Spring-Batch
J'étais accro à ne pas pouvoir me connecter à AWS-S3 à partir du conteneur Docker
J'ai été englouti par l'obscurité de Romaji essayant de convertir mon nom en Romaji
Ce à quoi j'étais accro lors de l'introduction de la bibliothèque JNI
J'étais accro à la mise à jour de la déclaration dans MyBatis
J'étais accro au réglage de laradock + VSCode + xdebug
Ce à quoi j'étais accro avec l'API REST Redmine
[Docker] Comment accéder à l'hôte depuis l'intérieur du conteneur. http: //host.docker.internal:
L'histoire à laquelle j'étais accro lors de la création de STS
J'étais accro au démarrage de sbt
À propos de la question pour laquelle j'étais accro à l'utilisation de hashmap
J'étais accro au paramètre API version min23 de registerTorchCallback
[Explication approximative] Causes et remèdes pour ne pas pouvoir obtenir le nom du modèle ActiveHash
Mémorandum: Ce à quoi j'étais accro quand j'ai frappé l'API de comptabilité freee
Examinez le remplacement de Docker vers Podman.
[Rails] J'étais accro aux paramètres nginx lors de l'utilisation d'Action Cable.
Une histoire à laquelle j'étais accro lors du test de l'API à l'aide de MockMVC
J'étais accro à la réécriture sur @ SpringApplicationConfiguration-> @SpringBootTest
[Docker] Copie des fichiers du conteneur Docker vers l'hôte
J'étais accro au scrollview car je ne pouvais pas appuyer sur la taille variable UIView
[Circle CI] J'étais accro au test automatique de Circle CI (rails + mysql) [Memo]
J'étais un peu accro à la connexion ssh de mac à linux (ubuntu)
[Docker] Ne se connecte pas à MySQL workbench ... Paramètres de transfert de port du conteneur de base de données
J'étais accro aux tests unitaires avec l'opérateur de tampon dans RxJava
J'étais un peu accro à la comparaison S3 Checksum, alors prenez note.
J'étais accro à l'utilisation de RXTX avec Sierra
Comment obtenir un heapdump à partir d'un conteneur Docker
Copier les fichiers du conteneur Docker vers l'hôte (docker cp)
Code utilisé pour connecter Rails 3 à PostgreSQL 10
J'ai créé un conteneur Docker pour exécuter Maven
J'étais accro à faire onActivityResult () avec DialogFragment
Le fichier CSV que j'ai pu télécharger a soudainement commencé à apparaître sur la page.
La partie à laquelle j'étais accro dans "Introduction à Ajax dans les applications Web Java" de NetBeans
Notez que j'étais accro aux paramètres du projet Android d'IntelliJ IDEA
Docker pour Windows: le conteneur MySQL ne démarre pas lors de la migration d'Hyper-v vers WSL2
[Java] Je souhaite calculer la différence par rapport à la date
Tokoro j'ai réécrit dans la migration de Wicket 7 à 8
Commande pour essayer d'utiliser Docker pour le moment
Transférer une image Docker des actions GitHub vers GitHub Container Registry
Quand j'ai commencé ansible + docker maintenant, j'ai trébuché depuis le début, mais j'ai réussi à le démarrer
D'inexpérimenté, j'ai pu changer de poste pour devenir une entreprise développée en interne même avec Corona
Ce n'est pas un gros problème si vous comprenez que j'étais accro à recevoir du courrier avec Java Mail depuis Exchange Online
Ce que j'ai corrigé lors de la mise à jour vers Spring Boot 1.5.12 ・ Ce à quoi j'étais accro
[JDBC] J'ai essayé d'accéder à la base de données SQLite3 depuis Java.
Ce à quoi j'étais accro en utilisant rspec sur des rails
J'étais accro à la configuration de default_url_options avec l'introduction de la conception de Rails
J'ai essayé de construire l'environnement petit à petit en utilisant docker