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.
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".
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.
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é.
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 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 fichier
credentials.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.
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.
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.properties Créer |
☓ |
Définir des variables d'environnement lors de la création d'un conteneur | ☓ |
Lors de la création d'un conteneurcredentials.properties Monter |
◯ |
--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