Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python VPC中的Lambda无法连接到AWS服务_Python_Amazon Web Services_Endpoint_Amazon Vpc_Amazon Kinesis Firehose - Fatal编程技术网

Python VPC中的Lambda无法连接到AWS服务

Python VPC中的Lambda无法连接到AWS服务,python,amazon-web-services,endpoint,amazon-vpc,amazon-kinesis-firehose,Python,Amazon Web Services,Endpoint,Amazon Vpc,Amazon Kinesis Firehose,我在VPC中有一个lambda,因为它需要访问数据库。现在,该lambda还必须能够使用Firehose Kinesis视频流()。我的lambda是用Python构建的,这是我创建kinesis视频客户端的代码: client = boto3.client('kinesisvideo') def create_stream(stream_name): response = client.create_stream( DeviceName='BE', St

我在VPC中有一个lambda,因为它需要访问数据库。现在,该lambda还必须能够使用Firehose Kinesis视频流()。我的lambda是用Python构建的,这是我创建kinesis视频客户端的代码:

client = boto3.client('kinesisvideo')
def create_stream(stream_name):
    response = client.create_stream(
        DeviceName='BE',
        StreamName=stream_name,
        MediaType='video/h264',
        DataRetentionInHours=1,
        Tags={
            'string': 'Livestream'
        }
    )
    stream_ARN = response['StreamARN']
    print('Printing ARN: ', stream_ARN)
    return stream_ARN
现在,当我调用create_stream(“TEST”)时,我的lambda在90秒后超时:

[DEBUG] 2019-11-05T15:02:47.66Z 2e094ebe-8a92-4a10-ab6c-433cf223cb5b retry needed, retryable exception caught: Connect timeout on endpoint URL: "https://kinesisvideo.eu-west-1.amazonaws.com/createStream"
Traceback (most recent call last):
File "/var/runtime/urllib3/connection.py", line 160, in _new_conn
(self._dns_host, self.port), self.timeout, **extra_kw)
File "/var/runtime/urllib3/util/connection.py", line 80, in create_connection
raise err
File "/var/runtime/urllib3/util/connection.py", line 70, in create_connection
sock.connect(sa)
socket.timeout: timed out

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "/var/runtime/botocore/httpsession.py", line 262, in send
chunked=self._chunked(request.headers),
File "/var/runtime/urllib3/connectionpool.py", line 641, in urlopen
_stacktrace=sys.exc_info()[2])
File "/var/runtime/urllib3/util/retry.py", line 344, in increment
raise six.reraise(type(error), error, _stacktrace)
File "/var/runtime/urllib3/packages/six.py", line 686, in reraise
raise value
File "/var/runtime/urllib3/connectionpool.py", line 603, in urlopen
chunked=chunked)
File "/var/runtime/urllib3/connectionpool.py", line 344, in _make_request
self._validate_conn(conn)
File "/var/runtime/urllib3/connectionpool.py", line 843, in _validate_conn
conn.connect()
File "/var/runtime/urllib3/connection.py", line 316, in connect
conn = self._new_conn()
File "/var/runtime/urllib3/connection.py", line 165, in _new_conn
(self.host, self.timeout))
urllib3.exceptions.ConnectTimeoutError: (<botocore.awsrequest.AWSHTTPSConnection object at 0x7fcf62a7e128>, 'Connection to kinesisvideo.eu-west-1.amazonaws.com timed out. (connect timeout=60)')
[DEBUG]2019-11-05T15:02:47.66Z 2e094ebe-8a92-4a10-ab6c-433cf223cb5b需要重试,捕获可重试的异常:端点URL上的连接超时:https://kinesisvideo.eu-west-1.amazonaws.com/createStream"
回溯(最近一次呼叫最后一次):
文件“/var/runtime/urllib3/connection.py”,第160行,位于康涅狄格州的新州
(self.\u dns\u主机、self.port)、self.timeout、**额外功率)
文件“/var/runtime/urllib3/util/connection.py”,第80行,在create_connection中
提出错误
文件“/var/runtime/urllib3/util/connection.py”,第70行,在create_connection中
sock.connect(sa)
socket.timeout:超时
在处理上述异常期间,发生了另一个异常:
回溯(最近一次呼叫最后一次):
文件“/var/runtime/botocore/httpsession.py”,第262行,在send中
chunked=self.\u chunked(request.headers),
文件“/var/runtime/urllib3/connectionpool.py”,第641行,在urlopen中
_stacktrace=sys.exc_info()[2])
文件“/var/runtime/urllib3/util/retry.py”,第344行,增量
升起六个。重新升起(类型(错误),错误,_stacktrace)
文件“/var/runtime/urllib3/packages/six.py”,第686行,在reraise中
增值
文件“/var/runtime/urllib3/connectionpool.py”,第603行,在urlopen中
分块=分块)
文件“/var/runtime/urllib3/connectionpool.py”,第344行,在请求中
自我验证连接(连接)
文件“/var/runtime/urllib3/connectionpool.py”,第843行,在“验证”连接中
连接
文件“/var/runtime/urllib3/connection.py”,第316行,在connect中
conn=自我。_new_conn()
文件“/var/runtime/urllib3/connection.py”,第165行,位于康涅狄格州新州
(self.host,self.timeout))
urllib3.exceptions.ConnectTimeoutError:(,“连接到kinesisvideo.eu-west-1.amazonaws.com超时。(连接超时=60)”
据我所知,我的lambda无法连接到,因为它位于VPC中。为了测试这一点,我在我的VPC外创建了一个新的临时lambda,它工作得非常好,可以毫无问题地连接到Kinesis视频流

要解决此问题,我知道我必须创建一个端点,以便VPC中的lambda可以访问AWS服务,如Kinesis视频流。我转到VPC端点控制台并创建了一个新端点。我选择了“com.amazonaws.eu-west-1.kinesis-streams”服务,并确保使用与我的lambda相同的VPC、子网和安全组。创建端点后,我再次尝试调用create_stream。不幸的是,我得到了同样的结果,尝试连接时超时

所以我的问题是:是否有可能从专有网络获得AWS服务?如果是,怎么做

更新

作为对答案的回应,我现在尝试了以下方法,但仍然得到相同的错误:


我在VPC中的Lambda拥有一个具有所有出站权限的SG。然后,我创建了一个新的SG,该SG已从VPC SG入站,然后将其分配给端点。

是的,通过部署到VPC中的lambda调用其他服务是非常有可能的

如上所述,需要您已经配置的端点。在这种情况下,问题似乎与出站端口有关


您是否已在连接到lambda的安全组中配置出站?

当AWS lambda功能未连接到VPC时,它可以完全访问Internet


当AWS Lambda功能连接到VPC时,它将无法直接访问Internet。要授予此类访问权限,您需要:

  • 公共子网中的NAT网关,具有匹配的路由表,或
  • VPC中用于所需服务的VPC端点
如果使用VPC端点,请按如下方式配置安全组:

  • 为Lambda函数创建安全组(
    Lambda SG
    • 授予默认的“所有出站”权限
    • 不需要入站规则
  • 为VPC端点创建安全组(
    端点SG
    • Lambda SG

也就是说,
端点SG
在入站规则中专门引用
Lambda SG
。这将允许Lambda函数访问VPC端点。

我只是更仔细地查看了您的代码。您似乎正在使用亚马逊运动信息视频,这与亚马逊运动信息数据流不同

据我所见,VPC端点可用于数据流,但没有视频

这就是它无法到达
kinesisvideo.eu-west-1.amazonaws.com
端点的原因


如果是这样,那么您需要在公共子网中启动一个NAT网关,并相应地更新路由表。Lambda功能将能够到达Kinesis。

是的,您说过“确保使用与我的Lambda相同的VPC、子网和安全组”,但作为同一安全组的一部分并不保证连接。您需要一个入站规则,允许VPC端点接收来自Lambda的流量。您好,感谢您的响应。我刚刚试过这个。我在VPC中的Lambda拥有一个具有所有出站权限的SG。然后,我创建了一个新的SG,该SG已从VPC SG入站,然后将其分配给端点。似乎不起作用。谢谢,路由表应该如何配置?我尝试用Lambda的子网创建一个新的NAT网关。然后,我创建了新的路由表,将0.0.0.0/0路由到我的NAT网关id。我还将子网关联添加到路由表的lambda子网。我在这里遵循了iSN规则:听起来不错!对你有用吗?要检查的主要内容是Lambda函数是否与priv相关联