首页 > 解决方案 > 使用 AWS 提供商的 Terraform 无法创建 CodeBuild

问题描述

我正在尝试使用 Terraform 创建 AWS CodeBuild。

resource "aws_codebuild_project" "cicd_codebuild" {
  name          = "cicd-${var.profile}-build"
  description   = "cicd ${var.profile} CodeBuild"
  service_role  = "${aws_iam_role.cicd_role.arn}"

  source {
    type = "GITHUB_ENTERPRISE"
    location = "https://git.xxx.com/yyy/zzz.git"
    git_clone_depth = 0
    buildspec = "NO_SOURCE"
  }

  environment {
    compute_type                = "BUILD_GENERAL1_MEDIUM"
    image                       = "aws/codebuild/windows-base:2019-1.0"
    type                        = "WINDOWS_SERVER_2019_CONTAINER"
    image_pull_credentials_type = "CODEBUILD"
  }

  artifacts {
    type = "NO_ARTIFACTS"
  }
}

terraform apply我收到错误时:

Error: aws_codebuild_project.cicd_codebuild: expected environment.0.type to be one of [LINUX_CONTAINER LINUX_GPU_CONTAINER WINDOWS_CONTAINER ARM_CONTAINER], got WINDOWS_SERVER_2019_CONTAINER

当我改变值时,environment.0.type = "WINDOWS_CONTAINER"我得到以下错误:

Error: Error applying plan:

1 error occurred:
        * aws_codebuild_project.cicd_codebuild: 1 error occurred:
        * aws_codebuild_project.cicd_codebuild: Error creating CodeBuild project: InvalidInputException: The environment type WINDOWS_CONTAINER is deprecated for new projects or existing project environment updates. Please consider using Windows Server 2019 instead.

我在 GitHub 上发现这个问题已经在下一个版本中得到解决。所以,我知道升级提供程序版本可以解决这个问题,但是我们有什么解决方法可以在相同版本的 Terraform 和 Provider 中解决这个问题。

谢谢。

标签: terraformterraform-provider-awsterraform0.11

解决方案


Terraform 对许多资源参数进行了计划时间验证,允许在尝试应用它之前捕获传递无效参数的位置。

通常这是有益的,但如果您无法与提供程序版本保持同步,这意味着允许值列表可能与提供程序正在与之交谈的支持服务实际允许的值过时。

在这种特定情况下,在AWS 于 2020 年 7 月添加该功能后,拉取请求添加了WINDOWS_SERVER_2019_CONTAINER作为计划时间验证选项

不幸的是,这项工作已合并并作为AWS 提供商 v3.20.0 版本的一部分发布,而v3 版本仅支持 Terraform 0.12 及更高版本

重大变化

  • provider:新版本的 provider 只能在 Terraform 0.12 及更高版本上自动安装 (#14143)

如果您希望能够在 CodeBuild 中使用 Windows 容器,您需要升级到更新版本的 Terraform 和 AWS 提供商,或者您需要使用不同的工具来创建 CodeBuild 项目。

一种可能的解决方法是使用CloudFormation 创建您可以使用aws_cloudformation_stack资源通过 Terraform 运行的 CodeBuild 项目。


推荐阅读