Terraform管理AWS AppConfig:更新SSM参数后无法部署最新版本
解决AWS AppConfig部署未使用最新SSM参数版本的问题
问题描述
使用Terraform管理AWS AppConfig,配置内容存储在SSM Parameter Store中。更新SSM参数值时,AppConfig会生成新的托管配置版本(例如v24),但部署始终引用旧版本(例如v1-v4),无法自动切换到最新版本。已尝试调整触发器、生命周期规则及依赖关系,均未解决问题。
核心原因
当前配置中,aws_appconfig_deployment资源无法感知SSM参数的变化:
- 部署资源仅依赖托管配置版本资源,但Terraform不会自动重新创建部署,除非部署自身的参数发生变化。
- 托管配置版本更新后,部署资源未被触发重新创建,导致仍使用旧版本号。
修正后的Terraform配置
resource "aws_ssm_parameter" "myapp_json" { name = "/config/ecs/myapp" type = "String" value = jsonencode({ location = var.location entryFee = var.entryFee }) description = "${var.environment} AppConfig JSON configuration" } output "myapp_value" { value = aws_ssm_parameter.myapp_json.value } resource "aws_appconfig_application" "myapp" { name = var.name_prefix description = "AWS AppConfig application for myapp" } resource "aws_appconfig_configuration_profile" "myprofile" { application_id = aws_appconfig_application.myapp.id name = "${var.environment}-profile" description = "Dev Configuration profile" location_uri = "ssm-parameter://${aws_ssm_parameter.myapp_json.name}" retrieval_role_arn = aws_iam_role.appconfig_role.arn } resource "aws_appconfig_environment" "myenv" { application_id = aws_appconfig_application.myapp.id name = var.environment description = "Environment for ${var.environment}" } resource "aws_appconfig_hosted_configuration_version" "myconfig" { depends_on = [aws_ssm_parameter.myapp_json] application_id = aws_appconfig_application.myapp.id configuration_profile_id = aws_appconfig_configuration_profile.myprofile.configuration_profile_id description = "Hosted Configuration Version (updated at ${timestamp()})" content_type = "application/json" content = aws_ssm_parameter.myapp_json.value lifecycle { create_before_destroy = true } } resource "aws_appconfig_deployment_strategy" "mydeploystrategy" { name = "${var.environment}-deployment-strategy" description = "Deployment Strategy" deployment_duration_in_minutes = 1 final_bake_time_in_minutes = 1 growth_factor = 20 growth_type = "LINEAR" replicate_to = "NONE" tags = { Type = "${var.environment} AppConfig Deployment Strategy" } } resource "aws_appconfig_deployment" "mydeployment" { depends_on = [aws_appconfig_hosted_configuration_version.myconfig] application_id = aws_appconfig_application.myapp.id configuration_profile_id = aws_appconfig_configuration_profile.myprofile.configuration_profile_id configuration_version = aws_appconfig_hosted_configuration_version.myconfig.version_number deployment_strategy_id = aws_appconfig_deployment_strategy.mydeploystrategy.id description = "${var.environment} deployment (updated at ${timestamp()})" environment_id = aws_appconfig_environment.myenv.environment_id # 当SSM参数值变化时触发重新部署 triggers = { ssm_config_value = aws_ssm_parameter.myapp_json.value } lifecycle { create_before_destroy = true } }
关键调整说明
- 添加部署触发器:在
aws_appconfig_deployment中新增triggers块,将SSM参数的value作为触发条件。当SSM内容变更时,触发器值改变,Terraform会自动销毁旧部署并创建新部署,确保使用最新的托管配置版本号。 - 优化托管版本描述:给
aws_appconfig_hosted_configuration_version的description添加${timestamp()},确保每次配置变更时该资源属性更新,触发新版本创建(可选,用于更清晰的版本追踪)。 - 配置部署生命周期:给
aws_appconfig_deployment设置create_before_destroy = true,保证新部署就绪后再销毁旧部署,避免服务中断。 - 确认依赖顺序:保留
depends_on确保托管配置版本完全创建后再执行部署,避免版本号未就绪的问题。
内容的提问来源于stack exchange,提问作者Vicky
相关产品推荐
相关产品推荐

