2017-02-23 82 views
0

У меня есть сценарий оболочки на моем сервере EC2, и я хочу активировать его с помощью функции лямбда AWS. Может ли кто-нибудь предложить, как я могу получить доступ к файлу в своей лямбда-функции. Нет проблем с подключением между лямбдой и EC2.Подключиться к серверу EC2 через AWS lambda

Я сгенерировал закрытый ключ с геном Putty и сохранил его в ведро s3 и использовал тот же ключ для подключения (с помощью этого закрытого ключа, способного подключаться через шпатлевку). У меня есть такой код.

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

     }); 
} 

Сначала я пытаюсь увидеть, если я могу подключиться к EC2 серверу, а затем я могу запустить скрипт через SSH клиента. Но соединение не происходит. Получение ниже ошибки.

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

Не было бы проще, если у вас файл в S3 и получить доступ к нему есть с EC2 и лямбда? –

+0

Спасибо за ответ Том. Но у меня есть ситуация. У меня есть файл jar на моем EC2, и этот скрипт оболочки выполняет эту банку. Теперь я хочу запустить этот скрипт с помощью моей лямбда-функции. Это часть моего приложения, которое полностью основано на шаговой функции AWS. Поэтому я не вижу возможности сохранить сценарий оболочки в s3, поскольку он должен запускать файл jar на EC2. – user3541321

+0

Почему вы не можете запустить все это в Лямбде? Вы можете включить jar-файлы с вашим кодом Lambda. –

ответ

1

Вам понадобится что-то работающее на вашем экземпляре EC2 для «получения» запроса.

Некоторые опции:

  • Запуск веб-сервера и вызывать его из функции Lambda или
  • Используйте EC2 Run Command, который использует агент на экземпляре EC2 и может быть вызвана через API AWS, или
  • есть функция Lambda нажать сообщение в очереди Amazon SQS и иметь экземпляр постоянно опрашивать очередь

было бы намного проще, если бы вы могли бы просто запустить й e в вашей лямбда-функции.

+0

Мой код вызывает некоторые другие приложения. Службы SOAP, время отклика которых составляет более 5 минут, поэтому я не могу написать код в лямбда. Другое дело, что это функция функции шага AWS и не может быть написана как веб-приложение, поэтому я написал код в основном методе java. Снова он не может работать непрерывно с командой запуска EC2 из-за ограничения readTimeout в функции шага. – user3541321

-1

Опубликовать ответ на этот вопрос. Надеюсь, это поможет.

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"); 
} 

}