代码之家  ›  专栏  ›  技术社区  ›  jcollum

我如何告诉Terraform,它应该基于输入变量部署一个完全独立的API网关?

  •  0
  • jcollum  · 技术社区  · 3 年前

    我们在vars中有一个前缀,它基于一个名为 deployment_name_modifier

      prefix    = (length(var.deployment_name_modifier) != 0) ? 
        "${var.environment}-${var.deployment_name_modifier}-${local.service_name}" :  
        "${var.environment}-${local.service_name}"
    

    这是API网关设置(当然不是全部):

    resource "aws_apigatewayv2_api" "ui_backend_gateway" {
      name          = "${local.prefix}-gateway"
      protocol_type = "HTTP"
      cors_configuration {
        allow_origins = var.environment == "prd" ? ["foo.bar.services"] : ["*"]
        allow_methods = ["POST", "OPTIONS", "HEAD"]
        allow_headers = [
          "Content-Type", "X-Amz-Date", "X-Amz-Security-Token",
          "Authorization", "X-Api-Key", "X-Requested-With", "Accept", "Access-Control-Allow-Methods",
          "Access-Control-Allow-Origin", "Access-Control-Allow-Headers", "referer", "origin",
          "access-control-request-method", "sec-*"
        ]
        max_age = 300
      }
    }
    
    

    我试图得到的是一个带有Lambda和API网关的功能分支,它连接到自己的子域,而主分支位于一组单独的资源上。

    问题是将此配置应用于 deployment_name修改器 在我部署master之前,set运行良好。当我使用部署master时 deployment_name修改器 空的Terraform正在将功能分支的子域应用到已经就位的API网关。我通过对两个演出计划的质疑看到了这一点。这意味着资源的主分支集的子域来自 dev.foo.bar.services dev-1234.foo.bar.services 。我真正需要的是:

    dev.foo.bar.services -> API A -> Lambda A 
    
    dev-1234.foo.bar.services -> API B -> Lambda B
    

    其中A是主分支,B是功能分支(1234是票据编号,是分支名称的一部分)。更改的名称 aws_apigatewayv2_api 舞台显然是不够的。

    我如何才能说服Terraform,我真的想要两个基于输入变量的完全独立的API网关?

    如果我需要在这里添加一些内容(也许是子域配置?),请在评论中告诉我。

    地形1.1.3

    0 回复  |  直到 3 年前
        1
  •  2
  •   Marcin    3 年前

    如果你想重用你的代码库,一种方法是通过TF workspaces :

    多个工作空间的常见用途是创建并行的, 不同副本 以在修改主要生产基础设施之前测试一组更改。

        2
  •  1
  •   Allan Chua    3 年前

    我通常会通过引入工作区兄弟来实现状态和计划文件的分离!如果你的地形文件共享不同环境的状态,你的脚本会破坏之前的api网关和lambda函数!以下是我的PLAN自动化脚本示例:

    #!/bin/bash
    # Script will stop if any error is thrown
    set -e
    
    ENV_NAME="demo" # Could be changed to prod
    WORKSPACE_NAME="upload-apis-${ENV_NAME}"
    PLAN_FILE="./.plans/${ENV_NAME}_tf_plan"
    PLAN_DIR="./.plans"
    
    #source $ENV_FILE;
    
    if test -d "$PLAN_DIR"; then
      echo "Plan directory already exists"
    else
      echo "Creating plan directory"
      mkdir ./.plans
    fi
    
    # Initialize without remote state to execute validation
    terraform init -backend=false
    
    # Script will stop if any validation issue is found
    terraform validate
    
    # Initialize terraform with remote state after validation
    terraform init
    
    # Beautify code format of TF files
    terraform fmt .
    
    WS_COUNT=$(terraform workspace list | grep "$WORKSPACE_NAME" | wc -l)
    
    # Create workspace if not exists
    if [[ $WS_COUNT == 0 ]]; then
      terraform workspace new "$WORKSPACE_NAME"
    fi
    
    terraform workspace select "$WORKSPACE_NAME"
    
    terraform plan -out="${PLAN_FILE}" -var-file="./envs/${ENV_NAME}.tfvars"
    
    echo "Plan file is saved into ${ENV_NAME}_${PLAN_FILE}"
    
    

    和我的 apply 剧本

    #!/bin/bash
    ENV_NAME="demo" # Could be changed to prod
    WORKSPACE_NAME="upload-apis-${ENV_NAME}"
    PLAN_FILE="./.plans/${ENV_NAME}_tf_plan"
    
    terraform workspace select "$WORKSPACE_NAME"
    
    terraform apply "${PLAN_FILE}"