首页 > 编程问答 >无法使用 EMR 无服务器中的请求库访问公共 API

无法使用 EMR 无服务器中的请求库访问公共 API

时间:2024-07-28 13:29:32浏览次数:14  
标签:python amazon-web-services request amazon-emr

当我尝试使用请求库获取 API 时出现以下错误。

Traceback (most recent call last):
  File "/tmp/spark-39775710-130a-4403-9182-c557003f351b/lib.zip/urllib3/connection.py", line 196, in _new_conn
  File "/tmp/spark-39775710-130a-4403-9182-c557003f351b/lib.zip/urllib3/util/connection.py", line 85, in create_connection
  File "/tmp/spark-39775710-130a-4403-9182-c557003f351b/lib.zip/urllib3/util/connection.py", line 73, in create_connection
TimeoutError: [Errno 110] Connection timed out

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/tmp/spark-39775710-130a-4403-9182-c557003f351b/lib.zip/urllib3/connectionpool.py", line 789, in urlopen
  File "/tmp/spark-39775710-130a-4403-9182-c557003f351b/lib.zip/urllib3/connectionpool.py", line 490, in _make_request
  File "/tmp/spark-39775710-130a-4403-9182-c557003f351b/lib.zip/urllib3/connectionpool.py", line 466, in _make_request
  File "/tmp/spark-39775710-130a-4403-9182-c557003f351b/lib.zip/urllib3/connectionpool.py", line 1095, in _validate_conn
  File "/tmp/spark-39775710-130a-4403-9182-c557003f351b/lib.zip/urllib3/connection.py", line 615, in connect
  File "/tmp/spark-39775710-130a-4403-9182-c557003f351b/lib.zip/urllib3/connection.py", line 211, in _new_conn
urllib3.exceptions.NewConnectionError: <urllib3.connection.HTTPSConnection object at 0xffff812d8a60>: Failed to establish a new connection: [Errno 110] Connection timed out

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/tmp/spark-39775710-130a-4403-9182-c557003f351b/lib.zip/requests/adapters.py", line 667, in send
  File "/tmp/spark-39775710-130a-4403-9182-c557003f351b/lib.zip/urllib3/connectionpool.py", line 843, in urlopen
  File "/tmp/spark-39775710-130a-4403-9182-c557003f351b/lib.zip/urllib3/util/retry.py", line 519, in increment
urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(host='vpic.nhtsa.dot.gov', port=443): Max retries exceeded with url: /api/vehicles/getallmakes?format=json (Caused by NewConnectionError('<urllib3.connection.HTTPSConnection object at 0xffff812d8a60>: Failed to establish a new connection: [Errno 110] Connection timed out'))

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/tmp/spark-39775710-130a-4403-9182-c557003f351b/test.py", line 8, in <module>
    response = requests.request("GET", url, headers=headers, data=payload)
  File "/tmp/spark-39775710-130a-4403-9182-c557003f351b/lib.zip/requests/api.py", line 59, in request
  File "/tmp/spark-39775710-130a-4403-9182-c557003f351b/lib.zip/requests/sessions.py", line 589, in request
  File "/tmp/spark-39775710-130a-4403-9182-c557003f351b/lib.zip/requests/sessions.py", line 703, in send
  File "/tmp/spark-39775710-130a-4403-9182-c557003f351b/lib.zip/requests/adapters.py", line 700, in send
requests.exceptions.ConnectionError: HTTPSConnectionPool(host='vpic.nhtsa.dot.gov', port=443): Max retries exceeded with url: /api/vehicles/getallmakes?format=json (Caused by NewConnectionError('<urllib3.connection.HTTPSConnection object at 0xffff812d8a60>: Failed to establish a new connection: [Errno 110] Connection timed out'))

我拥有的代码

import requests
def call_api():
    url = "https://vpic.nhtsa.dot.gov/api/vehicles/getallmakes?format=json"
    
    payload = {}
    headers = {}
    
    response = requests.request("GET", url, headers=headers, data=payload)
    
    print(response.text)

相同的代码在 AWS Lambda 中工作,甚至在我的本地,也不知道 EMR 无服务器中出了什么问题。|| |注意:我没有使用任何 VPC 或子网配置

Note: I am not using any VPC or subnets configs


在 EMR Serverless 中遇到“连接超时”错误,而相同的代码在 Lambda 和本地环境中有效,这表明 EMR Serverless 环境无法访问公共互联网。默认情况下,EMR Serverless 不会向公共互联网开放,因此需要进行网络配置才能实现。

以下是如何解决此问题的步骤:

选项 1:使用 VPC 端点(推荐)

  1. 创建 VPC 端点: *.amazonaws.com (用于 S3 和其他 AWS 服务)和 vpic.nhtsa.dot.gov 创建 VPC 端点。这将允许的 EMR Serverless 环境通过 VPC 网络访问这些服务,而无需暴露于公共互联网。
  2. 将端点添加到安全组: 将 VPC 端点添加到 EMR Serverless 环境使用的安全组中。
  3. 更新 EMR Serverless 应用程序: 使用 VPC 端点配置更新的 EMR Serverless 应用程序,以使用新的网络设置。

选项 2:使用 NAT 网关(不太安全)

  1. 创建 NAT 网关: 在的 VPC 中创建一个 NAT 网关,并将其连接到可以访问互联网的公共子网。
  2. 更新路由表: 将 EMR Serverless 环境使用的子网的路由表更新为使用 NAT 网关进行互联网流量。

选项 3:使用互联网网关(最不安全)

警告: 此选项将的 EMR Serverless 环境直接暴露于互联网,因此不建议用于生产工作负载。

  1. 创建互联网网关: 在的 VPC 中创建一个互联网网关。
  2. 更新路由表: 将 EMR Serverless 环境使用的子网的路由表更新为使用互联网网关进行互联网流量。

完成网络配置后,请确保的 EMR Serverless 环境具有以下权限:

  • 访问 S3: EMR Serverless 需要访问 S3 才能存储应用程序代码、日志和其他数据。
  • 访问 VPC 端点: 如果选择使用 VPC 端点,则需要授予 EMR Serverless 访问它们的权限。

建议使用 VPC 端点,因为它提供了一种更安全、更可靠的方式来连接到 VPC 外部的服务。

代码示例(使用 VPC 端点):

import requests
import boto3

def call_api():
    # 创建 VPC 端点客户端
    ec2 = boto3.client('ec2')

    # 获取默认 VPC ID
    response = ec2.describe_vpcs()
    vpc_id = response.get('Vpcs', [{}])[0].get('VpcId', '')

    # 创建 VPC 端点
    endpoint = ec2.create_vpc_endpoint(
        VpcEndpointType='Gateway',
        VpcId=vpc_id,
        ServiceName='com.amazonaws.us-east-1.s3',
        RouteTableIds=[
            # 将的路由表 ID 添加到这里
        ]
    )

    # 获取 VPC 端点 DNS 名称
    endpoint_dns = endpoint['VpcEndpoint']['DnsEntries'][0]['DnsName']

    # 使用 VPC 端点 DNS 名称访问 S3
    url = "https://vpic.nhtsa.dot.gov/api/vehicles/getallmakes?format=json"

    payload = {}
    headers = {}

    response = requests.request("GET", url, headers=headers, data=payload)

    print(response.text)

# 调用 API 函数
call_api()

请注意,这只是一个示例,需要根据的特定环境和需求对其进行调整。

标签:python,amazon-web-services,request,amazon-emr
From: 78802071

相关文章

  • 如何在 FastAPI 中间件中以不同方式捕获或处理 RequestValidationError 异常?
    如何正确组合RequestValidationError异常处理程序,如:@app.exception_handler(RequestValidationError)asyncdefvalidation_exception_handler(request,exc):response=prepare_response({},g_ERROR__INCORRECT_PARAMS)returnJSONResponse(content=re......
  • AttributeError:'int'对象没有属性'index'(python)
    我正在Python上进行“猜单词”,但我无法弄清楚这个错误。AttributeError:'int'objecthasnoattribute'index'(python)它在线上给了我一个错误letterIndex=word.index(guess)defcheckLetter(word):blanks='_'*len(str(word))print('W......
  • 尝试在Python中使用for循环来输出大于或等于序列中的数字
    这是我的Python代码:largest_so_far=-1print('before',largest_so_far)forthe_numin[9,41,12,3,74,15]:ifthe_num>largest_so_far:largest_so_far=the_numprint(largest_so_far,'isbiggerthan',the_num)......
  • 如何在 wxPython 的 for 循环中添加文本输入框?
    我是wxPython的新手,正在开发一个带有GUI的基本程序,让用户标记图像。现在,当用户单击“导入”按钮时,他们可以选择一个目录。然后,代码使用matplotlib在for循环中显示该目录中的每个图像。但是,我不知道如何在for循环中访问用户输入。这就是该函数现在的样子:importmatplo......
  • 【Python】字母 Rangoli 图案
    一、题目YouaregivenanintegerN.YourtaskistoprintanalphabetrangoliofsizeN.(RangoliisaformofIndianfolkartbasedoncreationofpatterns.)Differentsizesofalphabetrangoliareshownbelow:#size3----c------c-b-c--c-b-a-b-c--c......
  • python 闭包、装饰器
    一、闭包:1.外部函数嵌套内部函数 2.外部函数返回内部函数 3.内部函数可以访问外部函数局部变量         闭包(Closure)是指在一个函数内部定义的函数,并且内部函数可以访问外部函数的局部变量,即使外部函数已经执行完毕,这种现象称为闭包。在Python中,闭包常常用......
  • 掌握 IPython %%time 魔法命令:高效测量代码块执行时间
    引言在编程和数据分析中,了解代码的执行时间是优化性能的关键步骤。IPython,作为一个强大的交互式计算环境,提供了多种工具来帮助用户测量和优化代码。其中,%%time魔法命令是IPython中用来测量代码块执行时间的便捷工具。本文将详细介绍%%time魔法命令的使用方法,并通过一......
  • 探索 IPython 中的 %%javascript 魔法命令:运行 JavaScript 代码的秘籍
    引言IPython是一个强大的交互式计算环境,它不仅支持Python语言,还通过各种魔法命令扩展了其功能。其中,%%javascript魔法命令是IPython扩展中一个非常有趣的特性,它允许用户在IPython环境中直接运行JavaScript代码。这对于需要在数据科学和科学计算中使用JavaScript......
  • pythonasm库分析,看看你和自学编程小学生的差距
    下面是pythonasm.asm库的源代码fromkeystoneimport*fromcapstoneimport*assembly_instructions=[]#储存汇编指令的列表#汇编指令写入列表defmov(reg1,reg2):assembly_instructions.append(f"mov{reg1},{reg2}")defdb(value):assembly_instructio......
  • 【Python系列】Python 中的垃圾收集:深入理解与实践
    ......