【问题标题】:How to pass variable (environment property) from CodeBuild to Beanstalk app in CodePipeline?如何将变量(环境属性)从 CodeBuild 传递到 CodePipeline 中的 Beanstalk 应用程序?
【发布时间】:2020-11-14 11:20:44
【问题描述】:

我有一个简单的 CodePipeline,它包含三个阶段 - 源代码签出、CodeBuild 使用 buildspec.yml 构建 docker 映像并生成 Dockerrun.json 工件,然后部署到 Beanstalk。

现在我希望在 docker 中运行的应用程序在构建期间读取 CodeBuild 阶段设置的变量(环境属性)——一个构建号。我该怎么做?

我在pre_build:commandsbuildspec.yml 中设置了APPLICATION_BUILDNUMBER 变量,并将其列在exported-variables 下。然后它出现在 AWS 控制台中 CodeBuild Build status 下的 Environment Variables 选项卡下 Exported environment variables 下,并带有所需的值。

现在我如何在 Beanstalk 的 docker 中运行的应用程序中读取它,这是一个 Spring Boot 应用程序 (JAR)? 当我在 Beanstalk > 配置 > 软件 > 环境属性中手动设置变量 APPLICATION_BUILDNUMBER 时,我可以轻松读取它。但我不知道,如何从 CodeBuild 传递它。

【问题讨论】:

    标签: amazon-web-services amazon-elastic-beanstalk aws-codepipeline


    【解决方案1】:

    快速查看 Elastic Beanstalk 操作 1 的配置属性,它无法从外部源获取环境属性。

    解决方法可以是:

    一个。通过 CodeBuild 操作设置 SSM 参数存储变量,然后

    b.读取 Elastic Beanstalk 环境“钩子”中的 SSM 参数值并导出到环境中。

    对于:从 CodeBuild 构建规范运行此命令:

    $ aws ssm put-parameter --name "parameter-name" --type String --value "parameter-value"
    

    对于 b:

    您可以在 /opt/elasticbeanstalk/hooks/appdeploy/pre/ 中部署 hooks 文件。通过 ebextension 'files' 构造 2 创建挂钩脚本。从 SSM 或 Secrets Manager 获取密钥并将密钥导出到系统的最小挂钩脚本如下所示:

    #!/usr/bin/env bash
    set -e
    
    export MySecret=$(aws ssm get-parameters ---blah --blah......... )
    

    不用说,CodeBuild 服务角色和 EC2 实例角色(与 EB 一起使用)需要具有所需的权限:

    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": [
                    "ssm:GetParameters",
                    "ssm:GetParameter",
                    "ssm:PutParameter",
                    "secretsmanager:GetSecretValue",
                    "kms:Decrypt"
                ],
                "Resource": [
                    "arn:aws:ssm:*:*:*",
                    "arn:aws:secretsmanager:*:*:*",
                    "arn:aws:kms:*:*:*"
                ]
            }
        ]
    }
    

    【讨论】:

    • 谢谢。看起来相当复杂。在构建阶段生成的 Dockerrun.json 中传递 docker run 参数怎么样?
    • 好主意,但 Dockerrun.json 不允许添加环境变量,如任务定义。您可以使用 commands 参数:docs.aws.amazon.com/elasticbeanstalk/latest/dg/…
    • 我发现在我的情况下无法使用 Dockerrun.json 中的命令部分。由 maven Spring Boot build-image 构建的 docker 镜像具有“/cnb/lifecycle/launcher”入口点。该命令不带参数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-17
    • 2021-02-07
    • 1970-01-01
    • 2017-06-25
    • 2021-12-05
    • 1970-01-01
    • 2016-07-31
    相关资源
    最近更新 更多