typescript - 创建 RDS 实例后运行 AWS CDK 自定义资源以进行数据库设置

标签 typescript amazon-web-services aws-lambda aws-cdk aws-cloudformation-custom-resource

RDS 实例启动后如何使用 AWS CDK 触发 Lambda 函数?

我正在使用 AWS CDK 和 Typescript 设置具有 RDS 实例和 EKS 集群的系统。创建 RDS 实例后,我想在数据库实例中设置一些用户以供 EKS 上的微服务使用。

我为此创建了一个由 Lambda 函数支持的自定义资源,该资源也在 Typescript 中实现。 lambda 函数检索 CDK 为 RDS 实例生成的 key 以及我的数据库用户的一些 key ,连接到数据库并创建数据库用户。理想情况下,自定义资源在数据库实例启动之后、微服务安装之前运行。我怎样才能实现这个目标?

我还没有找到显式声明依赖项的方法,并且我的 Lambda 在技术上不需要依赖项(除了使用 secret.grantRead(lambda))。由于创建时间较长,仅在 Lambda 中运行重试循环直到一切就绪可能无法正常工作。任何代码片段/示例/...非常感谢,到目前为止我只找到了有关一般方法的引用。

更新回复@jogold的详细信息:与

    const database = new rds.DatabaseInstance(this, 'db', {
      instanceIdentifier: conf.systemName,
      engine: rds.DatabaseInstanceEngine.POSTGRES,
      instanceType: ec2.InstanceType.of(ec2.InstanceClass.BURSTABLE3, ec2.InstanceSize.MICRO),
      masterUsername: MASTER_USER,
      allocatedStorage: 20, maxAllocatedStorage: 100,
      multiAz: conf.isProduction,
      storageEncrypted: true,
      backupRetention: cdk.Duration.days(7),
      deletionProtection: false, 
      vpc, securityGroups: [ rdsSG ]
    });

CDK 将生成一个带有一些或多或少随机名称的 secret ,以及数据库的访问凭据。我尝试将 secret 直接附加到我的 Lambda:

    new cdk.CustomResource(this, 'preinstall', { 
      serviceToken: preinstallProvider.serviceToken,
      properties: { secret: database.secret }
    });

但这给了我

    Error: Resolution error: Resolution error: Trying to resolve() a Construct at /Resources/${Token[td000.preinstall.Default.LogicalID.221]}/Properties/dbSecret/node/_actualNode.

此外,接口(interface) ISecret 似乎没有 key 的 ID/名称,因此我不知道如何在 Lambda 中处理它。

最佳答案

CDK 通常会尝试为您猜测依赖项并确保它们以正确的顺序创建。如果这不起作用(如您的示例中),您可以明确声明一个资源依赖于另一个资源。例如:

const customResource = new cdk.CustomResource(this, 'preinstall', { 
  serviceToken: preinstallProvider.serviceToken,
  properties: { secret: database.secret }
});

customResource.node.addDependency(database);

有关更多详细信息,请参阅文档 https://docs.aws.amazon.com/cdk/api/latest/docs/core-readme.html#construct-dependencies

关于typescript - 创建 RDS 实例后运行 AWS CDK 自定义资源以进行数据库设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62635318/

相关文章:

apache - 在 AWS 服务器上安装 Apache 后,我无法再 SSH

c# - 在 AWS CDK 中使用常量 JSON 参数创建规则 (C#)

amazon-web-services - AWS - {lambda 函数} 可能未定义授权

javascript - 使用模块编译 Typescript 以在浏览器中运行

javascript - 将日期更改为 00 :00:00 format

typescript - 更干净的功能重载,无需复制不改变的部分

docker - 在Mac OS X上通过 `-it`命令提取图像后如何进入docker容器?

typescript - 如何映射联合数组类型?

amazon-web-services - 使用 cloudformation 在 Elastic Beanstalk 上启动 docker 多容器

amazon-web-services - 来自 Lambda 的 AWS Secrets Manager 调用返回 null/none