AWS Eventbridge:使用环境变量覆盖安排 CodeBuild 作业

AWS Eventbridge: scheduling a CodeBuild job with environment variable overrides

当我从 Web 界面启动 AWS CodeBuild 项目时,我可以选择“开始构建”以使用其正常配置启动构建项目。或者我可以选择“Start build with overrides”,这让我可以为构建作业指定自定义环境变量。

从 AWS EventBridge(事件 -> 规则 -> 创建规则),我可以创建一个计划事件来触发代码构建作业,这很有效。 如何在 EventBridge 中为计划的 CodeBuild 作业指定环境变量覆盖?

我认为可以通过使用“附加设置”->“配置目标输入”以某种方式实现,它允许对事件进行规范和模板化 JSON。我不确定如何解决这个 JSON 应该是什么样子(在我的例子中覆盖环境变量)。换句话说,我在哪里可以找到发送到 CodeBuild 的事件的 JSON 规范?

这里有很多类似的问题:例如 and AWS Cloudwatch (EventBridge) Event Rule for AWS Batch with Environment Variables , but I can't find the specifics for CodeBuild jobs. I've tried the CDK docs at e.g. https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_events_targets.CodeBuildProjectProps.html ,但我有点聪明。我还尝试捕获 EventBridge 输出的事件,以查看没有覆盖的事件是什么样的,但没有管理。提交以下内容(以及一些变体:例如作为“详细信息”)作为“输入常量”触发作业,但环境变量不会生效:

{
  "ContainerOverrides": {
    "Environment": [{
      "Name": "SOME_VAR",
      "Value": "override value"
    }]
  }
}

https://docs.aws.amazon.com/codebuild/latest/APIReference/API_StartBuild.html#API_StartBuild_RequestSyntax 处还有 CodeBuild API 参考。编辑:这似乎是正确的参考(根据我在下面的回答)。

我使用这样的“输入常量”让它工作:

{
  "environmentVariablesOverride": [{
    "name": "SOME_VAR",
    "type": "PLAINTEXT",
    "value": "override value"
  }]
}

换句话说,您可以忽略 EventBridge 示例事件中的字段,并且不需要在“详细信息”字段中指定覆盖。

我使用 https://docs.aws.amazon.com/codebuild/latest/APIReference/API_StartBuild.html#API_StartBuild_RequestSyntax 上的代码构建“StartBuild”API 文档找到了这种格式。我假设(但尚未测试)此处显示的其他字段的工作方式类似(并且其他服务的 API 引用在使用 EventBridge 时的工作方式类似:任何人都可以确认吗?)。

规则目标的 event input template should match the structure of the CodeBuild API StartBuild action input. In the StartBuild action, environment variable overrides have a key of "environmentVariablesOverride" and value of an array of EnvironmentVariable 个对象。

这是一个示例目标输入转换器,其中一个是常量环境变量,另一个是其值取自事件负载的 detail-type:

输入路径:

{ "detail-type": "$.detail-type" }

输入模板:

{"environmentVariablesOverride": [
  {"name":"MY_VAR","type":"PLAINTEXT","value":"foo"},
  {"name":"MY_DYNAMIC_VAR","type":"PLAINTEXT","value":<detail-type>}]
}