[英]Lambda in VPC access RDS
我正在尝试制作一个 lambda,它将按计划关闭 RDS 实例。 我把我的 lambda 放在我的 VPC 中,因为我认为它不需要 Inte.net 访问。 但是,我正在尝试使用 boto3 访问实例,但出现错误。
rds = boto3.client('rds')
dbs = rds.describe_db_instances()
def lambda_handler(event, context):
try:
# get all of the db instances
for db in dbs['DBInstances']:
print ("%s@%s:%s %s") % (
db['MasterUsername'],
db['Endpoint']['Address'],
db['Endpoint']['Port'],
db['DBInstanceStatus'])
except Exception as e:
print(e)
但是,当 boto3 尝试连接 RDS 时,出现此错误。
[ERROR] ConnectTimeoutError: Connect timeout on endpoint URL: "https://rds.us-east-
2.amazonaws.com/"
在我看来,这就像 boto3 试图在 inte.net 上调用 URL。 分不清是lambda出不来VPC还是怎么的。 有没有办法只到达 AWS 内部并到达实例?
如果您出于额外的安全性(或其他原因)确实希望您的 Lambda 在 VPC 中,我可以想到两种连接到 RDS 的选项:1)使其能够访问公共 inte.net; 或 2) 使其在不离开 AWS 网络的情况下连接到 RDS。 您甚至可以根据您的用例使用两者(我将在稍后解释差异)。
对于这两种解决方案,首先您需要确定哪个su.net和安全组链接到您的 lambda:
接下来,go 到 EC2 服务,在Network & Security下找到Public IPs菜单。 为每个su.net分配一个IP(上例中有两个su.net)。
Go 到网络接口菜单,找到附加到您的 lambda 的.network 接口(相同的 su.net 和安全组)。
在每个操作菜单中关联公共 IP:
Go 到控制台中的 VPC Service,打开Virtual private cloud下的Endpoints菜单选项。 单击顶部的创建端点按钮。
选择您要连接的 AWS 服务(例如 RDS、S3、Secrets Manager),select 您的 lambda 所在的 VPC:
Select su.nets(基于 AZ)和安全组您的 lambda 链接到:
为您的 Lambda 需要访问的每个 AWS 服务执行此操作(例如 RDS、S3 等)。
您的 Lambda 在 VPC 内时无法访问 public inte.net,因此您无法从外部服务/API 获取数据,其中包括大多数 AWS 服务,因为连接是通过 public inte.net 建立的。
解决方案 1 将使您的 Lambda 能够再次访问 public inte.net,这很方便。
解决方案 2 将使您的 Lambda 能够在不离开 AWS 网络的情况下连接到 AWS 服务,从而减少延迟并提高安全性。
如果您的 lambda 只需要访问 RDS 和一些其他 AWS 服务,您可以使用解决方案 2 go。如果您的 lambda 需要访问外部 API(与 AWS 无关),您需要解决方案 1,但即使在那种情况下您也可以混合使用它们并使用解决方案 2 以获得更好的安全性和减少延迟,因此您可以同时使用两者。
您不应将 AWS Lambda function 附加到 VPC,因为它不需要访问 VPC 中的任何资源。
对 Amazon RDS 服务进行的 API 调用被发送到 Internet 上的终端节点,而不是 VPC 内。 然后,Amazon RDS 服务将打开/关闭数据库。
通过不为 Lambda function 指定 VPC,它将直接访问 Internet,并且调用将成功。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.