如何通过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
相关产品推荐
相关产品推荐

