在无服务器框架中创建可用于 Lambda 函数的 RDS 实例

Create an RDS instance available to Lambda functions in Serverless Framework

我有一个通过无服务器框架部署的 AWS Lambda 应用程序。它需要一个数据库,即我在 serverless.yaml 的 resources 部分中包含的 CloudFormation。

在对 VPC、子网和安全组知之甚少的情况下,我的目标如下:

  1. Create/update 具有 serverless deploy 的 MySQL RDS 实例。
  2. Lambda 应用程序中的函数应该能够访问数据库。
  3. 数据库应该可以通过密码公开访问,这样我就可以从我的计算机上使用 MySQL 工具(例如 Sequel Ace)进行连接。

到目前为止我尝试过的:

我已经尝试使用以下无服务器配置。它创建了数据库,但它不满足#2 和#3。

我也尝试将 serverless.yaml 中的 provider.vpc.securityGroupIdsprovider.vpc.subnetIds 设置为 RDS 实例使用的相同设置,但无济于事。

serverless.yaml

(相关章节)

service: myapp

provider:
    name: aws
    runtime: provided.al2
    lambdaHashingVersion: 20201221

functions:
    console:
        handler: bin/console
        timeout: 120 # in seconds
        layers:
            - ${bref:layer.php-80} # PHP
            - ${bref:layer.console} # The "console" layer

resources:
    Resources:
        # RDS instance
        ProductDatabase:
            Type: AWS::RDS::DBInstance
            Properties:
                AllocatedStorage: 5
                DBInstanceClass: db.t3.micro
                DBName: myapp
                Engine: mysql
                EngineVersion: 8.0.25
                MasterUsername: myappuser
                MasterUserPassword: redacted
                PubliclyAccessible: true

有一篇很好的文章 here 解释了您需要的步骤。

为了让您的 Lambda 能够访问您的 AWS 资源,它需要位于同一 VPC 内,并且其执行角色需要通过 IAM Roles/Groups.

获得适当的权限

您还想避免让您的 RDS 向全世界开放,因此您应该在 VPC 内创建所有这些。您可以将 lambda 函数附加到 VPC,然后通过安全组仅允许 VPC 子网访问 RDS。

这将帮助您完成第 1 步和第 2 步的要求。

在同一个安全组中,您可以允许访问您计算机的外部 IP 地址以执行第 3 步。您可以通过 CLI 进行配置,这样如果您没有静态 IP,只需一秒钟即可完成添加。下面的 PowerShell 示例:

Grant-EC2SecurityGroupIngress -GroupId "sg-xxxxxxxxxx" -IpPermission @(123.123.123.123/32)