You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Terraform在配置文件变更时创建AWS AppConfig新版本?

解决Terraform管理AWS AppConfig时变更配置不生成新版本的问题

问题根源

你当前使用的aws_appconfig_hosted_configuration_version资源是Terraform用来管理单个特定托管配置版本的。当配置文件内容变更时,Terraform会认为需要替换这个资源——即销毁旧版本、重建同名资源,这会导致AppConfig的版本号无法按预期递增,旧版本也会被删除,完全不符合AppConfig的版本化管理逻辑。

解决方案

要实现配置变更时自动创建新版本(保留旧版本),需要放弃直接用aws_appconfig_hosted_configuration_version跟踪内容变化,转而通过null_resource结合AWS CLI来触发新版本的创建。核心思路是用配置内容的哈希值作为触发器,当内容变更时自动调用AWS API生成新的版本。

修改后的代码示例

provider "aws" {
  region  = "ap-south-1"
  profile = "default"
}

# 创建AppConfig应用
resource "aws_appconfig_application" "homepage" {
  name        = "homepage"
  description = "Homepage application configuration"
}

# 创建配置文件
# application.yml对应的配置文件
resource "aws_appconfig_configuration_profile" "application" {
  application_id = aws_appconfig_application.homepage.id
  name           = "application"
  description    = "Application configuration profile"
  location_uri   = "hosted"
}

# http.yml对应的配置文件
resource "aws_appconfig_configuration_profile" "http" {
  application_id = aws_appconfig_application.homepage.id
  name           = "http"
  description    = "HTTP configuration profile"
  location_uri   = "hosted"
}

# 创建环境
resource "aws_appconfig_environment" "uat" {
  application_id = aws_appconfig_application.homepage.id
  name           = "uat"
  description    = "UAT environment"
}

# 计算配置文件内容的哈希,用于触发版本更新
locals {
  application_config_hash = sha256(file("${path.module}/configs/application.yml"))
  http_config_hash        = sha256(file("${path.module}/configs/http.yml"))
}

# 自动创建application.yml的新版本
resource "null_resource" "application_config_version" {
  triggers = {
    # 当配置内容哈希变化时,触发执行
    config_hash = local.application_config_hash
  }

  provisioner "local-exec" {
    command = <<EOT
aws appconfig create-hosted-configuration-version \
  --application-id ${aws_appconfig_application.homepage.id} \
  --configuration-profile-id ${aws_appconfig_configuration_profile.application.configuration_profile_id} \
  --content "$(cat ${path.module}/configs/application.yml)" \
  --content-type "application/x-yaml" \
  --description "Auto-generated version (hash: ${local.application_config_hash})"
EOT
  }
}

# 自动创建http.yml的新版本
resource "null_resource" "http_config_version" {
  triggers = {
    config_hash = local.http_config_hash
  }

  provisioner "local-exec" {
    command = <<EOT
aws appconfig create-hosted-configuration-version \
  --application-id ${aws_appconfig_application.homepage.id} \
  --configuration-profile-id ${aws_appconfig_configuration_profile.http.configuration_profile_id} \
  --content "$(cat ${path.module}/configs/http.yml)" \
  --content-type "application/x-yaml" \
  --description "Auto-generated version (hash: ${local.http_config_hash})"
EOT
  }
}

关键说明

  • 哈希触发器:通过sha256计算配置文件内容的哈希值,只有当内容真正变化时,才会触发null_resource执行创建新版本的命令。
  • 保留旧版本:调用create-hosted-configuration-version接口会在AppConfig中生成新的递增版本号,旧版本不会被删除,完全符合AppConfig的版本化设计。
  • 权限与环境要求:执行Terraform的环境需要安装AWS CLI,且操作账号拥有appconfig:CreateHostedConfigurationVersion权限。
  • 部署工作流分离:新版本创建后,你可以通过单独的工作流(比如另一个Terraform资源aws_appconfig_deployment或CI/CD工具)将新版本部署到目标环境。

注意事项

  • 如果你之前已经使用aws_appconfig_hosted_configuration_version创建过版本,需要先执行terraform state rm将这些资源从Terraform状态中移除,避免冲突。
  • 不要同时保留原有的aws_appconfig_hosted_configuration_version资源,否则会与null_resource的操作产生冲突。

内容的提问来源于stack exchange,提问作者Rishabh Mishra

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 10:34:59