terraform - 使用 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 中解决这个问题。
谢谢。
解决方案
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 项目。
推荐阅读
- node.js - 使用 fabric-sdk-node v2.1 实现事务提交监听器
- operators - Raku 的 Unicode 字符文档在哪里,例如 "»" ?
- c# - 从 Blazer 服务器渲染原始 HTML 请求 (TextActionResult)
- php - 找到重复值后立即将php多维数组拆分为子数组
- javascript - javascript过滤器并在嵌套数组对象中包含方法使用
- latex - 如何否决乳胶中的所有颜色语句以获取一种颜色的所有文本
- javascript - 如何从 HTML 中的选项值中获取选择 id 值?
- python - 如何使用 .get() 方法获取字典内列表中的项目?
- android - react-native-ble-plx 未检测到附近的所有设备
- docker - Docker jwilder/nginx-proxy 和letsencrypt 伴侣ACME 错误