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