繁体   English   中英

AWS Codepipeline 在 Terraform 中使用命名空间

[英]AWS Codepipeline using namespaces in Terraform

有没有人在 Codepipeline 中使用名称空间? 我有来自 AWS 的参考链接,但一如既往,Terraform 没有实际示例。 我想要做的是在一个阶段从一个构建规范中获取 output 变量,然后在我的部署阶段访问这些变量。 我觉得我正在使用下面使用的语法走上正确的道路,但我一直收到有关命名空间使用的错误。

阶段构建:代码片段

  action {
      run_order         = 1           
      name              = "Terraform-Plan"
      category          = "Build"
      owner             = "AWS"
      provider          = "CodeBuild"
      version           = "1"
      input_artifacts   = ["CodeWorkspace"]
      output_artifacts  = ["CodeSource","TerraformPlanFile"]
      namespace         = "buildvariables" 
    
      configuration = {
        ProjectName          = var.codebuild_project_name
        EnvironmentVariables = jsonencode([
          {
            name  = "CONFIG"
            value = "#{buildvariables.CONFIG}"
            type  = "PLAINTEXT"
          }
        ])
      }

  }

这是我尝试在我的 buildspec_plan 文件中引用命名空间的阶段。 不确定我是否正确调用它:

version: 0.2
env:
  variables:
    ...some variables here

  parameter-store:
    ...some variables here
 
  secrets-manager:
    ...some variables here

  git-credential-helper: yes
    
  exported-variables:
    - CONFIG

phases:
  install:
    commands:
      - ...some commands here
 
  pre_build:
      - ...some commands here

  build:
    on-failure: ABORT
    commands: 
      # Import S3 Folder Location Variable
      - ...some commands here
      - CONFIG=newvariable

我已经删除了与此无关的构建规范部分,但我的第一个问题是,我是否正确使用它,因为它似乎因以下错误而出错:

创建 CodePipeline 时出错:InvalidActionDeclarationException:变量只能引用较早阶段或同一阶段较早运行顺序生成的命名空间。 以下变量的引用无效。 StageName=[Plan]、ActionName=[Terraform-Plan]、ActionConfigurationKey=[EnvironmentVariables]、VariableReferenceText=[buildvariables.CONFIG]

我相信我正朝着正确的方向前进,但找不到有关 terraform 用法的工作示例。

我问题的最后一部分与我当前的问题无关,而是与我最终通过命名空间声明后在另一个阶段使用变量有关。 我计划通过执行以下操作在称为 buildspec_apply 的不同构建规范中调用此变量:

  build:
    commands:
      - cd ${CODEBUILD_SRC_DIR}
      - ls
      - echo ${buildvariables.CONFIG}

我显然使用回声作为样本来验证变量是否有效,但我不确定这是正确的。

欢迎提供链接和提示谢谢

大家好,经过几天的研究,我终于使它起作用并理解了它。 对于在这里寻找类似答案的任何人来说,这是我对自己的问题的最佳指导。

首先,请记住这部分命名空间必须在使用前的前一阶段声明。 您不能在声明它的同一阶段使用命名空间。 同样重要的是,环境变量直接绑定到命名空间,您在命名空间阶段声明的变量直接绑定到命名空间。 您不能在不同阶段添加其他变量。 它们必须在声明命名空间的阶段定义。

声明命名空间:注意命名空间声明,它正在寻找一个字符串变量。 对于此示例,我使用了“YOUR_NAME_SPACE_NAME”,请将其替换为您喜欢的名称。 我会尽可能推荐大写。

stage {
  name = "Plan"
  action {
      run_order         = 1           
      name              = "Terraform-Plan"
      category          = "Build"
      owner             = "AWS"
      provider          = "CodeBuild"
      version           = "1"
      namespace         = "YOUR_NAME_SPACE_NAME" 
      input_artifacts   = ["CodeWorkspace"]
      output_artifacts  = ["CodeSource","TerraformPlanFile"]
    
      configuration = {
        ProjectName          = var.codebuild_project_name_1
        EnvironmentVariables = jsonencode([
          {
            name  = "PL_TESTVARIABLE"
            type  = "PLAINTEXT"  
            value = ""
          },
        ])
        
      }

  }

命名空间的关键是环境变量声明。 这发生在你的阶段的配置部分。 请注意,必须在 JSON 中设置环境变量。任何想知道的人,我将 PL 用于 Pipeline 只是为了避免与任何可能的本机变量发生冲突,请随意以您想要的任何方式命名它们,但请理解有本机环境变量到代码管道。 这里最重要的一点是,您在此阶段声明的任何变量现在都是命名空间的一部分。

构建规范在当前阶段的构建规范中,您可以利用命名空间变量来传递值。 请注意,在当前阶段,您可以通过 Buildspec 通过向变量声明一个值来更改 Namespace 的值。

请注意,您可以在安装、预构建或构建阶段声明变量。

    version: 0.2
    env:
      variables:
        ...some variables here
    
      parameter-store:
        ...some variables here
     
      secrets-manager:
        ...some variables here
    
      git-credential-helper: yes
        
      exported-variables:
        - PL_TESTVARIABLE
    
    phases:
      install:
        commands:
          - ...some commands here
     
      pre_build:
          - ...some commands here
    
      build:
        on-failure: ABORT
        commands: 
          # Import S3 Folder Location Variable
          - ...some commands here
          - PL_TESTVARIABLE="MyNewValue"

请注意,在示例中,我们在导出阶段和构建阶段定义了变量。 这是为了确保我们 output 在构建阶段结束时获得新值。

下一个代码管道阶段:在下一个代码管道阶段,您想要引用命名空间。 为此,您需要像上一阶段一样在环境部分中声明变量并声明相同的变量。 请记住,每个阶段都将变量视为不会从其他阶段继承的新变量。 为了解决这个问题,我们将利用命名空间。

  stage {
    name = "Test"
      action {
          run_order         = 1           
          name              = "Terraform-Test"
          category          = "Test"
          owner             = "AWS"
          provider          = "CodeBuild"
          version           = "1"
          input_artifacts   = ["CodeSource"]
          output_artifacts  = ["CodeSource"]
        
          configuration = {
            ProjectName          = var.codebuild_project_name_1
            EnvironmentVariables = jsonencode([
              {
                name  = "PL_TESTVARIABLE"
                type  = "PLAINTEXT"  
                value = "#{YOUR_NAME_SPACE_NAME.PL_TESTVARIABLE}"
              },
            ])
            
          }
    
      }

请注意,我们再次声明了 PL_TESTVARIABLE,但看看我们对变量的值做了什么。 请记住,这是 json,而不是实际的 terraform,因此变量被视为 json 输入。 要引用上一阶段的命名空间值,请遵循此语法 Namespace.YourVariableName。 注意 PL_TESTVARIABLE 值遵循我们的语法来为其分配上一阶段导出的值。

当前阶段 BUILDSPEC:要在您的 Buildspec 中的这个阶段调用此变量,您只需调用环境变量 PL_TESTVARIABLE,就像调用 Buildspec 的任何部分一样。

version: 0.2
env:
  variables:
    ...some variables here

phases:
  install:
    commands:
      - echo $PL_TESTVARIABLE

  pre_build:
      - echo "text in line variable ${PL_TESTVARIABLE}"
      - PL_TESTVARIABLE="MyNewValue"

  build:
    on-failure: ABORT
    commands: 
      # Import S3 Folder Location Variable
      - PL_TESTVARIABLE="MyNewValue"
      - NewVariable=$PL_TESTVARIABLE

在此 Buildspec 参考中,我演示了使用该变量的各种方法。 这解释了如何利用命名空间。 您不必按顺序引用它,只要定义了命名空间,您就可以在任何阶段的任何时候利用该变量。

希望这可以帮助任何试图在 Terraform 中利用它的人。

干杯

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM