簡體   English   中英

VPC 中的 Lambda 無法連接到 AWS 服務

[英]Lambda in VPC cannot connect to AWS services

我在 VPC 中有一個 lambda,因為它需要訪問數據庫。 現在這個 lambda 還必須能夠使用 Firehose Kinesis 視頻流 ( https://aws.amazon.com/kinesis/video-streams/ )。 我的 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)')

據我了解,我的 lambda 無法連接到https://kinesisvideo.eu-west-1.amazonaws.com/createStream因為它位於 VPC 中。 為了測試這一點,我在我的 VPC 外部創建了一個新的臨時 lambda,它工作得非常好,它可以毫無問題地連接到 Kinesis Video Stream。

要解決此問題,我知道我必須創建一個終端節點,以便我的 VPC 中的 lambda 可以訪問 AWS 服務,例如 Kinesis Video Streaming。 我去了 VPC 終端節點控制台並創建了一個新終端節點。 我選擇了“com.amazonaws.eu-west-1.kinesis-streams”服務,並確保使用與我的 lambda 相同的 VPC、子網和安全組。 創建端點后,我嘗試再次調用 create_stream。 不幸的是,我得到了相同的結果,嘗試連接時超時。

所以我的問題是:是否有可能從 VPC 提供 AWS 服務? 如果是這樣,怎么做?

更新

作為對答案的回應,我現在嘗試了以下方法,但仍然遇到相同的錯誤:

我在 VPC 中的 Lambda 具有具有所有出站權限的 SG。 然后我創建了一個從 VPC SG 入站的新 SG,然后將其分配給端點。

當 AWS Lambda function連接到 VPC 時,它可以完全訪問 Internet。

當 AWS Lambda function連接到 VPC 時,它將無法直接訪問 Internet。 要授予此類訪問權限,您將需要:

  • 公共子網中的NAT 網關,具有匹配的路由表,
  • VPC 中用於所需服務的VPC 終端節點

如果使用 VPC Endpoint,請按如下方式配置安全組:

  • 為 Lambda function ( Lambda-SG ) 創建一個安全組
    • 授予默認“所有出站”權限
    • 不需要入站規則
  • 為 VPC Endpoint ( Endpoint-SG ) 創建安全組
    • Lambda-SG授予入站訪問權限

也就是說, Endpoint-SG Lambda-SG 這將允許 Lambda function 訪問 VPC 端點。

是的,很可能通過部署到 vpc 中的 lambda 調用其他服務。

如前所述,需要您已經配置的端點。 在這種情況下,問題似乎與出站端口有關。

您是否在連接到您的 lambda 的安全組中配置了出站?

我只是更仔細地查看了您的代碼。 您似乎正在使用Amazon Kinesis Video ,這與Amazon Kinesis Data Streams不同。

據我所知,VPC Endpoint 可用於數據流,但不能用於視頻。

這就是它無法到達kinesisvideo.eu-west-1.amazonaws.com端點的原因。

如果是這樣,那么您需要在公共子網中啟動NAT 網關,並相應地更新路由表。 然后 Lambda function 將能夠到達 Kinesis。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM