使用 sam 时如何将 lambda 连接到可在 Mac 本地主机上本地访问的数据库

blu*_*e13 5 amazon-web-services amazon-rds docker aws-lambda aws-sam-cli

背景

  • 我有一个连接到 RDS 数据库的 lambda。RDS 数据库和 lambda 位于 VPC 中。开发人员只能通过 Bastion 实例访问该数据库。
  • 在开发过程中,我们可以使用sam测试 lambda 。这对于不依赖于数据库的 API 来说效果很好。
  • 对于依赖于数据库的 API,我理想情况下希望连接到在 Gamma 阶段运行的数据库实例。但是,我们无法直接连接到它,因为它位于 VPC 中。

我尝试过的

  • 为了解决这个问题,我们可以在堡垒实例上使用带有端口转发的 SSM 代理,以便可以在 Mac 的本地主机上访问数据库。参见说明。示例代码如下:
aws ssm start-session --target <instance-id> --document-name AWS-StartPortForwardingSessionToRemoteHost --parameters host="mydb.example.us-east-2.rds.amazonaws.com",portNumber="3306",localPortNumber="3306"
Run Code Online (Sandbox Code Playgroud)
  • 我现在可以通过 CLI 或像Psequelhttp://127.0.0.1:3306/这样的 GUI在本地连接到它。无需使用 SSH。
  • 但是,如果我尝试让 lambda 连接到http://127.0.0.1:3306/,则会收到错误Connection refused
  • 我的理解是,这是因为127.0.0.1解析为 docker 容器的本地主机而不是我机器的本地主机。
  • 根据码头工人文档host.docker.internal ... resolves to the internal IP address used by the host
  • 但是,如果我尝试让 lambda 连接到http://host.docker.internal:3306/,则会收到错误Name or service not known

最小工作示例

我在https://github.com/bluprince13/sam-app-connect-to-host-localhost创建了一个 MWE 。我们可以在本地运行一个 Python 服务器,然后尝试让 lambda 连接到它,而不是尝试连接到数据库。

问题

  • 使用 sam 时,如何将 lambda 连接到可在 Mac 本地主机上本地访问的数据库?
  • 我愿意接受任何在本地测试 lambda 的替代方案。即使使用cdk hotswap ,部署到 AWS 也太痛苦了。

参考

use*_*461 4

提供的 MWE 看起来配置正确。问题出在 docker 配置上。正如OP所指出的,配置中有一个覆盖。dns(Docker -> 首选项 -> Docker 引擎)被覆盖。删除后,一切正常host.docker.internal

一般来说,要从容器连接到主机的本地主机,您必须host.docker.internalmacwindows中使用。有关其他平台中的配置,请参阅 SO帖子。针对 macOS 中的 SAM,建议具有以下内容,以避免参数硬编码:

  1. 在您的资源属性下创建一个Environment变量template.yaml

  Properties:
     Environment:
       Variables:
         DB_HOST: *your_database_url*
Run Code Online (Sandbox Code Playgroud)
  1. env.json使用以下配置创建一个文件。
   {
    "*Logical_ID of your resource*": {
        "DB_HOST": "host.docker.internal"
     }
   }    
Run Code Online (Sandbox Code Playgroud)
  1. 使用 as 运行您的env.jsonSAM sam local invoke --env-vars env.json