2017-02-23 6 views
0

Ich habe ein Shell-Skript auf meinem EC2-Server und ich möchte das gleiche aus AWS Lambda-Funktion auslösen. Kann jemand vorschlagen, wie ich auf die Datei in meiner Lambda-Funktion zugreifen kann. Es besteht kein Verbindungsproblem zwischen Lambda und EC2.Verbinden mit EC2-Server über AWS Lambda

Ich generierte den privaten Schlüssel mit Putty gen und hielt es in s3 Eimer und mit dem gleichen Schlüssel zu verbinden (Mit diesem privaten Schlüssel in der Lage, durch Kitt verbinden) .Ich habe Stück Code wie folgt.

var driver, ssh; 
driver = require('node-ssh'); 
ssh = new driver(); 
exports.handle = function(error, ctx, cb) { 
ssh = new driver({ 
      host: 'EC2 public ip', 
      username: 'uname', 
      privateKey : 'url of s3/privatekey.ppk' 
     }); 
ssh.connect().then(function() { 
    console.log('connected') 
     },function(error) { 
      console.log(error); 

     }); 
} 

Zuerst versuche ich zu sehen, ob ich zu meinem EC2-Server verbinden kann und dann kann ich den Shell-Skript durch SSH-Client ausgeführt werden. Aber die Verbindung wird nicht hergestellt. Fehler unten angezeigt.

{ 
"errorMessage": "config.host must be a valid string", 
"errorType": "Error", 
"stackTrace": [ 
"Object.<anonymous> (/var/task/node_modules/node-ssh/lib/helpers.js:15:13)", 
"next (native)", 
"step (/var/task/node_modules/node-ssh/lib/helpers.js:69:191)", 
"/var/task/node_modules/node-ssh/lib/helpers.js:69:437", 
"Object.<anonymous> (/var/task/node_modules/node-ssh/lib/helpers.js:69:99)", 
"Object.normalizeConfig (/var/task/node_modules/node- ssh/lib/helpers.js:42:17)", 
"/var/task/node_modules/node-ssh/lib/index.js:53:25", 
"SSH.connect (/var/task/node_modules/node-ssh/lib/index.js:52:14)", 
"exports.handle (/var/task/index.js:13:7)" 
] 
} 
+0

Wäre es nicht einfacher, wenn Sie die Datei in S3 haben und dort Zugang von EC2 und Lambda? –

+0

Danke für die Antwort Tom. Aber ich habe eine Situation. Ich habe eine Jar-Datei auf meinem EC2 und dieses Shell-Skript führt dieses Jar aus. Jetzt möchte ich dieses Shell-Skript mit meiner Lambda-Funktion ausführen. Es ist ein Teil meiner Anwendung, der vollständig auf der AWS-Schrittfunktion basiert. Daher sehe ich keine Option, um das Shell-Skript in S3 zu behalten, da es die JAR-Datei auf EC2 ausführen muss. – user3541321

+0

Warum können Sie nicht alles in Lambda laufen? Sie können JAR-Dateien mit Ihrem Lambda-Code einschließen. –

Antwort

1

Sie benötigen etwas, das auf Ihrer EC2-Instanz ausgeführt wird, um die Anforderung zu empfangen.

Einige Optionen:

  • einen Server Web-Ausführung und aus der Lambda-Funktion aufrufen, oder
  • Verwenden Sie die EC2 Run Command, die einen Agenten auf der EC2-Instanz verwendet und können über die AWS-API aufgerufen werden, oder
  • haben die Lambda-Funktion eine Nachricht in eine Amazon SQS-Warteschlange schieben und haben die Instanz kontinuierlich die Warteschlange abfragen

Es wäre viel einfacher, wenn man einfach th laufen konnte e Code in Ihrer Lambda-Funktion stattdessen.

+0

Mein Code ruft einige andere Anwendungen SOAP-Dienste, deren Antwortzeit mehr als 5 Minuten ist, so kann ich nicht direkt den Code in Lambda schreiben. Andere Sache ist, es ist eine AWS Schrittfunktion Aktivität und kann nicht als Web-Anwendung geschrieben werden, so schrieb ich den Code in Java-Hauptmethode. Wiederum kann es aufgrund der ReadTimeout-Einschränkung in der Schrittfunktion nicht kontinuierlich mit dem EC2-Laufbefehl laufen. – user3541321

-1

Antwort auf diese Frage schreiben. Hoffe es wird helfen.

package com.wb.mars.ingest; 

import java.io.File; 
import java.io.InputStream; 
import java.io.OutputStream; 
import java.io.PrintWriter; 
import com.amazonaws.services.lambda.runtime.Context; 
import com.amazonaws.services.lambda.runtime.RequestHandler; 
import com.jcraft.jsch.ChannelExec; 
import com.jcraft.jsch.JSch; 
import com.jcraft.jsch.Session; 
import com.wb.mars.ingest.CustomEventInput; 
import com.wb.mars.ingest.CustomEventOutput; 


public class EC2ConnectLambda implements RequestHandler<CustomEventInput,CustomEventOutput> { 

    public CustomEventOutput handleRequest(CustomEventInput input, Context context) { 
     context.getLogger().log("Input: " + input); 
     System.out.println("test"); 
    try { 

     String command1 = "cd /home/ec2-user/mydir; ./runjar.sh"; 


     JSch jsch = new JSch(); 

     String user = "ec2-user"; 

     String host = "*.*.*.*"; 
     int port = 22; 

     //File file = new File(EC2ConnectLambda.class.getResource("/Linux_EC2.pem").toURI()); 
     File file = new File(EC2ConnectLambda.class.getResource("/mykey.pem").toURI()); 

     String privateKeyabsolutePath = file.getAbsolutePath(); 

     jsch.addIdentity(privateKeyabsolutePath); 
     System.out.println("identity added "); 

     Session session = jsch.getSession(user, host, port); 
     System.out.println("session created."); 

     java.util.Properties config = new java.util.Properties(); 
     config.put("StrictHostKeyChecking", "no"); 
     session.setConfig(config); 

     session.connect(); 
     System.out.println("session connected....."); 

     ChannelExec channel = (ChannelExec)session.openChannel("exec"); 
     OutputStream o = channel.getOutputStream(); 
     PrintWriter pw = new PrintWriter(o); 
     InputStream in = channel.getInputStream(); 
     ((ChannelExec) channel).setCommand(command1); 

     channel.connect(); 

     // 4 - Clean up 
     channel.disconnect(); 
     session.disconnect(); 

    } catch (Exception e) { 
     System.err.println(e); 
     e.printStackTrace(); 
    } 
    return new CustomEventOutput("lambdaInvoked"); 
} 

}