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

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

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

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

99閲覧

AWSのlambdaからEC2内にあるOracleDBに接続できない。

ko_se

総合スコア24

AWS Lambda

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2024/11/08 13:59

編集2024/11/10 01:03

実現したいこと

lambdaからEC2(WindwosServer)内にあるOracelDBに接続してデータをSELECTしたいです。
諸事情によりRDSは使えず、WindowsServer内に作ったOracelDBに接続する必要があります。
lambdaの実行環境はPythonで、ローカル環境での接続は確認できているためコードではなくセキュリティグループ設定等の問題かと考えています。

発生している問題・分からないこと

lambdaからEC2内のOracelDBへの接続を試みたところ、10秒ほどたってDPY-6005: cannot connect to database...(中略)Connection timed outとなります。
※lamda設定上のタイムアウト秒数は60秒に設定しています。

エラーメッセージ

error

1"DPY-6005: cannot connect to database (CONNECTION_ID=TGLeUxNKvpL6bIG4u8WCGA==).\\n[Errno 110] Connection timed out\"

該当のソースコード

Python

1import json 2import oracledb 3# Oracle DB接続情報 4DB_HOST = "ip-XXX-XX-XX-XX.ap-northeast-1.compute.internal" # EC2インスタンスのプライベートIPアドレス 5DB_PORT = "1521" # デフォルトのOracleポート 6DB_SERVICE_NAME = "orcl" 7DB_USER = "XXXX" 8DB_PASSWORD = "XXXX" 9TABLE_NAME = "XXXX" 10def lambda_handler(event, context): 11 try: 12 # Oracle DBに接続 13 dsn = f"(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST={DB_HOST})(PORT={DB_PORT}))(CONNECT_DATA=(SERVICE_NAME={DB_SERVICE_NAME})))" 14 connection = oracledb.connect(user=DB_USER, password=DB_PASSWORD, dsn=dsn) 15 cursor = connection.cursor() 16 # SQLクエリ実行 17 sql_query = f"SELECT EMP_CODE,KAISYACD FROM {TABLE_NAME}" 18 cursor.execute(sql_query) 19 # 結果を取得してリストに格納 20 columns = [col[0] for col in cursor.description] # カラム名を取得 21 results = [dict(zip(columns, row)) for row in cursor.fetchall()] # 各行を辞書形式で格納 22 # JSON形式で返却 23 response = { 24 "status": "success", 25 "data": results 26 } 27 return { 28 "statusCode": 200, 29 "body": json.dumps(response) 30 } 31 except oracledb.DatabaseError as e: 32 error, = e.args 33 print("Oracle Database error:", error) 34 return { 35 "statusCode": 500, 36 "body": json.dumps({ 37 "status": "error", 38 "message": str(error) 39 }) 40 } 41 finally: 42 # リソースを解放 43 if 'cursor' in locals(): 44 cursor.close() 45 if 'connection' in locals(): 46 connection.close()

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

■自分の理解
lambdaからEC2内のDBにアクセスするために以下の設定が必要と理解しています。
①EC2と同VPC内にlambdaを配置する。
②SGの設定にて以下の設定が必要
③AWSLambdaVPCAccessExecutionRoleの割り当てが必要

【EC2側】
・インバウンドルールにてlambdaからのアクセスを許可する。
・デフォルトポート1521
・アクセス元はlambdaに設定してSG
【lambda側】
・アウトバウンドルールにて対象のEC2へアクセスできること。

■理解に基づいてやったこと
①同VPCにlambdaを配置(エビデンス省略)
・EC2に紐づいているVPCIDをlamdaの設定⇒VPCから設定。(サブネットも同一IDであることを確認)

②SGの設定
・lambda側
イメージ説明
・EC2側
イメージ説明

③ロールの割り当て
AWSLambdaVPCAccessExecutionRoleの割り当て済(エビデンス省略)

以上の設定でもエラー内容はかわらずでした。
②は自分のやっていることがあっているかやや自信がないのですが、解決に向けて何かアドバイスいただけると幸いです。

補足

特になし

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

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

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

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

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

guest

回答1

0

自己解決

自己解決しました。
結論からいうとEC2側のファイアウォールの設定変更とオラクルのリスナーの設定変更が必要でした。

今後のトラブルシューティングにあたる方のために試したこと順に記載します。

まずセキュリティグループの問題なのかを切り分けるためにインバウンドもアウトバウンドもフルオープンなものをEC2・Lambda側に設定。
また疎通だけを行うためにOracelDB云々を切り離した単純なコードで疎通確認を行いました。
(コードはchatGPTが書いてくれました)

この段階で8080、80ポートの疎通ができてその他のポートは相変わらず疎通できないことを確認。
原因がSG以外にあることにあたりを付けます。

EC2のファイアウォール設定と、そもそもアプリ側がポートをリッスンしていない可能性があることをchatGPTに示唆されます。
netstat -aコマンドで全部のポートを確認すると確かにいくつかのポートに限定されていました。(当たり前だ...)

そこでいくつかポートをピックアップしてファイアウォールに穴あけ設定を施しました。
この時点で8081のようなポートでは疎通が確認できました。
一方で同様にファイアウォールにオラクルのデフォである1521を追加しても疎通できませんでした。

netstat でみると1521ポートでは

127.0.0.1:1521

となっており、リッスンしてはいるものの外部からはアクセスできないようになってました。
listener.oraの記載のうちHOST=localhostとなっているものをHOST=0.0.0.0とし(本来的には狙ったIPだけを許可する)再起動すると疎通が確認できました。

その後SGをもとの状態に戻して疎通確認をしてクローズとなります。

投稿2024/11/09 10:06

ko_se

総合スコア24

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問