AWS CodeBuild使用环境变量配置secrets-manager

9

更新:

不确定何时发生的变化,但现在这个方法可以按照描述工作了。

在流水线构建操作中还提供了一个选项,可直接设置密钥。

secrets-manager


原始问题:

我已经为AWS CodePipeline的构建阶段设置了一个名为secret-id的环境变量,例如$SECRET_ID

我想在CodeBuild buildspec.yml中使用它来基于我的环境从Secrets Manager获取一组机密。是否可能在buildspec文件中自引用其他变量?

这就是我预期它会工作的方式,但实际上并没有。

version: 0.2

env:
  secrets-manager:
    MY_SECRET: ${SECRET_ID}

phases:
  build:
    commands:
      - echo $MY_SECRET

我在构建日志中收到以下错误信息。
秘密管理器错误消息:验证异常:无效名称。必须是包含字母数字字符或以下任何字符的有效名称:-/_+=.@!

由于MY_SECRET是环境变量,因此可能实现。运行构建阶段是否将预期的密钥输入到容器中? - sash
@sash 抱歉,应该附上构建日志错误。谢谢更新。 - hyperdrive
1
从错误看来,${SECRET_ID} 似乎无效。您能否在 ${SECRET_ID} 上执行 echo @hyperdrive 并检查它是否遵循文档 https://docs.aws.amazon.com/codebuild/latest/userguide/build-spec-ref.html#secrets-manager-build-spec 中所述的格式 secret-id:json-key:version-stage:version-id - sash
1
是的,如果我刪除secrets-manager,$SECRET_ID或${SECRET_ID}是正確的值。如果我在代碼中硬編碼ID,我會得到密鑰值。我有種感覺,secrets-manager的codebuild實現不支持這樣做。 - hyperdrive
1
${SECRET_ID} 应该以 secret-id:json-key 的格式提供,举个例子,如果您有名为 demo 的秘密管理器,并且其中包含一个名为 key 的秘密和其内容,则需要使用 demo:key,然后它将返回JSON格式。请参阅 https://docs.aws.amazon.com/codebuild/latest/userguide/build-spec-ref.html#secrets-manager-build-spec。 - Mahattam
@Mahattam 是的,我知道。看起来它正在尝试使用实际文本“$SECRET_ID”。我的希望是它会或者有一种方法来插值环境变量的值。我想根据我在管道中构建的项目交换secret-id/json-key。而不必为每个阶段创建单独的构建项目或编写解析密钥的命令,因为它们已经很方便地完成了。 - hyperdrive
3个回答

2

您只需要直接引用它。如下所示: where -

版本:0.2

环境: secrets-manager: MY_SECRET: SECRET_ID

阶段: 构建: 命令: - echo $MY_SECRET


1
我当然可以直接使用它。问这个问题的原因是想知道如何不直接使用它。或者我有没有理解你所说的内容? - hyperdrive

1
我遇到了同样的错误。
将ARN设置为环境变量,像下面这样:
export SECRET_ID=arn:aws:secretsmanager:...
它会起作用。

5
请务必用完整的句子给出更详细的答案。 - damianesteban

0

你也可以在其中一个阶段调用 AWS API。

version: 0.2

phases:
  build:
    commands:
      - SECRET_JSON=$(aws secretsmanager get-secret-value --secret-id $SECRET_ID)
      - MY_SECRET_VALUE=$(echo $SECRET_JSON | jq -r '.SecretString' | jq -r '.mySecretKey')
      - echo $MY_SECRET_VALUE

.SecretString 是由secretsmanager输出的结构体给出的,mySecretKey 是secret中键值对的自定义键。


谢谢您的发布,它让我回头看了一下,我的原始方法现在可以工作了 :) - hyperdrive
1
@hyperdrive,你是怎么让原始方法运行起来的?我自己试了却无法让它工作。 - johnsimer
@johnsimer 我不确定这对我是否有效... 在 CodePipeline > 构建阶段设置一个明文环境变量,将 SECRET_ID 设置为秘密名称。然后在 buildspec 中,我引用它的方式与上面完全相同。 - hyperdrive

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接