GitHub Action与Terraform集成时出现Permission denied权限问题
问题分析与解决方案
核心原因
你遇到的权限问题本质是认证协议不匹配:
- 本地使用SSH密钥完成认证,对应模块源的
git@github.com格式(SSH协议),所以能正常拉取模块; - 你在GitHub Action中配置的
GITHUB_TOKEN是HTTPS协议的认证凭据,但Terraform会严格按照模块源指定的SSH协议尝试认证,不会自动切换到HTTPS使用TOKEN,因此触发权限拒绝。
解决方案
方案1:改用HTTPS格式模块源(推荐,无需额外SSH配置)
方式A:直接修改模块源
将main.tf中的SSH格式源替换为带TOKEN的HTTPS地址:
module "1" { source = "https://${var.github_token}@github.com/my_user/XXX.git" }
然后在GitHub Action工作流中,将TOKEN传入Terraform变量:
jobs: terraform: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Setup Terraform uses: hashicorp/setup-terraform@v3 - name: Terraform Init env: TF_VAR_github_token: ${{ secrets.TOKEN }} run: terraform init
方式B:通过Git配置自动转换协议
无需修改main.tf,在Action中添加Git配置,自动将SSH格式的源替换为带TOKEN的HTTPS格式:
jobs: terraform: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Setup Terraform uses: hashicorp/setup-terraform@v3 - name: Terraform Init run: | git config --global url."https://${{ secrets.TOKEN }}@github.com/".insteadOf "git@github.com:" terraform init
方案2:在Action中配置SSH密钥(保留SSH模块源)
如果坚持使用SSH格式的模块源,可通过加载SSH私钥完成认证:
- 本地生成新SSH密钥对:
ssh-keygen -t ed25519 -C "github-action-terraform" - 将公钥添加到你的GitHub账号SSH密钥列表(Settings -> SSH and GPG keys -> New SSH key)
- 将私钥内容存入当前仓库的Secrets,命名为
SSH_PRIVATE_KEY - 在工作流中加载私钥:
jobs: terraform: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Load SSH Private Key uses: webfactory/ssh-agent@v0.7.0 with: ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }} - name: Setup Terraform uses: hashicorp/setup-terraform@v3 - name: Terraform Init run: terraform init
额外注意事项
若使用GitHub内置的GITHUB_TOKEN(而非自定义TOKEN),需确保当前仓库的「Settings -> Actions -> General」中,Workflow permissions设置为Read and write permissions,保证TOKEN拥有拉取其他私有仓库的权限。
内容的提问来源于stack exchange,提问作者Morph59
相关产品推荐
相关产品推荐

