连接到 Redshift 时,在 VPC 中使用 python 3.6 和 boto3 的 Lambda 超时
Lambda using python 3.6 & boto3 in VPC times out when connecting to Redshift
我正在尝试在 python3.6 中使用 boto3,通过 get_cluster_credentials API 连接到我的 Redshift 集群。当 Lambda 函数添加到 VPC 时,以下代码会在 100% 的时间内超时。当 Lambda 未添加到 VPC 时,它运行没有问题。
我无法确定 get_cluster_credentials 是否使用 public 或私有 IP 访问 Redshift。我也不知道是否有办法强制它使用一个或另一个。
import json
import boto3
def lambda_handler(event, context):
redshiftClient = boto3.client('redshift', region_name='us-east-1')
cluster_creds = redshiftClient.get_cluster_credentials( DbUser='awsuser',
DbName='dev',
ClusterIdentifier='redshift-cluster-1',
AutoCreate=False)
print(cluster_creds)
return {
'statusCode': 200,
'body': json.dumps('Hello from Lambda!')
}
我的配置很简单。 NACL 允许所有端口和协议上的所有内容 (0.0.0.0/0) 通过。我的 SG 也做同样的事情。
我定义了 1 个互联网网关:igw-0d1e6dcbfdea792b2
我在 VPC 中有 1 个子网和 1 个路由 table。路由 table 有一条规则映射 0.0.0.0/0 --> igw-0d1e6dcbfdea792b2.
我可以使用 SQL Workbench/J 从 AWS 外部连接到集群,没有问题。
我看了很多帖子、主题和文档,但无法弄清楚发生了什么:
Connect Lambda to Redshift in Different Availability Zones
https://github.com/awslabs/aws-lambda-redshift-loader/issues/86
https://aws.amazon.com/blogs/big-data/a-zero-administration-amazon-redshift-database-loader/
Conecting AWS Lambda to Redshift - Times out after 60 seconds
请帮忙。
非常感谢。
根据 ,当 AWS Lambda 函数添加到 VPC 时,它不会收到 Public IP 地址。因此,如果该函数希望访问 Internet(在本例中为进行 get_cluster_credentials()
调用),您应该:
- 在 Public 子网
中添加 NAT 网关
- 将 Lambda 函数附加到 私有子网
- 在私有子网上设置路由以使用
0.0.0.0/0
的 NAT 网关
如果只有一个子网,则无法使用,因为 Lambda 函数将无法访问 NAT 网关。
我也成功地手动分配了一个 弹性 IP 地址 给 Lambda 函数的 ENI(而不是使用 NAT 网关),但这不会扩展,因为 Lambda 可能会部署额外的容器,因此需要额外的 ENI。如果该函数很少且从不同时运行,这可能就足够了。
您应该能够从 VPC 直接 连接到 RedShift,而无需 Internet 或 NAT 网关。这就是 AWS PrivateLink 的用途,并且支持 RedShift。
流程的一般描述(服务特定变化适用):
- 转到 AWS 控制台中的 VPC -> 端点
- 创建新端点
- Select 您要为其创建端点的服务
- 配置端点安全组等
现在,在您创建客户端的代码中,您需要为客户端定义区域和端点。
免责声明:我没有为 RedShift 做过这个,但我已经为 STS 做了,而且它有效。
我正在尝试在 python3.6 中使用 boto3,通过 get_cluster_credentials API 连接到我的 Redshift 集群。当 Lambda 函数添加到 VPC 时,以下代码会在 100% 的时间内超时。当 Lambda 未添加到 VPC 时,它运行没有问题。
我无法确定 get_cluster_credentials 是否使用 public 或私有 IP 访问 Redshift。我也不知道是否有办法强制它使用一个或另一个。
import json
import boto3
def lambda_handler(event, context):
redshiftClient = boto3.client('redshift', region_name='us-east-1')
cluster_creds = redshiftClient.get_cluster_credentials( DbUser='awsuser',
DbName='dev',
ClusterIdentifier='redshift-cluster-1',
AutoCreate=False)
print(cluster_creds)
return {
'statusCode': 200,
'body': json.dumps('Hello from Lambda!')
}
我的配置很简单。 NACL 允许所有端口和协议上的所有内容 (0.0.0.0/0) 通过。我的 SG 也做同样的事情。
我定义了 1 个互联网网关:igw-0d1e6dcbfdea792b2
我在 VPC 中有 1 个子网和 1 个路由 table。路由 table 有一条规则映射 0.0.0.0/0 --> igw-0d1e6dcbfdea792b2.
我可以使用 SQL Workbench/J 从 AWS 外部连接到集群,没有问题。
我看了很多帖子、主题和文档,但无法弄清楚发生了什么:
Connect Lambda to Redshift in Different Availability Zones
https://github.com/awslabs/aws-lambda-redshift-loader/issues/86
https://aws.amazon.com/blogs/big-data/a-zero-administration-amazon-redshift-database-loader/
Conecting AWS Lambda to Redshift - Times out after 60 seconds
请帮忙。
非常感谢。
根据 get_cluster_credentials()
调用),您应该:
- 在 Public 子网 中添加 NAT 网关
- 将 Lambda 函数附加到 私有子网
- 在私有子网上设置路由以使用
0.0.0.0/0
的 NAT 网关
如果只有一个子网,则无法使用,因为 Lambda 函数将无法访问 NAT 网关。
我也成功地手动分配了一个 弹性 IP 地址 给 Lambda 函数的 ENI(而不是使用 NAT 网关),但这不会扩展,因为 Lambda 可能会部署额外的容器,因此需要额外的 ENI。如果该函数很少且从不同时运行,这可能就足够了。
您应该能够从 VPC 直接 连接到 RedShift,而无需 Internet 或 NAT 网关。这就是 AWS PrivateLink 的用途,并且支持 RedShift。
流程的一般描述(服务特定变化适用):
- 转到 AWS 控制台中的 VPC -> 端点
- 创建新端点
- Select 您要为其创建端点的服务
- 配置端点安全组等
现在,在您创建客户端的代码中,您需要为客户端定义区域和端点。
免责声明:我没有为 RedShift 做过这个,但我已经为 STS 做了,而且它有效。