无法在AWS Codebuild中运行`source`命令

21

我正在使用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

我尝试通过 apt 安装 source,但是我收到一个错误,提示找不到 source(是的,我运行了 apt update 等命令)。我正在使用标准的 Ubuntu 映像和 Python 2.7 环境进行 CodeBuild。我应该怎么做才能让 Terraform 能够在 Codebuild 中使用这个凭证文件?

谢谢!


2
你尝试过使用 . 代替 source 吗? source 不是 POSIX 标准 https://ss64.com/bash/source.html - jeffrey
1
搞定了!非常感谢!顺便问一下,AWS容器是否严格遵循POSIX标准?(如果您将您的评论转换成答案,我会接受并关闭) - Tanishq dubey
2
这是一个好问题,我认为他们只是进行原始的 shell 调用,而不是 bash 或其他类似的东西,但我不确定。直到某个大师告诉我 source. 的常见别名,我一直以为是反过来的。 - jeffrey
5个回答

24

15

4

我也遇到了类似的问题。我通过直接使用/bin/bash <script>.sh命令调用脚本解决了它。


4

我没有足够的声望来评论,因此这里是对Jeffrey答案的扩展,很到位。

如果您的文件名以点(.)开头,则以下内容将失败。

. .filename

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

 . ./.filename

4
AWS CodeBuild镜像配备了一个POSIX兼容的shell。您可以在此处查看镜像中的内容:https://github.com/aws/aws-codebuild-docker-images
如果您正在使用特定的shell功能(例如source),最好将命令包装在一个脚本文件中,并在shebang中指定要执行命令的shell,然后从buildspec.yml执行此脚本。
build-script.sh
     #!/bin/bash
      <commands>
      ...

buildspec.yml(片段)

构建: 命令: - path/to/script/build-script.sh


2
有趣,谢谢您澄清。我一直能够在我的Linux/UNIX机器上使用“source”,所以从未多想过。目前,我们已经在脚本上采用了POSIX规范,以确保完全兼容性。 - Tanishq dubey
1
除非你正在编写只能使用bash完成的东西,或者使用非POSIX兼容性更强的东西更加高效,否则坚持使用POSIX对于可移植性是一个好主意。 - theherk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接