【问题标题】:Terraform modules forces to define all the blocks defined in resources, is there any way to make dynamic import from resourcesTerraform 模块强制定义资源中定义的所有块,有没有办法从资源中动态导入
【发布时间】:2022-12-23 04:36:45
【问题描述】:

我正在尝试使用 TF 中的资源创建 aws codepipeline。这是我在 m,y TF 中的资源部分。

resource "aws_codepipeline" "codepipeline" {
  name     = var.name                                   
  role_arn = var.role_arn                               



 artifact_store {
    location = var.location                             
    type     = var.type
  }



 stage {
    name = var.stage1_name                              



   action {
      name             = var.action1_name     
      category         = var.source_category
      owner            = var.source_owner    
      provider         = var.source_provider            
      version          = var.source_version             
      output_artifacts = var.source_output_artifacts    



     configuration = {
        ConnectionArn        = var.connection_arn           
        FullRepositoryId     = var.full_repository_id         
        BranchName           = var.branch_name   
        OutputArtifactFormat = var.output_artifact_format             
      }
    }
  }



 stage {
    name = var.stage2_name                               



   action {
      name             =  var.action2_name               
      category         =  var.build_category             
      owner            =  var.build_owner                
      provider         = var.build_provider              
      input_artifacts  = var.input_artifacts             
      output_artifacts = var.build_output_artifacts      
      version          = var.build_version     
      
      configuration = {
        ProjectName = var.project_name
        EnvironmentVariables = var.environment_variables /*jsonencode(
        [
          {
            name  = var.environment_name
            type  = var.environment_type
            value = var.environment_value
          }
        ]
       )  */     
       }
    }
  }
}

在我的 TF 模块部分,通过调用上面给出的资源创建代码管道。我的模块代码是

module "codepipeline_notification" {
  source = "../../modules/codepipeline"
  name                    = var.codepipeline_lambda_notification_name                                   
  role_arn                = aws_iam_role.cp_lambda_deploy_role.arn #var.codepipeline_lambda_notification_role_arn                               
  location                = module.s3_codepipeline_artifact.s3_bucket_account_id   #var.codepipeline_lambda_notification_location                             
  type                    = var.codepipeline_lambda_notification_type



 stage1_name             = var.codepipeline_lambda_notification_stage1_name    
  action1_name            = var.codepipeline_lambda_notification_action1_name            
  source_category         = var.codepipeline_lambda_notification_source_category
  source_owner            = var.codepipeline_lambda_notification_source_owner   
  source_provider         = var.codepipeline_lambda_notification_source_provider            
  source_version          = var.codepipeline_lambda_notification_source_version            
  source_output_artifacts = var.codepipeline_lambda_notification_source_output_artifacts
  full_repository_id      = var.codepipeline_lambda_notification_full_repository_id         
  branch_name             = var.codepipeline_lambda_notification_branch_name               
  output_artifact_format  = var.codepipeline_lambda_notification_output_artifact_format
  environment_variables   = jsonencode(
        [
          {
            name  = var.codepipeline_lambda_notification_environment_name
            type  = var.codepipeline_lambda_notification_environment_type
            value = var.codepipeline_lambda_notification_environment_value
          }
        ]
       )         
  build_output_artifacts        = var.codepipeline_lambda_notification_build_output_artifacts   
  connection_arn          = module.codestarconnections.arn
  stage2_name             = var.codepipeline_lambda_notification_stage2_name                               
  action2_name            = var.codepipeline_lambda_notification_action2_name     
  build_category         = var.codepipeline_lambda_notification_build_category   
  build_owner            = var.codepipeline_lambda_notification_build_owner      
  build_provider         = var.codepipeline_lambda_notification_build_provider              
  build_version          = var.codepipeline_lambda_notification_build_version               
  input_artifacts         = var.codepipeline_lambda_notification_input_artifacts   
  project_name             = module.codebuild_notification.name
}

使用这种方法,我试图创建 4 个管道,其中一个管道只有 2 个阶段,其他 2 个管道有 3 个阶段,如果我在资源中定义 3 个阶段,那么 Terraform 会强制模块在我需要 onyl 2 的所有管道中创建 3 个阶段阶段。 terraform 中是否有任何方法可以在资源中定义并根据条件在模块中使用资源

【问题讨论】:

  • “基于条件”——基于什么条件?你没有提供任何关于你的情况的信息。

标签: terraform terraform-provider-aws aws-codepipeline infrastructure-as-code terraform-modules


【解决方案1】:

不确定您是否曾经得到问题的答案,但是是的,有办法。它被称为动态管道。我有一个存储库,可以引导您完成动态管道的使用。简而言之,您将资源视为动态资源,使用每个语句并将配置作为映射传递。

该模块如下所示:

resource "aws_codepipeline" "codepipeline" {
  for_each = var.code_pipeline
  name     = "${local.name_prefix}-${var.AppName}"
  role_arn = each.value["code_pipeline_role_arn"]

  tags = {
    Pipeline_Key = each.key
  }

  artifact_store {
    type     = lookup(each.value, "artifact_store", null) == null ? "" : lookup(each.value.artifact_store, "type", "S3")
    location = lookup(each.value, "artifact_store", null) == null ? null : lookup(each.value.artifact_store, "artifact_bucket", null)
  }

  dynamic "stage" {
    for_each = lookup(each.value, "stages", {})
    iterator = stage
    content {
      name = lookup(stage.value, "name")
      dynamic "action" {
        for_each = lookup(stage.value, "actions", {}) //[stage.key]
        iterator = action
        content {
          name             = action.value["name"]
          category         = action.value["category"]
          owner            = action.value["owner"]
          provider         = action.value["provider"]
          version          = action.value["version"]
          run_order        = action.value["run_order"]
          input_artifacts  = lookup(action.value, "input_artifacts", null)
          output_artifacts = lookup(action.value, "output_artifacts", null)
          configuration    = action.value["configuration"]
          namespace        = lookup(action.value, "namespace", null)
        }
      }
    }
  }
}

该模块的完整使用可以在这个GitHub repository中找到。在您的情况下,您可以传入多个资源以在一个模块中创建具有独特和自定义阶段和操作的各种管道。我希望这有帮助。

【讨论】:

    猜你喜欢
    • 2021-04-17
    • 2023-01-02
    • 2021-11-06
    • 2018-05-16
    • 1970-01-01
    • 1970-01-01
    • 2021-09-24
    • 2020-11-26
    • 1970-01-01
    相关资源
    最近更新 更多