前提・実現したいこと
S3へのファイルアップロードをトリガーにして、
EC2上のSQL ServerへレコードをINSERTしたいです。
・S3へのファイルアップロードをトリガーにして、Lambda(Java)をキックする
・キックされたLambdaがS3 Put Eventをもとにファイルの中身を読み込む
という部分の実装は完了しております。
発生している問題・エラーメッセージ
SQL Serverへの接続部分に関して、正常に動作しない状態になっております。
また、CloudWatch上にも特にエラーに関するログが出力されないため、困っています。
原因究明にご助力いただけますでしょうか。
該当のソースコード
java
1 2public class DetectS3Event implements RequestHandler<S3Event, Object> 3{ 4 Connection connection = null; 5 LambdaLogger lambdaLogger = null; 6 7 @Override 8 public Object handleRequest(S3Event event, Context context) { 9 context.getLogger().log("Input: " + event); 10 lambdaLogger = context.getLogger(); 11 12 S3EventNotificationRecord record = event.getRecords().get(0); 13 // ===== block 1 ===== 14 lambdaLogger.log(record.getEventName()); //イベント名 15 lambdaLogger.log(record.getS3().getBucket().getName()); //バケット名 16 lambdaLogger.log(record.getS3().getObject().getKey()); //オブジェクトのキー(オブジェクト名) 17 // =================== 18 String bucketName = record.getS3().getBucket().getName(); 19 String key = record.getS3().getObject().getKey(); 20 21 try { 22 @SuppressWarnings("deprecation") 23 AmazonS3 client = new AmazonS3Client( 24 new BasicAWSCredentials( 25 "<accessKey>", 26 "<secretKey>")); 27 28 GetObjectRequest request = new GetObjectRequest(bucketName, key); 29 S3Object object = client.getObject(request); 30 31 BufferedInputStream bis = new BufferedInputStream(object.getObjectContent()); 32 BufferedReader br = new BufferedReader(new InputStreamReader(bis)); 33 34 // ===== block 2 ===== 35 lambdaLogger.log("br1 = " + br.readLine()); 36 lambdaLogger.log("br2 = " + br.readLine()); 37 // =================== 38 39 connectDB(); 40 41 // ===== block 3 ===== 42 lambdaLogger.log("connection = " + connection.toString()); 43 44 String line = ""; 45 int count = 1; 46 47 lambdaLogger.log("br = " + br.readLine()); 48 while ((line = br.readLine()) != null) { 49 lambdaLogger.log("br = " + count + " : " +br.readLine()); 50 } 51 // =================== 52 if (br != null) br.close(); 53 if (connection != null) closeConnection(connection); 54 } catch (IOException e) { 55 lambdaLogger.log("IOException : " + e); 56 } catch (Exception e) { 57 lambdaLogger.log("Anything Exception : " + e); 58 } 59 60 return null; 61 } 62 public void connectDB() 63 { 64 final String dbName = "<databaseName>"; 65 final String dbUser = "SA"; 66 final String dbPass = "<password>"; 67 68 try { 69 Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); 70 71 connection = DriverManager.getConnection( 72 "jdbc:sqlserver://<EC2-privateIP>:<portNo>;" 73 + "databaseName=" + dbName + ";", 74 dbUser, dbPass); 75 76 } catch (SQLException | ClassNotFoundException e) { 77 lambdaLogger.log("some SQL Exception : " + e); 78 } 79 } 80 private void closeConnection(Connection con) { 81 try { 82 con.close(); 83 } catch (SQLException e) { 84 e.printStackTrace(); 85 } 86 87 } 88} 89
この状態で、block 1 及び block 2 の lambdaLogger.log() は正常に実行されるのですが、
block 3 のlambdaLogger.log()が実行されません。
そのため、connectDB()メソッドの記述に誤りがあると推測しています。
試したこと
・LambdaのネットワークをEC2が所属するVPCにしており、サブネット、セキュリティグループもEC2と同様のものにしています。
・セキュリティグループではインバウンドルールにて、MSSQL ServerのポートをEC2のプライベートアドレスのサブネット向けに許可しています。
・Lambdaの実行時、サブネットのアドレス範囲内にENIが正常に作成されていることも確認済です。
・Lambdaの実行のためのIAMロールには、AWSLambdaVPCAccessExecutionRoleが割り当て済です。
補足情報(FW/ツールのバージョンなど)
JDBC のバージョンは、7.0.0.jre8になります。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。