2017-02-23 25 views
0

私はEC2サーバ上にシェルスクリプトを持っており、AWSラムダ機能から同じスクリプトを起動したいと思います。誰も私のラムダ関数でファイルにアクセスする方法を提案することができます。ラムダとEC2の間の接続に問題はありません。AWSラムダ経由でEC2サーバに接続

私は秘密鍵を生成して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

返信ありがとうTom。しかし、私には状況があります。自分のEC2にjarファイルがあり、このシェルスクリプトはそのjarファイルを実行します。今私はラムダ関数でこのシェルスクリプトを実行したいと思います。 AWSのステップ関数に完全に基づいている私のアプリケーションの一部です。だから、EC2上でjarファイルを実行する必要があるので、シェルスクリプトをs3に保存するオプションはありません。 – user3541321

+0

ラムダですべてを動かすことができないのはなぜですか? jarファイルにLambdaコードを含めることができます。 –

答えて

1

リクエストを受信するには、EC2インスタンス上で動作するものが必要です。

いくつかのオプション:

  • Webサーバを実行し、ラムダ関数からそれを呼び出す、または
  • 使用EC2インスタンス上のエージェントを使用し、AWS APIを介して呼び出すことができる、またはEC2 Run Command
  • あなたは、単に目を実行することができれば、それははるかに簡単になりますラムダ関数はアマゾンSQSキューにメッセージをプッシュする持って、インスタンスが継続的にキュー

をポーリングしてい代わりにあなたのラムダ関数のeコード。

+0

私のコードでは、応答時間が5分を超える他のアプリケーションのSOAPサービスが呼び出されているので、lambdaにコードを直接記述することはできません。他のことは、AWSのステップ関数アクティビティであり、Webアプリケーションとして記述することができないので、Javaメインメソッドでコードを記述しました。また、ステップ関数の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"); 
} 

}

関連する問題