如何在 buildspec.yaml 中检索 Secret Manager 数据

Posted

技术标签:

【中文标题】如何在 buildspec.yaml 中检索 Secret Manager 数据【英文标题】:How to retrieve Secret Manager data in buildspec.yaml 【发布时间】:2020-02-01 14:53:28 【问题描述】:

我正在创建与 SonarQube 集成的 CodeBuild,因此我直接在我的 Buildspec.yaml 中传递值和声纳凭据

我尝试使用 SecretManager 中的以下命令进行检索,而不是直接进行硬编码,因为它在以下链接中有所提及。但它没有得到正确的值。它会引发错误。

命令:'resolve:secretsmanager:MyRDSSecret:SecretString:username'

链接:https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/dynamic-references.html#dynamic-references-secretsmanager

错误 [错误] SonarQube 服务器 [resolve:secretsmanager:arn:aws:secretsmanager:us-east-1:********:secret:**** ******:SecretString:SonarURL] 无法访问

我如何使用 echo 'resolve:secretsmanager:arn:aws:secretsmanager:us-east-1:***:secret:*********** ***:SecretString:*******'

注意:我的命令中的所有 * 都是 secretname 和 secreturl

【问题讨论】:

【参考方案1】:

如果您希望检索构建规范文件中的机密,我建议使用与 CodeBuild 原生集成的 Systems Manager Parameter Store。 Systems Manager 本身就是一项服务,从 AWS 控制台主页搜索它,然后 Paramater Store 在 Systems Manager 控制台页面的左下方。

假设您想在 buildspec.yml 文件中包含访问密钥和秘密密钥: - 为 IAM 用户创建 AccessKey/SecretKey 对 - 将上述密钥作为安全字符串保存在 SSM 参数存储中(例如“/CodeBuild/AWS_ACCESS_KEY_ID”和“/CodeBuild/AWS_SECRET_ACCESS_KEY”) - 使用以下 buildspec 指令导出构建环境中的两个值:

version: 0.2
env:
    parameter-store:
        AWS_ACCESS_KEY_ID_PARAM: /CodeBuild/AWS_ACCESS_KEY_ID
        AWS_SECRET_ACCESS_KEY_PARAM: /CodeBuild/AWS_SECRET_ACCESS_KEY

phases:
    build:
        commands:
            - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID_PARAM
            - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY_PARAM
            # Your Ansible commands below
            - ansible-playbook -i hosts ec2-key.yml 

[1] CodeBuild 的构建规范参考 - 构建规范语法 - https://docs.aws.amazon.com/codebuild/latest/userguide/build-spec-ref.html#build-spec-ref-syntax

【讨论】:

感谢您的快速转身,帮助我了解有关 Parameter Store 的一些想法。 您能否举例说明如何在 CodeBuild 和 CodePipeline 中使用它?对于 buildspec.yaml 参数存储:CUSTOM_PARAM:/aws/reference/secretsmanager/DBUser1 例如:我有一个名为“SajivSecret”的秘密,它几乎没有键和值对。其中一个名为“DBUser1”的Key和一个名为“***”的Value。我想在我的 buildspec.yaml 文件中检索这个特定的密钥我的问题是,它会在 Secret Manager 的所有密钥中查找名为 DBUSer1 的密钥还是作为 DBUser1 的密钥 如何在参数存储下 buildspec.yaml 中的 Secret Manager 中检索特定于我的 Secret 的秘密 @SajivSriraam 它将查找名为 DBUSer1 的 Secret -“当您从 Parameter Store 检索 Secrets Manager 密钥时,参数名称必须以以下保留路径开头:/aws/reference/secretsmanager/secret_ID_in_Secrets_Manager " - docs.aws.amazon.com/systems-manager/latest/userguide/… @committedandroider - 我在哪里可以找到秘密管理器中的秘密 ID。我可以看到 SecretKey Name、Secret Name、Secret ARN【参考方案2】:

CodeBuild 今天刚刚推出 - https://aws.amazon.com/about-aws/whats-new/2019/11/aws-codebuild-adds-support-for-aws-secrets-manager/

【讨论】:

这应该是公认的答案。这是对op的问题最直接的解决方案。 是的,这就是答案。 docs.aws.amazon.com/codebuild/latest/userguide/… 在以下示例中,TestSecret 是存储在 Secrets Manager 中的键值对的名称。 TestSecret 的键是 MY_SECRET_VAR。您可以在构建期间使用 LOCAL_SECRET_VAR 名称访问该变量。 env:秘密管理器:LOCAL_SECRET_VAR:“TestSecret:MY_SECRET_VAR”【参考方案3】:

您尝试使用的动态引用语法仅适用于 Cloud Formation (CFN) 服务。在某些情况下,CFN 会限制这些对机密的动态引用将扩展到何处。具体来说,它们不会在控制台中可能显示机密的地方扩展,例如在 EC2 元数据中。

如果您尝试通过 CFN 设置代码构建,这可能就是您所看到的。但是,正如 shariqmaws 所提到的,您可以使用参数存储并将您的秘密存储在那里,或者将参数存储用作pass through to secrets manager(如果您想使用秘密管理器来轮换您的秘密或出于其他原因)。

【讨论】:

您能否举例说明如何在 CodeBuild 和 CodePipeline 中使用它?对于 buildspec.yaml 参数存储:CUSTOM_PARAM:/aws/reference/secretsmanager/DBUser1 例如:我有一个名为“SajivSecret”的秘密,它几乎没有键和值对。其中一个名为“DBUser1”的Key和一个名为“***”的Value。我想在我的 buildspec.yaml 文件中检索这个特定的密钥我的问题是,它会在 Secret Manager 的所有密钥中查找名为 DBUSer1 的密钥还是作为 DBUser1 的密钥

以上是关于如何在 buildspec.yaml 中检索 Secret Manager 数据的主要内容,如果未能解决你的问题,请参考以下文章

如何获取 NSManagedObjectId 并检索数据

从数据库中检索数据时如何显示加载动画或进度条?

如何在 Django 中自动查询?

SQL 和 C# 从数据库中检索单个记录

如何将检索到的文本与我的预期文本进行比较?

带有 json-server 的 Angular 7 - 如何检索发布响应中返回的 id?