質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
AWS Lambda

AWS Lambdaは、クラウド上でアプリを実行できるコンピューティングサービス。サーバーのプロビジョニングや管理を要せず複数のイベントに対してコードを実行します。カスタムロジック用いた他AWSサービスの拡張やAWSの規模やパフォーマンスを用いたバックエンドサービスを作成できます。

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

JDBC

JDBC(Java DataBase Connectivity)は、Javaとリーレーショナルデータベースに接続させる基本的なAPIです。Java上でSQLステートメントを発行することで、データベースの種類に影響を受ないDB操作を可能とします。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

1回答

1398閲覧

AWS Lambda からVPC内のSQL Serverにアクセスできない

zvub1123

総合スコア230

AWS Lambda

AWS Lambdaは、クラウド上でアプリを実行できるコンピューティングサービス。サーバーのプロビジョニングや管理を要せず複数のイベントに対してコードを実行します。カスタムロジック用いた他AWSサービスの拡張やAWSの規模やパフォーマンスを用いたバックエンドサービスを作成できます。

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

JDBC

JDBC(Java DataBase Connectivity)は、Javaとリーレーショナルデータベースに接続させる基本的なAPIです。Java上でSQLステートメントを発行することで、データベースの種類に影響を受ないDB操作を可能とします。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2018/09/20 00:42

編集2018/09/20 01:26

前提・実現したいこと

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になります。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

自己解決しました。

EC2及びLambdaで使用するセキュリティグループのインバウンドルールについて、
プライベートアドレスのネットワーク向けにポート開放していたところを、セキュリティグループ向けに変更したところ、
正常に実行されるようになりました。

投稿2018/09/21 08:03

zvub1123

総合スコア230

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問