Terraform搭建Cognito认证SageMaker私有工作团队循环依赖问题
循环依赖问题根因
你遇到的循环依赖来自两个资源的互相引用:
aws_sagemaker_workforce资源的Cognito配置需要先获取aws_cognito_user_pool_client的ID- 新增OAuth配置后,
aws_cognito_user_pool_client需要引用aws_sagemaker_workforce的子域名作为回调地址,导致两个资源都等待对方先创建完成
解决方案
推荐使用预拼接回调地址的方案,可实现单次apply完成部署,无需分阶段操作:
SageMaker Workforce的回调地址格式是固定的,不需要等资源创建完成再获取,规则为:https://<你的workforce名称>.<AWS区域>.labeling.sagemaker.aws/oauth2/idpresponse
操作步骤
- 新增数据源获取当前AWS区域(避免硬编码区域)
data "aws_region" "current" {}
- 修改Cognito用户池客户端配置,直接拼接回调地址,无需引用
aws_sagemaker_workforce的输出属性
resource "aws_cognito_user_pool_client" "congnito_client" { name = "congnito-client" generate_secret = true user_pool_id = aws_cognito_user_pool.user_pool.id # 新增OAuth配置 allowed_oauth_flows = ["code", "implicit"] allowed_oauth_scopes = ["email", "openid", "profile"] # 预拼接回调地址,和SageMaker自动生成的地址完全一致 callback_urls = ["https://workforce.${data.aws_region.current.name}.labeling.sagemaker.aws/oauth2/idpresponse"] }
如果你的aws_sagemaker_workforce的workforce_name不是默认的workforce,替换回调地址中对应位置的名称即可。
这个方案配置的回调地址和SageMaker默认自动添加的地址完全一致,不会出现配置冲突,也符合你不需要手动修改回调规则的需求。
备选临时方案
如果不想修改地址拼接逻辑,也可以分两次apply完成配置:
- 第一次apply:保持初始配置,不添加OAuth和
callback_urls参数,完成Cognito客户端和SageMaker Workforce的创建 - 第二次apply:添加OAuth配置和
callback_urls = [aws_sagemaker_workforce.workforce.subdomain]参数,此时两个资源已存在,不会触发循环依赖校验
内容的提问来源于stack exchange,提问作者chagan lal
相关产品推荐
相关产品推荐

