実現したいこと
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であることを確認)
③ロールの割り当て
AWSLambdaVPCAccessExecutionRoleの割り当て済(エビデンス省略)
以上の設定でもエラー内容はかわらずでした。
②は自分のやっていることがあっているかやや自信がないのですが、解決に向けて何かアドバイスいただけると幸いです。
補足
特になし
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。