[英]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.