首页 > 解决方案 > AWS CodeBuild 作为非 root 用户

问题描述

有没有办法在AWS CodeBuildroot上删除用户?如果我们是 root(Bitbake 健全性检查),我们正在构建一个在 CodeBuild 上失败的 Yocto 项目。

我们绝望的方法也不起作用:

...

build:
  commands:
    - chmod -R 777 $(pwd)/ && chown -R builder $(pwd)/ && su -c "$(pwd)/make.sh" -s /bin/bash builder
...

失败:

bash: /codebuild/output/src624711770/src/.../make.sh: Permission denied

知道我们如何以非 root 用户运行它吗?

标签: amazon-web-servicesyoctobitbakeaws-codebuild

解决方案


我在 AWS CodeBuild 中成功使用了非 root 用户。
想出一个实用的解决方案不仅仅需要了解一些 CodeBuild 选项。

每个人都应该很容易发现run-as选项。 下一个问题是“哪个用户?”;您不能只将任何单词作为用户名。

为了找出可用的用户,下一个线索是CodeBuild部分提供的 Docker 映像。在那里,您会找到每个图像定义的链接。对我来说,这个链接将我带到GitHub 上的这个页面。
查看 的源代码后Dockerfile,我们会知道有一个名为codebuild-useravailable 的用户。我们可以在构建规范中使用它codebuild-userrun-as

然后我们将面临很多其他问题,因为标准映像仅安装每种语言的运行时root。这是一般解释所能做到的。

对我来说,我想使用 Ruby 运行时,所以我唯一关心的是 Ruby 运行时。如果您将 CodeBuild 用于其他用途,那么您现在就靠自己了。

为了将 Ruby 运行时用作codebuild-user,我们必须从 root 用户公开它们。为此,我.rbenv使用以下命令更改 CodeBuild 映像使用的所需权限和所有者。

chmod +x ~
chown -R codebuild-user:codebuild-user ~/.rbenv

 
bundlerRuby的依赖管理工具)还是要访问主目录,这个是不可写的。我们必须设置一个环境变量以使其使用其他可写位置作为主目录。环境变量是BUNDLE_USER_HOME.

把所有东西放在一起;我的构建规范看起来像:

version: 0.2

env:
  variables:
    RAILS_ENV: test
    BUNDLE_USER_HOME: /tmp/bundle-user
    BUNDLE_SILENCE_ROOT_WARNING: true

run-as: codebuild-user

phases:
  install:
    runtime-versions:
      ruby: 2.x
    run-as: root
    commands:
      - chmod +x ~
      - chown -R codebuild-user:codebuild-user ~/.rbenv
      - bundle config set path 'vendor/bundle'
      - bundle install
  build:
    commands:
      - bundle exec rails spec

cache:
  paths:
    - vendor/bundle/**/*

我的观点是:

  • 这确实是可能的。
  • 展示我是如何为我的用例做的。

推荐阅读