首页 > 解决方案 > 在无服务器框架中创建可用于 Lambda 函数的 RDS 实例

问题描述

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

在对 VPC、子网和安全组了解最少的情况下,我的目标如下:

  1. 使用 s 创建/更新 MySQL RDS 实例serverless deploy
  2. Lambda 应用程序中的函数应该能够访问数据库。
  3. 该数据库应该可以通过密码公开访问,因此我可以从我的计算机连接 MySQL 工具,如 Sequel Ace。

到目前为止我已经尝试过:

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

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

无服务器.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

标签: aws-lambdaamazon-rdsserverless-frameworkamazon-vpcaws-serverless

解决方案


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

为了让您的 Lambda 能够访问您的 AWS 资源,它需要位于同一个 VPC 中,并且其执行角色需要通过 IAM 角色/组具有适当的权限。

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

这将为您提供要求的第 1 步和第 2 步。

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

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

推荐阅读