无法在AWS Codebuild中运行`source`

时间:2017-06-28 18:41:18

标签: bash amazon-web-services terraform aws-codebuild

我正在使用AWS CodeBuild和Terraform自动部署基于Lambda的服务。我有一个非常简单的buildscript.yml来完成以下任务:

  • 获取依赖关系
  • 运行测试
  • 获取AWS凭据并保存到文件(详见下文)
  • 来源信用档案
  • 运行Terraform

步骤"来源于信用卡文件"是我遇到困难的地方。我有一个简单的bash单行程序,它抓取curl 169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI的AWS容器信誉,然后按以下格式将它们保存到文件中:

export AWS_ACCESS_KEY_ID=SOMEACCESSKEY
export AWS_SECRET_ACCESS_KEY=MYSECRETKEY
export AWS_SESSION_TOKEN=MYSESSIONTOKEN

当然,显而易见的一步是简单地source这个文件,这样就可以将这些变量添加到我的环境中供Terraform使用。但是,当我执行source /path/to/creds_file.txt时,CodeBuild会返回:

[Container] 2017/06/28 18:28:26 Running command source /path/to/creds_file.txt
/codebuild/output/tmp/script.sh: 4: /codebuild/output/tmp/script.sh: source: not found

我尝试通过source安装apt,但后来收到错误消息,指出无法找到source(是的,我已经apt update等)。我在CodeBuild的Python 2.7环境中使用标准的Ubuntu映像。如何在Codebuild中获取源凭据文件的Terraform工作凭据。

谢谢!

5 个答案:

答案 0 :(得分:9)

尝试使用.代替sourcesource不符合POSIX标准。 ss64.com/bash/source.html

答案 1 :(得分:4)

AWS CodeBuild图片附带POSIX兼容shell。您可以在此处查看图片中的内容:https://github.com/aws/aws-codebuild-docker-images

如果您正在使用特定的shell功能(例如源代码),最好将命令包装在脚本文件中,并指定要执行命令的shell,然后再执行该命令。从buildspec.yml执行此脚本。

build-script.sh

     #!/bin/bash
      <commands>
      ...

buildspec.yml(摘录)

build: commands: - path/to/script/build-script.sh

答案 2 :(得分:4)

CodeBuild现在支持bash作为默认Shell。您只需要在buildspec.yml中指定它即可。

env:
  shell: bash

参考:https://docs.aws.amazon.com/codebuild/latest/userguide/build-spec-ref.html#build-spec-ref-syntax

答案 3 :(得分:2)

我有一个类似的问题。我是通过直接通过/bin/bash <script>.sh

调用脚本来解决的

答案 4 :(得分:0)

我的评论没有足够的声誉,因此在这里它是对jeffrey的回答的扩展。

如果您的文件名以点号(。)开头,则以下操作将失败

. .filename

您需要使用目录名来限定文件名,例如

 . ./.filename