如何避免重复部署用户池栈,获取Cognito UserPool ID?求优化方案
优化方案:避免重复部署Cognito用户池栈
方案1:利用CDK依赖检测,仅部署目标栈
若栈1和栈2在同一CDK应用中,且栈2通过代码直接引用栈1资源(如stack1.userPool),CDK会自动管理栈间依赖。优化流程:
- 部署栈1并导出UserPool ID:
cdk deploy Stack1 --outputs-file outputs.json - 解析
outputs.json,将UserPool ID注入NextJS构建环境,完成前端构建 - 仅部署栈2:
cdk deploy Stack2 --exclusively
CDK会检测到栈1已部署且无变更,不会重复执行栈1的部署操作。核心是用--exclusively参数限定部署范围,避免默认部署所有栈。
方案2:通过SSM参数存储解耦栈间依赖
将UserPool ID存入AWS Systems Manager (SSM) 参数存储,让栈2和前端构建通过SSM读取ID,彻底解除栈1与栈2的CDK代码依赖:
- 在栈1的CDK代码中,添加逻辑将UserPool ID写入SSM:
import * as ssm from 'aws-cdk-lib/aws-ssm'; import * as cognito from 'aws-cdk-lib/aws-cognito'; const userPool = new cognito.UserPool(this, 'UserPool'); new ssm.StringParameter(this, 'UserPoolIdParam', { parameterName: '/my-app/auth/userPoolId', stringValue: userPool.userPoolId, }); - 前端构建时,通过AWS CLI读取SSM参数:
export USER_POOL_ID=$(aws ssm get-parameter --name "/my-app/auth/userPoolId" --query "Parameter.Value" --output text) npm run build - 栈2的CDK代码中直接从SSM读取参数,无需依赖栈1:
const userPoolId = ssm.StringParameter.fromStringParameterName(this, 'UserPoolIdParam', '/my-app/auth/userPoolId').stringValue; // 用userPoolId配置Lambda@Edge和NextJS部署
栈1只需部署一次,后续部署栈2或重新构建前端时,直接从SSM读取ID即可,不会触发栈1重复部署。
方案3:使用CDK Context传递UserPool ID
借助CDK的Context机制存储UserPool ID,供前端构建和栈2部署读取:
- 部署栈1获取ID后,存入CDK Context:
cdk context set my-app:userPoolId <实际UserPool ID> - 前端构建时读取Context值:
export USER_POOL_ID=$(cdk context get my-app:userPoolId) npm run build - 栈2的CDK代码中通过Context获取ID:
const userPoolId = this.node.tryGetContext('my-app:userPoolId'); // 后续配置逻辑
此方案无需额外服务依赖,仅通过CDK自身机制实现参数传递,同样能避免栈1重复部署。
内容的提问来源于stack exchange,提问作者Ben Wainwright
相关产品推荐
相关产品推荐

