GitHub Actions中Terraform跨私有仓库模块调用的认证授权及引用规范问题
GitHub Actions中Terraform跨私有仓库模块调用的认证授权及引用规范问题
我来帮你梳理下这个Terraform跨私有仓库模块调用在GitHub Actions里遇到的问题,分模块引用规范、SSH密钥配置(包括部署密钥的正确用法)两个核心部分给你讲清楚:
一、私有仓库Terraform模块的正确引用规范
Terraform引用GitHub私有仓库模块有两种主流方式,你之前的问题里SSH引用格式出错了,先纠正这个:
1. HTTPS格式(GitHub Actions里更省心的默认选择)
你最初用的格式其实是没问题的:
module "databases" { source = "github.com/myorg/RepoC//" }
本地执行时会自动触发SSH/HTTPS认证(你被3次询问密钥就是走了SSH认证链),但GitHub Actions里没有默认认证信息,所以才会报Could not read Username for 'https://github.com',后续配好PAT就能解决。
2. SSH格式(注意用户名必须是git,不是组织名)
你之前改成git::ssh://myorg@github.com/RepoC//是错误的——GitHub的SSH访问固定用git作为用户名,正确格式应该是:
module "databases" { source = "git::ssh://git@github.com/myorg/RepoC//" }
你本地测试失败就是因为用了myorg@,GitHub SSH服务器不认这个用户名,自然会触发权限拒绝。
二、GitHub Actions中认证授权的正确处理方式
1. 部署密钥的正确用法(你之前搞反了逻辑)
部署密钥的核心逻辑是:被访问的仓库(B、C)添加公钥,发起访问的环境(A的GitHub Actions流水线)持有私钥,具体步骤:
- 生成一对无密码的SSH密钥(Actions里没法手动输入密码):
ssh-keygen -t ed25519 -C "terraform-module-access" -f terraform-modules-key - 把公钥(
terraform-modules-key.pub)分别添加到Repo B和Repo C的部署密钥中:
进入仓库Settings → Deploy keys → Add deploy key,粘贴公钥内容,按需勾选「Allow write access」(仅拉取模块的话不勾选也可以)。 - 把私钥(
terraform-modules-key)添加到Repo A的GitHub Secrets中,命名比如TERRAFORM_MODULE_SSH_KEY。 - 在GitHub Actions的Workflow文件中,用
ssh-agent加载私钥:
这样Terraform用正确的SSH格式拉取B、C模块时,ssh-agent会自动用私钥完成认证,不会再报权限错误。steps: - name: Checkout Repo A uses: actions/checkout@v4 - name: Setup SSH Agent uses: webfactory/ssh-agent@v0.8.0 with: ssh-private-key: ${{ secrets.TERRAFORM_MODULE_SSH_KEY }} - name: Setup Terraform uses: hashicorp/setup-terraform@v3 - name: Terraform Init run: terraform init
2. 本地测试SSH引用的正确姿势
本地测试时,需要把生成的私钥添加到本地SSH agent中:
ssh-add ~/path/to/terraform-modules-key
然后用正确的SSH格式引用模块,执行terraform init就不会报错,也不会重复提示输入密钥(ssh-agent会自动处理)。
三、替代方案:用Personal Access Token(PAT)通过HTTPS认证
如果觉得SSH密钥配置麻烦,也可以用PAT做HTTPS认证,步骤更简单:
- 生成一个PAT,权限至少勾选
repo(确保能访问私有仓库)。 - 把PAT添加到Repo A的GitHub Secrets中,命名比如
TERRAFORM_GITHUB_PAT。 - 在Terraform Init步骤前设置环境变量:
这样Terraform用默认的HTTPS格式引用模块时,会自动用这个PAT完成认证,不需要修改任何模块引用代码。- name: Terraform Init run: terraform init env: GITHUB_TOKEN: ${{ secrets.TERRAFORM_GITHUB_PAT }}
备注:内容来源于stack exchange,提问作者Wolfgang
相关产品推荐
相关产品推荐

