如何通过JSON文件为Terraform的AWS QuickSight资源生成嵌套块
解决Terraform aws_quicksight_analysis definition块赋值问题
问题核心在于Terraform的aws_quicksight_analysis资源中,definition是嵌套块而非普通参数,所以不能直接通过definition = jsondecode(...)这种方式赋值,必须用dynamic块动态生成对应的嵌套结构。
具体实现步骤
读取并解析JSON文件
先用file函数读取导出的QuickSight分析定义JSON,再通过jsondecode解析为Terraform可操作的结构体:locals { quicksight_analysis_def = jsondecode(file("./quicksight-analysis-def.json")) }用dynamic块生成definition嵌套结构
针对definition下的各个子块(如sheets、analysis_defaults、calculated_fields等),逐个用dynamic遍历或展开:resource "aws_quicksight_analysis" "example" { analysis_id = "example-analysis" name = "Example Analysis" aws_account_id = data.aws_caller_identity.current.account_id # 定义外层definition块 definition { # 展开analysis_defaults固定结构 analysis_defaults { default_new_sheet_configuration { interactive_layout_configuration { grid_layout { canvas_size_options { screen_canvas_size_options { resize_option = local.quicksight_analysis_def.Definition.AnalysisDefaults.DefaultNewSheetConfiguration.InteractiveLayoutConfiguration.GridLayout.CanvasSizeOptions.ScreenCanvasSizeOptions.ResizeOption optimized_view_port_width = local.quicksight_analysis_def.Definition.AnalysisDefaults.DefaultNewSheetConfiguration.InteractiveLayoutConfiguration.GridLayout.CanvasSizeOptions.ScreenCanvasSizeOptions.OptimizedViewPortWidth } } } } } } # 动态生成sheets数组对应的块 dynamic "sheet" { for_each = local.quicksight_analysis_def.Definition.Sheets content { sheet_id = sheet.value.SheetId name = sheet.value.Name # 嵌套处理sheet下的layout结构 layout { grid_layout { dynamic "element" { for_each = sheet.value.Layout.GridLayout.Elements content { element_id = element.value.ElementId element_type = element.value.ElementType column_index = element.value.ColumnIndex column_span = element.value.ColumnSpan row_index = element.value.RowIndex row_span = element.value.RowSpan # 展开visual子结构(以pie_chart为例) visual { visual_id = element.value.Visual.VisualId pie_chart { field_wells { pie_aggregated_field_wells { dynamic "category" { for_each = element.value.Visual.PieChart.FieldWells.PieAggregatedFieldWells.Category content { field_id = category.value.FieldId } } dynamic "values" { for_each = element.value.Visual.PieChart.FieldWells.PieAggregatedFieldWells.Values content { field_id = values.value.FieldId } } } } sort_configuration { dynamic "category_sort" { for_each = element.value.Visual.PieChart.SortConfiguration.CategorySort content { sort_by { field_id = category_sort.value.SortBy.FieldId direction = category_sort.value.SortBy.Direction } } } } } } } } } } } } # 动态生成calculated_fields块 dynamic "calculated_field" { for_each = local.quicksight_analysis_def.Definition.CalculatedFields content { calculated_field_name = calculated_field.value.CalculatedFieldName data_set_identifier = calculated_field.value.DataSetIdentifier expression = calculated_field.value.Expression } } } }
关键注意点
dynamic块用于遍历JSON中的数组或对象,自动生成对应Terraform嵌套块,避免手动编写大量重复代码。- 必须严格匹配
aws_quicksight_analysis资源的块结构(参考Terraform官方资源schema),确保子块名称、字段与JSON键名一一对应。 - 对于JSON中的可选字段,可通过
if条件判断是否生成对应子块,避免空值导致的Terraform报错。
内容的提问来源于stack exchange,提问作者Oleksandr Yarushevskyi
相关产品推荐
相关产品推荐

