首页 > 解决方案 > 模块中的提供程序未传递给子模块 - terraform

问题描述

我是gitlabhq/gitlab带有 terrafrom 的 usgin 模块。

我为 gitlab 资源创建了一个单独的模块./terraform-modules/terraform-gitlab-project-variables-aws-iam-access-keys

terraform {
  required_providers {
    gitlab = {
      source = "gitlabhq/gitlab"
      version = "3.3.0"
    }
  }
}


data "gitlab_projects" "projects-name" {
  search              = var.projectSearch
  visibility          = var.projectVisibility
}

resource "aws_iam_access_key" "user" {
  user = var.projectUserName
}

resource "gitlab_project_variable" "aws_access_key_user" {

    project   = data.gitlab_projects.projects-name.projects[0].id
    key       = "AWS_ACCESS_KEY_ID"
    value     = aws_iam_access_key.user.id
    protected = var.projectAccessKeyProtected
    masked = var.projectAccessKeyMasked
    environment_scope = var.projectEnvironmentScope

}

resource "gitlab_project_variable" "aws_secret_key_user" {

    project   = data.gitlab_projects.projects-name.projects[0].id
    key       = "AWS_SECRET_ACCESS_KEY"
    value     = aws_iam_access_key.user.secret
    protected = var.projectAccessSecretProtected
    masked = var.projectAccessSecretMasked
    environment_scope = var.projectEnvironmentScope

}

如您所见,我添加了提供程序配置块,并在根模块中省略了提供程序的定义。

模块内的提供者

注意:子模块只继承提供者配置,而不是提供者源或版本要求。每个模块都必须声明自己的提供者要求。这对于非 HashiCorp 提供商尤其重要。

配置中的每个资源都必须与一个提供者配置相关联。与 Terraform 中的大多数其他概念不同,提供程序配置对于整个 Terraform 配置是全局的,并且可以跨模块边界共享。提供者配置只能在根 Terraform 模块中定义。

这是我的根模块,我正在使用模块中的前一个gitlab_projectNetwork模块./project/main.tf

provider "aws" {

    access_key = var.aws_access_key_id
    secret_key = var.aws_secret_access_key
    region     = var.aws_region
}


terraform {
  required_providers {
    gitlab = {
      source = "gitlabhq/gitlab"
      version = "3.3.0"
    }
  }
}

provider "gitlab" {
    token = var.gitlab_token

}


terraform {
  backend "http" {}
}

module "network_user" {

    source = "git::https://gitlab.com/xxx/terraform-modules/terraform-aws-iam-user.git"

    userName = "${var.project}-${var.env}-network"
    userPath = "/infra/"
    arnList = ["arn:aws:iam::${var.aws_account_id}:policy/infra/${var.project}-network-ec2-isolated-${var.env}-iam-policy"]
    userTags = {
          "Project": var.project,
          "Environment": var.env,
          "Name":"network-user"}
}


module "gitlab_projectNetwork" {

    source = "git::https://gitlab.com/xxx/terraform-modules/terraform-gitlab-project-variables-aws-iam-access-keys.git"
    projectUserName = module.network_user.awsIamUserName
    projectSearch = "network"
    projectVisibility = "private"
    projectEnvironmentScope = var.env 

}

当我运行脚本时,出现以下错误:

2021/02/05 01:08:48 [TRACE] dag/walk: upstream of "root" errored, so skipping
Error: GET https://gitlab.com/api/v4/user: 401 {message: 401 Unauthorized}
  on main.tf line 18, in provider "gitlab":
  18: provider "gitlab" {

我不确定这里有什么问题,我将日志增加到 TRACE 并且没有什么有趣的。我怀疑提供者的配置不会以某种方式进一步传递给子模块。

现在,有趣的是,如果我将其添加provider block到子模块中,脚本工作得非常好。但是官方文档没有建议反对它吗?任何想法为什么这不起作用?

标签: modulegitlabterraform

解决方案


推荐阅读