2017-09-26 1 views
1

Il y a 3 machines impliquées dans ma tâcheComment télécharger des données par programme vers l'instance AWS EC2?

  • A: mon bureau
  • B: instance EC2 filé par A
  • C: un serveur linux à distance où les données se trouve et je n'ai lu privilège

La tâche a essentiellement trois étapes

  1. de spin up B de A
  2. données de téléchargement de C-B à un endroit précis
  3. de changer certaines des données téléchargées sur B

Je sais comment faire 1 en utilisant awscli ou boto3. Les étapes 2 et 3 sont faciles si je ssh à l'instance EC2 manuellement. Le problème est que si cette tâche doit être automatisée, comment puis-je gérer les informations d'identification de connexion. Plus précisément, je pense utiliser user_data pour exécuter des scripts shell après la naissance de l'instance EC2, mais le téléchargement de données utilise scp qui nécessite un mot de passe. Ensuite, je pourrais télécharger un fichier d'informations d'identification ssh à l'instance EC2, mais je ne peux pas utiliser user_data pour exécuter le script pour l'étape 2 et 3.

Donc, ma solution actuelle est tout de script shell

  1. spin up B de A
  2. téléchargement des titres ssh A-B
  3. ssh A-B avec des commandes de shell attachés où les étapes 2 et 3 pour la tâche sont effectuées

Cette solution semble vraiment moche pour moi. Y a-t-il une meilleure pratique dans ce cas?

+0

Avez-vous essayé les rôles ec2 sur B? –

+0

Les rôles ec2 fonctionneraient-ils si 'C' n'est pas une instance aws? – nos

Répondre

0

Donnez essayer de ansible il peut vous aider à automatiser cette tâche en créant un playbook

Pour créer une instance que vous pouvez utiliser le ec2 module, des exemples de doc:

# Basic provisioning example 
- ec2: 
    key_name: mykey 
    instance_type: t2.micro 
    image: ami-123456 
    wait: yes 
    group: webserver 
    count: 3 
    vpc_subnet_id: subnet-29e63245 
    assign_public_ip: yes 

Pour télécharger les données, le module get_url, exemple:

- name: Download file with check (md5) 
    get_url: 
    url: http://example.com/path/file.conf 
    dest: /etc/foo.conf 
    checksum: md5:66dffb5228a211e61d6d7ef4a86f5758 

Pour modifying files il existe plusieurs modules qui peuvent être trouvés dans le http://docs.ansible.com/.

Dans l'ensemble est un outil qui peut aider à automatiser beaucoup de choses, mais un certain temps est nécessaire pour obtenir la base, vérifiez le Getting started guide, espérons que cela peut aider.

+0

Et si j'ai besoin d'utiliser scp pour télécharger les données du serveur 'C'? Comment est géré le mot de passe ou la clé? – nos

+0

Le même principe d'un hôte de bastion pourrait être utilisé, vérifiez cet article https://blog.scottlowe.org/2015/12/24/running-ansible-through-ssh-bastion-host/, vérifiez également cette réponse https: //stackoverflow.com/a/28258709/1135424 – nbari

0

Il y a plusieurs façons de résoudre votre tâche. Je ne dirai pas à propos de la tâche 1 (lancer B depuis A) parce que vous l'avez déjà fait.

Option 1: Utilisez EC2 Run command pour envoyer des commandes au serveur B. Débit: A -> EC2 Run Command service -> B -> C Pas besoin de pousser les informations d'identification (clé/mot de passe SSH) sur le serveur B
Option 2: Définissez toutes les commandes dans le fichier shell bash, placez ce fichier shell sur S3. Utilisez User Data du serveur B pour télécharger ce fichier à partir de S3. Débit: A -> S3. B get file from S3. B -> C

Avec 2 options ci-dessus, vous n'avez pas besoin de pousser les informations d'identification au serveur B. Serveur C peut être n'importe où vous avez une connexion entre B à C pour le téléchargement de la tâche.

+0

Je ne comprends pas pourquoi les options 1 et 2 peuvent m'exempter de pousser des filleuls à 'B'. Les informations d'identification sont nécessaires lorsque 'B' obtient des données de' C'. Supposé que les scripts de shell 'B' fonctionne avec ssh, comment les options 1 et 2 sont-elles utilisées pour fournir des informations d'identification? – nos

+0

Donc désolé, je manque de compréhension de vos informations d'identification est nécessaire pour l'accès 'C'. Si oui, pourquoi n'utilisez-vous pas l'accès 'A' à' C' et téléchargez-le dans 'A' parce que' A' a déjà des informations d'identification? Ensuite, 'A' copie' 'B' et faire d'autres tâches –

+0

J'ai besoin de télécharger quelque chose de très gros et ce sera une perte de faire ce transfert deux fois. – nos

1

3 Options

  1. passer le mot de passe crypté/codée dans le cadre de userdata. Le script userdata va d'abord déchiffrer/décoder le mot de passe et l'utiliser pour scp le fichier de C. Puis supprimer les données utilisateur ou de toute façon pour supprimer le mot de passe chiffré/encodé
  2. Utilisez la clé ssh au lieu du mot de passe ssh. Mais le risque est que vous devez passer la clé privée dans les données d'utilisateur. Pas un moyen sécurisé.
  3. Utiliser les clés Ansible et ssh. Mais trop de travail pour une tâche simple.