在无服务器框架中创建可用于 Lambda 函数的 RDS 实例
Create an RDS instance available to Lambda functions in Serverless Framework
我有一个通过无服务器框架部署的 AWS Lambda 应用程序。它需要一个数据库,即我在 serverless.yaml 的 resources
部分中包含的 CloudFormation。
在对 VPC、子网和安全组知之甚少的情况下,我的目标如下:
- Create/update 具有
serverless deploy
的 MySQL RDS 实例。
- Lambda 应用程序中的函数应该能够访问数据库。
- 数据库应该可以通过密码公开访问,这样我就可以从我的计算机上使用 MySQL 工具(例如 Sequel Ace)进行连接。
到目前为止我尝试过的:
我已经尝试使用以下无服务器配置。它创建了数据库,但它不满足#2 和#3。
我也尝试将 serverless.yaml 中的 provider.vpc.securityGroupIds
和 provider.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)
我有一个通过无服务器框架部署的 AWS Lambda 应用程序。它需要一个数据库,即我在 serverless.yaml 的 resources
部分中包含的 CloudFormation。
在对 VPC、子网和安全组知之甚少的情况下,我的目标如下:
- Create/update 具有
serverless deploy
的 MySQL RDS 实例。 - Lambda 应用程序中的函数应该能够访问数据库。
- 数据库应该可以通过密码公开访问,这样我就可以从我的计算机上使用 MySQL 工具(例如 Sequel Ace)进行连接。
到目前为止我尝试过的:
我已经尝试使用以下无服务器配置。它创建了数据库,但它不满足#2 和#3。
我也尝试将 serverless.yaml 中的 provider.vpc.securityGroupIds
和 provider.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)