如何使用与lambda临时连接的AWS-CDK(java或打字稿)创建Aurora无服务器数据库集群?

时间:2019-03-06 08:30:12

标签: aws-serverless aws-aurora aws-cdk

我正在寻找一个示例,以创建一个使用新的AWS-CDK(基于Java或打字稿)创建的Aurora Serverless数据库集群。另外,该示例还应使用与数据库集群的连接来创建lambda函数,并查询一些数据。

2 个答案:

答案 0 :(得分:1)

我的第一个尝试是使用

software.amazon.awscdk.services.rds.DatabaseCluster

例如

DatabaseCluster databaseCluster = new DatabaseCluster(this, "myDbCluster",
    DatabaseClusterProps.builder()
        .withEngine(DatabaseClusterEngine.Aurora)

但是根据cloudformation,您必须将属性engineMode设置为serverless。 CDK版本0.24.1不支持属性engineMode ist。另请参见open cdk问题929

该解决方法是使用software.amazon.awscdk.services.rds.CfnDBCluster创建构造。查看示例代码:

new CfnDBCluster(this, "myDBCluster", CfnDBClusterProps.builder()
    .withEngine("aurora")
     .withEngineMode("serverless")
    .withPort(3306)
    .withMasterUsername("masterUserName")
    .withMasterUserPassword("***********************")
    .withScalingConfiguration(ScalingConfigurationProperty.builder()
        .withAutoPause(true)
        .withMinCapacity(2)
        .withMaxCapacity(16)
        .withSecondsUntilAutoPause(300)
        .build())
    .build());

另请参阅:

Creating an Aurora Serverless Cluster from cloudformation?

AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbcluster.html

https://awslabs.github.io/aws-cdk/refs/_aws-cdk_aws-rds.html

答案 1 :(得分:1)

我知道您要求使用Java或TypeScript示例,但是我的母语是Python,因此我只为您提供Python示例。 Amazon文档确实提供了有关如何将CDK代码从一种语言“翻译”为另一种语言的更多详细信息-这非常简单。参见https://docs.aws.amazon.com/cdk/latest/guide/multiple_languages.html

下面的示例使用PostgreSQL引擎创建Aurora集群。它使用从(先前创建的)SSM安全字符串参数中检索到的密码创建一个管理员用户('admin')。它还在群集中创建一个名为“ MyDatabase”的初始数据库。

(假设)处理程序的代码已经在lambda-handler.py中,它还会(首先)创建一个Lambda,将其放入安全组中,并确保Aurora将数据库端口公开给lambda安全组。

所有这些都是在VPC的上下文中进行的。

代码如下:

from aws_cdk import aws_ec2 as ec2
from aws_cdk import aws_rds as rds
from aws_cdk import aws_lambda as lambda_
from aws_cdk import core


class DataProcessingRTStack(core.Stack):
    def __init__(self, scope: core.Construct, id: str, **kwargs) -> None:
        super().__init__(scope, id, **kwargs)

        vpc = ec2.Vpc.from_lookup(self, 'VPC', vpc_name="my_vpc")

        lambda_sg = kwargs.pop('lambda_sg', None)

        with open("lambda-handler.py", encoding="utf8") as fp:
            handler_code = fp.read()

        lambda_fn = lambda_.Function(
            self, "DB_Lambda",
            code=lambda_.InlineCode(handler_code),
            handler="index.main",
            timeout=core.Duration.seconds(300),
            runtime=lambda_.Runtime.PYTHON_3_7,
            security_group=lambda_sg,
        )

        aurora_sg = ec2.SecurityGroup(
            self, 'AUPG-SG',
            vpc=vpc,
            description="Allows PosgreSQL connections from Lambda SG",
        )
        aurora_cluster = rds.DatabaseCluster(
            self, "AUPG-CLUSTER-1",
            engine=rds.DatabaseClusterEngine.AURORA_POSTGRESQL,
            engine_version="10.7",
            master_user=rds.Login(
                username='admin', 
                password=core.SecretValue.ssm_secure('AUPG.AdminPass', version='1'),
            ),
            default_database_name='MyDatabase',
            instance_props=rds.InstanceProps(
                instance_type=ec2.InstanceType.of(
                    ec2.InstanceClass.MEMORY5, ec2.InstanceSize.XLARGE,
                ),
                vpc=vpc,
                security_group=aurora_sg,
            ), 
            parameter_group=\
                rds.ClusterParameterGroup.from_parameter_group_name(
                self, "AUPG-ParamGroup-1",
                parameter_group_name="default.aurora-postgresql10",
            )
        )
        aurora_cluster.connections.allow_from(
            connectors_sg, ec2.Port.tcp(3306),
            "Allow MySQL access from Lambda (because Aurora actually exposes PostgreSQL on port 3306)",
        )