2017-02-23 94 views
0

我的EC2服務器上有一個shell腳本,我想從AWS lambda函數中觸發相同的腳本。任何人都可以建議我如何訪問我的lambda函數中的文件。 lambda和EC2之間沒有連接問題。通過AWS連接到EC2服務器lambda

我用Putty gen生成了私鑰,並將其保存在s3存儲桶中,並使用相同的密鑰進行連接(使用此私鑰可以通過putty連接)。我有這樣一段代碼。

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客戶端運行shell腳本。但連接不會發生。獲取下面的錯誤。

{ 
"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和Lambda那裏訪問它? –

+0

謝謝你的回覆。但我有一種情況。我的EC2上有一個jar文件,這個shell腳本執行那個jar。現在我想通過我的lambda函數運行這個shell腳本。它是完全基於AWS step功能的我的應用程序的一部分。所以我沒有看到在s3中保留shell腳本的任何選項,因爲它需要在EC2上運行jar文件。 – user3541321

+0

爲什麼你不能在Lambda中運行它?您可以使用Lambda代碼包含jar文件。 –

回答

1

您需要在您的EC2實例上運行一些「接收」請求。

一些選項:

  • 運行一個Web服務器,並從lambda函數調用它,或
  • 使用其在EC2實例使用一個代理,並且可以通過AWS API調用,或EC2 Run Command
  • 有lambda函數推送消息到Amazon SQS隊列,並有不斷實例輪詢隊列

它就會簡單得多,如果你可以簡單地運行第e代碼代替您的Lambda函數。

+0

我的代碼正在調用一些其他應用程序的SOAP服務,其響應時間超過5分鐘,所以我不能直接在lambda中編寫代碼。另一件事是它是一個AWS步驟功能活動,不能寫成一個Web應用程序,所以我用java main方法編寫了代碼。由於step函數中的readTimeout約束,它再次無法連續運行EC2運行命令。 – 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"); 
} 

}