首页 > 解决方案 > 如何将变量(环境属性)从 CodeBuild 传递到 CodePipeline 中的 Beanstalk 应用程序?

问题描述

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

现在,我希望在 docker 中运行的应用程序在构建期间读取 CodeBuild 阶段设置的变量(环境属性)——一个内部版本号。我怎样才能做到这一点?

我在in 中设置APPLICATION_BUILDNUMBER了变量并将其列在. 然后它出现在 AWS 控制台中 CodeBuild Build status下 Environment Variables 选项卡下Exported environment variables with desired value 下。buildspec.ymlpre_build:commandsexported-variables

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

标签: amazon-web-servicesamazon-elastic-beanstalkaws-codepipeline

解决方案


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

解决方法可以是:

一个。从您的 CodeBuild 操作中设置 SSM 参数存储变量,然后

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

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

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

对于 b:

您可以在 /opt/elasticbeanstalk/hooks/appdeploy/pre/ 中部署挂钩文件。通过 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:*:*:*"
            ]
        }
    ]
}

推荐阅读