簡體   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