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

Terraform管理AWS AppConfig:更新SSM参数后无法部署最新版本

解决AWS AppConfig部署未使用最新SSM参数版本的问题

问题描述

使用Terraform管理AWS AppConfig,配置内容存储在SSM Parameter Store中。更新SSM参数值时,AppConfig会生成新的托管配置版本(例如v24),但部署始终引用旧版本(例如v1-v4),无法自动切换到最新版本。已尝试调整触发器、生命周期规则及依赖关系,均未解决问题。

核心原因

当前配置中,aws_appconfig_deployment资源无法感知SSM参数的变化:

  1. 部署资源仅依赖托管配置版本资源,但Terraform不会自动重新创建部署,除非部署自身的参数发生变化。
  2. 托管配置版本更新后,部署资源未被触发重新创建,导致仍使用旧版本号。

修正后的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 19:53:11