使用Git子模块导入私有仓库Terraform模块遇权限问题及解决
Terraform拉取含Git子模块的私有仓库模块权限问题解决
问题场景
- 需从私有GitHub仓库
repo2导入Terraform模块,模块配置代码:
module "ecr_repos" { for_each = local.ecr_repos source = "git@github.com:gitaccount/repo2.git//terraform/modules/ecr" name = each.key }
repo2包含第三方私有仓库repo3的Git子模块,该子模块目录未被Terraform模块使用- 本地通过SSH密钥可正常执行
terraform init,但在GitHub Workflow及本地Docker容器中执行失败 - 已注入非临时的
GITHUB_TOKEN环境变量,执行命令如下:
git config --global url."https://oauth2:$GITHUB_TOKEN@github.com".insteadOf ssh://git@github.com terraform init
- 报错现象:
repo2已下载到.terraform目录,但无法拉取repo3子模块,提示权限拒绝;直接用GITHUB_TOKEN克隆repo2可成功获取子模块 - 限制条件:不想通过添加SSH密钥到
~/.ssh的方式解决问题
解决方法
问题根源是Git子模块的URL格式与原替换规则不匹配,repo2的.gitmodules文件中子模块定义为url = git@github.com:gitaccount/repo3.git,需在terraform init前执行以下Git配置命令:
git config --add --global url."https://oauth2:$GITHUB_TOKEN@github.com/".insteadOf "git@github.com:"
关键注意点:
- HTTPS URL末尾的
/和SSH URL后的:是匹配成功的核心 - 原规则仅替换
ssh://git@github.com格式,但子模块使用的是git@github.com:格式(无ssh://前缀),因此需要针对该格式单独配置替换规则,同时HTTPS地址末尾加/确保路径拼接正确
内容的提问来源于stack exchange,提问作者Stan B
相关产品推荐
相关产品推荐

