【发布时间】:2020-10-19 10:48:50
【问题描述】:
如何在 RDS 实例启动后使用 AWS CDK 触发 Lambda 函数?
我正在使用 AWS CDK 和 Typescript 设置具有 RDS 实例和 EKS 集群的系统。创建RDS实例后,我想在数据库实例中设置一些用户供EKS上的微服务使用。
为此,我创建了一个由 Lambda 函数支持的自定义资源,也在 Typescript 中实现。 lambda 函数检索 CDK 为 RDS 实例生成的秘密以及我的数据库用户的一些秘密,连接到数据库并创建数据库用户。理想情况下,自定义资源在数据库实例启动之后和微服务安装之前运行。我怎样才能做到这一点?
我还没有找到显式声明依赖项的方法,而且我的 Lambda 在技术上不需要依赖项(使用 secret.grantRead(lambda) 除外)。由于创建时间长,仅在 Lambda 中运行重试循环直到一切就绪可能无法正常工作。任何代码 sn-ps/examples/... 非常感谢,到目前为止我只找到了有关一般方法的参考。
更新回复@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 将使用数据库的访问凭据生成一个具有或多或少随机名称的密钥。我尝试将秘密直接附加到我的 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.
另外,界面 ISecret 似乎没有密钥的 ID/名称,所以我不知道在 Lambda 中如何处理它。
【问题讨论】:
-
RDS和你的CR之间没有“明确声明依赖的方式”是什么意思?如果您不想使用 DependsOn(或 CDK 等效项),那么您的 CR 中对 RDS 资源的任何引用(例如 rds 名称)都会创建一个依赖项。
-
您的 Lambda 函数依赖于哪个密钥?它应该引用“附加”的秘密。你能分享一些代码吗?
-
@Marcin 我认为这就是问题所在......我不知道 CDK 相当于“DependsOn”是什么。我已经搜索了 CDK 文档,但找不到任何东西。我正在向秘密添加权限,不确定这是否算作依赖。
-
@jogold 我在 Lambda 函数中使用 listSecrets 查询秘密。我还没有找到附加秘密的方法。我只能将 describeSecret() 或 getSecretValue() 与秘密 ID/名称一起使用。但是,如果我让 AWS 开发工具包在不提供硬编码密码的情况下创建 RDS 实例,我不会得到返回的密钥 ID。
标签: typescript amazon-web-services aws-lambda aws-cdk aws-cloudformation-custom-resource