AWS Python Lambda with Oracle - OID Generation Failed

匿名 (未验证) 提交于 2019-12-03 01:22:02

问题:

I'm trying to connect to an Oracle DB using AWS Lambda Python code.

My code is below:

import sys, os import cx_Oracle import traceback  def main_handler(event, context):    # Enter your database connection details here   host = "server_ip_or_name"   port = 1521   sid = "server_sid"   username = "myusername"   password = "mypassword"    try:     dsn = cx_Oracle.makedsn(host, port, sid)     print dsn     connection = cx_Oracle.Connection("%s/%s@%s" % (username, password, dsn))     cursor = connection.cursor()     cursor.execute("select 1 / 0 from dual")   except cx_Oracle.DatabaseError, exc:     error, = exc.args     print >> sys.stderr, "Oracle-Error-Code:", error.code     print >> sys.stderr, "Oracle-Error-Message:", error.message     tb = traceback.format_exc()   else:     tb = "No error"   finally:     print tb   if __name__ == "__main__":   main_handler(sys.argv[0], None) 

If have already added all dependencies in "lib" folder, thanks to AWS Python Lambda with Oracle

When running this code, I'm getting: DatabaseError: ORA-21561: OID generation failed

i've tried to connect using IP of the Oracle server and the name: same error.

Here is the output of the error

Oracle-Error-Code: 21561 Oracle-Error-Message: ORA-21561: OID generation failed  Traceback (most recent call last):   File "/var/task/main.py", line 20, in main_handler   connection = cx_Oracle.Connection("%s/%s@%s" % (username, password, dsn)) DatabaseError: ORA-21561: OID generation failed 

For those who have successfully run the CX_Oracle in AWS Lambda Python, can you please help ?

Thanks

回答1:

Ok, here is the explanation: Oracle has a funny behavior where if the hostname given by hostname can't be resolved, it will fail connecting to the DB. Fortunately, in Linux, one can override the DNS entry for a session by writing an alias file in /tmp, then setting the environment variable HOSTALIASES to that file.

So adding this code to my function help to generate this file, and now I can successfully connect:

f = open('/tmp/HOSTALIASES','w') str_host = os.uname()[1] f.write(str_host + ' localhost\n') f.close() 

Hope it can help someone else !



回答2:

See the following other question for the resolution to this problem.

sqlplus remote connection giving ORA-21561

Effectively the client requires a host name in order to generate a unique identifier which is used when connecting to the database.



回答3:

The accepted solution for this correct, but please also be aware that the HOSTALIASES mechanism does require working DNS (as strange as it sounds).

I struggled with this for a few hours having implemented the accepted solution and realised that I was not permitting outbound DNS on the security group attached to by Lambda function VPC interface (my connection was by IP address to Oracle DB, so initially did not think this was required).



易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!