Lambda 函数无法连接到 Redshift:名称解析暂时失败

Posted

技术标签:

【中文标题】Lambda 函数无法连接到 Redshift:名称解析暂时失败【英文标题】:Lambda function unable to connect to Redshift : Temporary failure in name resolution 【发布时间】:2017-01-06 19:55:01 【问题描述】:

我有一个连接到Jira webhook 的AWS Lambda 函数。每当创建/更改/删除问题时,它都会向我的API Gateway 发送请求,该请求会调用我的函数。当我尝试在函数内连接到 Redshift 时,我收到以下回溯:

Traceback (most recent call last):
File "/var/task/jira_webhook_proc.py", line 171, in lambda_handler
update_item(request, issue, issue_key)
File "/var/task/jira_webhook_proc.py", line 193, in update_item
delete_item(delete_key)
File "/var/task/jira_webhook_proc.py", line 277, in delete_item
port=REDSHIFT_PORT) as conn:
File "/var/task/psycopg2/__init__.py", line 164, in connect
conn = _connect(dsn, connection_factory=connection_factory, async=async)
OperationalError: could not translate host name "***" to address: Temporary failure in name resolution

我正在使用预编译的 psycopg2 库,可以在此处找到 https://github.com/jkehler/awslambda-psycopg2。从谷歌搜索看来,这可能是一个PostgreSQL 错误,我没有设置正确的配置文件来监听所有端口。不过,我不确定我会如何改变它。

【问题讨论】:

您是否将 Lambda 函数放置在与 Redshift 集群相同的 VPC 中? 在同一个VPC,刚刚确认。 您是在为 Redshift 集群使用自定义 DNS 名称,还是仅使用 Redshift 控制台为您提供的 DNS 名称? 我只是使用控制台 jdbc:redshift://****:5493/#### 中 jdbc url 的 * 部分。这是我从办公室连接我的其他应用程序时使用的。然后我尝试使用集群的领导节点私有 IP。 lambda 可能无法访问私有 IP。尝试使用 redshift 控制台中给出的端点 DNS,其结尾如下所示:your-cluster.us-east-1.redshift.amazonaws.com:5439。还要确保你的 lambda 函数访问子网和安全组:aws.amazon.com/blogs/aws/… 【参考方案1】:

我使用下面添加的这段代码来连接来自 lambda 函数的红移。使用 psycopg2

conn_string = "dbname='your_db_name' port='5439' user='redshift_user' password='^%+^+&7!+' host='xxxxxxx.yyyyyyy.eu-west-1.redshift.amazonaws.com'"

conn = psycopg.connect(conn_string)

cursor = conn.cursor()

cursor.execute("COPY data_table ........ ")

conn.commit()
cursor.close()
conn.close()

【讨论】:

【参考方案2】:

它可能对某人有所帮助,因为它在我的情况下非常有效。

import psycopg2
import od_red_load_cred as CONSTANTS

def main():

    # Amazon Redshift connect string 
    try:
        conn_string = "dbname= port= user= password= host="\
        .format(CONSTANTS.DBNAME, CONSTANTS.PORT, CONSTANTS.USER, 
            CONSTANTS.PASSWORD, CONSTANTS.HOST)

        print("Connect string Successful!")
    except:
        print("Unable to create the connect string")

    # query generate
    try:
        sql="""copy . from ''\
        credentials 'aws_access_key_id=;aws_secret_access_key=' \
        DELIMITER ',' ACCEPTINVCHARS EMPTYASNULL ESCAPE COMPUPDATE OFF;commit;"""\
        .format(CONSTANTS.SCHEMA, CONSTANTS.TABLE_NAME_BV, CONSTANTS.S3_PATH_BV, 
            CONSTANTS.ACCESS_KEY_ID, CONSTANTS.SECRET_ACCESS_KEY)

        print("sql ==>", sql)
        print("Query creation Successful!")
        print(" ")
    except:
        print("Unable to create the query")

    # get connection
    try:
        con = psycopg2.connect(conn_string);
        print("con ==>", con)
        print("Connection Successful!")
    except Exception as e:
        print("Unable to connect to Redshift")
        print(e)
        exit(-1)

    # get cursor connection
    try:
        cur = con.cursor()
    except Exception as e:
        print("Unable to get the cursor from connection of Redshift")
        print(e)
        exit(-1)

    # execute cursor connection
    try:
        cur.execute(sql)
        print("Query executed successfully")
    except Exception as e:
        print("Failed to execute the query")
        print(e)
        exit(-1)

    # close connection
    try:
        con.close() 
        print("Connection closed Successfully!")
    except Exception as e:
        print("Unable to close connection to Redshift")
        print(e)

    print(" ")

# Main method
if __name__ == '__main__':
    print("start: __main__ ")
    main()
    print("end: __main__ ")

【讨论】:

以上是关于Lambda 函数无法连接到 Redshift:名称解析暂时失败的主要内容,如果未能解决你的问题,请参考以下文章

从没有 VPC 的 Lambda 连接到公共 Redshift 数据库

将 AWS Lambda 连接到 Redshift - 60 秒后超时

无法从 AWS lambda 连接 AWS redshift

如何将 Cloud9 (python) 连接到 VPC 中的 Redshift?

AWS Lambda 上的节点函数无法使用 node-pg 连接到数据库

从 R 连接到 Redshift 数据库