启用 VPC 后无法从 Lambda/Python/Boto3 连接到 S3
Unable to connect to S3 from Lambda/Python/Boto3 when VPC is enabled
我在 lambda 中有一个非常简单的 python 函数,如果我禁用 VPC,它运行良好。
import json
import boto3
import botocore
def lambda_handler(event, context):
s3 = boto3.client('s3', 'us-east-1',
config=botocore.config.Config(s3={'addressing_style': 'path'}))
keys = []
resp = s3.list_objects_v2(Bucket='[BUCKET_NAME]')
for obj in resp['Contents']:
print(obj['Key'])
return {
'statusCode': 200,
'body': json.dumps('Hello from Lambda!')
}
启用 VPC 后,S3 连接不断超时。
我浏览了许多文档、教程、论坛主题和堆栈溢出帖子,但其中 none 对我有所帮助。
我的网络 ACL 具有端口 80、443 和 5439 (Redshift) 的 0.0.0.0/0 映射。
我唯一的一个安全组具有端口 80、443 和 5439 (Redshift) 的 0.0.0.0/0 映射。
我只配置了一个VPC。
我配置了 1 个 NAT 网关。
我配置了 1 个 Internet 网关。
我在 VPC 中有 6 个子网:
- 子网A和B指向主路由table.
- 子网 C 和 D 指向 'lambda_rt_table_gateway' 路由 table。
- 子网 E 和 F 指向 'lambda_rt_table_nat' 路由 table。
我在 VPC 中有 2 个端点:
- 端点 VPCE-A 是为服务 'com.amazonaws.us-east-1.s3' 定义的,并映射到所有 3 条路由 table。
- 端点 VPCE-B 是为服务 'com.amazonaws.us-east-1.dynamodb' 定义的,并映射到所有 3 条路由 table。
最后,我有 3 个路由表:
主要路线table有以下路线:
172.31.0.0/1 --> 本地
pl-02cd2c6b (com.amazonaws.us-east-1.dynamodb, 52.94.0.0/22, 52.119.224.0/20) --> vpce-07a6eb423bbbea151
pl-63a5400a (com.amazonaws.us-east-1.s3, 54.231.0.0/17, 52.216.0.0/15) --> vpce-0fd10c890bb176b5a
0.0.0.0/0 --> igw-04b6aa7c
'lambda_rt_table_gateway' 路线 table 与主要路线相同。
'lambda_rt_table_nat'路线table也有相同的路线,除了最后一条是
0.0.0.0/0 --> nat-0a5c0a76e3c12c42f
我很确定我缺少的是简单的东西。请帮忙
非常感谢。
您配置了很多东西!我不确定其中有多少是想要修复这种特定情况的一部分,或者您是否对 NAT 网关、VPC 端点等有其他需求
启用连接 VPC 的 Lambda 函数调用 Internet(例如,API 调用 Amazon S3)的最简单设置是:
- 将 NAT 网关 添加到 Public 子网
- 将 Lambda 函数附加到 私有子网
- 在私有子网上设置路由以使用
0.0.0.0/0
的 NAT 网关
这足以让 VPC 附加的 Lambda 函数访问互联网。
我在 lambda 中有一个非常简单的 python 函数,如果我禁用 VPC,它运行良好。
import json
import boto3
import botocore
def lambda_handler(event, context):
s3 = boto3.client('s3', 'us-east-1',
config=botocore.config.Config(s3={'addressing_style': 'path'}))
keys = []
resp = s3.list_objects_v2(Bucket='[BUCKET_NAME]')
for obj in resp['Contents']:
print(obj['Key'])
return {
'statusCode': 200,
'body': json.dumps('Hello from Lambda!')
}
启用 VPC 后,S3 连接不断超时。
我浏览了许多文档、教程、论坛主题和堆栈溢出帖子,但其中 none 对我有所帮助。
我的网络 ACL 具有端口 80、443 和 5439 (Redshift) 的 0.0.0.0/0 映射。
我唯一的一个安全组具有端口 80、443 和 5439 (Redshift) 的 0.0.0.0/0 映射。
我只配置了一个VPC。
我配置了 1 个 NAT 网关。
我配置了 1 个 Internet 网关。
我在 VPC 中有 6 个子网:
- 子网A和B指向主路由table.
- 子网 C 和 D 指向 'lambda_rt_table_gateway' 路由 table。
- 子网 E 和 F 指向 'lambda_rt_table_nat' 路由 table。
我在 VPC 中有 2 个端点:
- 端点 VPCE-A 是为服务 'com.amazonaws.us-east-1.s3' 定义的,并映射到所有 3 条路由 table。
- 端点 VPCE-B 是为服务 'com.amazonaws.us-east-1.dynamodb' 定义的,并映射到所有 3 条路由 table。
最后,我有 3 个路由表:
主要路线table有以下路线:
172.31.0.0/1 --> 本地
pl-02cd2c6b (com.amazonaws.us-east-1.dynamodb, 52.94.0.0/22, 52.119.224.0/20) --> vpce-07a6eb423bbbea151
pl-63a5400a (com.amazonaws.us-east-1.s3, 54.231.0.0/17, 52.216.0.0/15) --> vpce-0fd10c890bb176b5a
0.0.0.0/0 --> igw-04b6aa7c
'lambda_rt_table_gateway' 路线 table 与主要路线相同。
'lambda_rt_table_nat'路线table也有相同的路线,除了最后一条是
0.0.0.0/0 --> nat-0a5c0a76e3c12c42f
我很确定我缺少的是简单的东西。请帮忙
非常感谢。
您配置了很多东西!我不确定其中有多少是想要修复这种特定情况的一部分,或者您是否对 NAT 网关、VPC 端点等有其他需求
启用连接 VPC 的 Lambda 函数调用 Internet(例如,API 调用 Amazon S3)的最简单设置是:
- 将 NAT 网关 添加到 Public 子网
- 将 Lambda 函数附加到 私有子网
- 在私有子网上设置路由以使用
0.0.0.0/0
的 NAT 网关
这足以让 VPC 附加的 Lambda 函数访问互联网。