如何在CDK脚本中获取MemoryDB集群的端点/端口/凭证?
问题:CDK中正确获取MemoryDB集群端点、端口作为环境变量的方法
我通过如下代码定义了一个MemoryDB集群:
const memorydb_cluster = new CfnCluster(this, 'memorydb', { aclName: 'open-access', clusterName: 'redis-cluster', nodeType: 'db.t4g.medium', autoMinorVersionUpgrade: false, engineVersion: '7.0', numShards: 1, numReplicasPerShard: 0, securityGroupIds: [ecSecurityGroup.securityGroupId], subnetGroupName: groupName, tlsEnabled: true, });
我希望将该集群的端点、端口及凭证作为环境变量用于其他依赖构造中。目前尝试了两种方式获取端点和端口:
方式一:
const redisUrl = memorydb_cluster.attrClusterEndpointAddress; const redisPort = memorydb_cluster.attrClusterEndpointPort;
方式二:
const redisUrl = cdk.Stack.of(memorydb_cluster).resolve(memorydb_cluster.attrClusterEndpointAddress); const redisPort = cdk.Stack.of(memorydb_cluster).resolve(memorydb_cluster.attrClusterEndpointPort);
但得到的结果分别为类似${Token[TOKEN.694]}(端点)和-1.8881545897089002e+289(端口)的Token值,请问如何在CDK脚本中正确获取这些值?
解答
这是CDK的Token机制导致的正常现象:attrClusterEndpointAddress和attrClusterEndpointPort本质是CloudFormation的动态引用,这些值只有在部署阶段由AWS CloudFormation生成,合成阶段(编写CDK代码时)无法拿到具体的字符串/数值。
不需要手动调用resolve处理,直接将这些属性值赋值给环境变量即可,CDK会在生成CloudFormation模板时保留这些引用,部署时自动替换为实际的端点和端口值。
正确示例(以Lambda函数为例)
// 假设你要给Lambda函数设置环境变量 const myLambda = new lambda.Function(this, 'MyDependentLambda', { runtime: lambda.Runtime.NODEJS_18_X, handler: 'index.handler', code: lambda.Code.fromAsset('lambda'), // 直接将Token属性赋值给环境变量 environment: { REDIS_ENDPOINT: memorydb_cluster.attrClusterEndpointAddress, REDIS_PORT: memorydb_cluster.attrClusterEndpointPort, }, });
关于凭证的处理
如果你的MemoryDB集群使用了需要凭证的ACL(非open-access),可以通过以下方式传递凭证:
- 创建
CfnUser并关联到ACL,将用户的密码存储在Secrets Manager中 - 将Secrets Manager的ARN或引用作为环境变量传递给依赖构造,在运行时从Secrets Manager获取凭证
内容的提问来源于stack exchange,提问作者Verbal_Kint
相关产品推荐
相关产品推荐

