标签: aws-codebuild

如何在CodePipeline中处理多个环境?

我正在使用代码管道来部署我的基础架构,我希望能够在不同的环境(dev,staging,prod,...)中部署它.

我目前有一个buildspec.yml文件,其中包含一些"pip install"指令和"aws cloudformation package"命令.我还创建了2个管道,一个用于生产,另一个用于开发,指向github上的2个不同分支.我遇到的问题是,因为在两个分支中文件都包含类似的资源,例如我在S3存储桶上有名称冲突.

使用AWS CLI和cloudformation创建或更新堆栈时,您可以使用--parameters选项传递参数.我想在我创建的2个管道中做类似的事情.

解决这个问题的最佳解决方案是什么?

最终目标是自动化基础架构的部署.我们的基础设施由用户,KMS密钥,Lamdbas(在python中),组和桶组成.

我按照教程创建了两个管道:http://docs.aws.amazon.com/lambda/latest/dg/automating-deployment.html

第一个管道链接到包含代码的repo的主分支,第二个管道链接到分段分支.我的目标是使用第一个管道和登台环境中的暂存分支,使用第二个管道在生产环境中自动部署主分支.

我的buildspec.yml文件看起来像:

version: 0.1
phases:
    install:
        commands:
            - pip install requests -t .
            - pip install simplejson -t .
            - pip install Image -t .
            - aws cloudformation package --template-file image_processing_sam.yml --s3-bucket package-bucket --output-template-file new_image_processing_sam.yml
artifacts:
    type: zip
    files:
        - new_image_processing_sam.yml
Run Code Online (Sandbox Code Playgroud)

image_processing_sam.yml文件如下所示:

AWSTemplateFormatVersion: "2010-09-09"
Transform: "AWS::Serverless-2016-10-31"
Description: Create a thumbnail for an image uploaded to S3
Resources:

  ThumbnailFunction:
    Type: "AWS::Serverless::Function"
    Properties:
      Role: !GetAtt LambdaExecutionRole.Arn
      Handler: create_thumbnail.handler
      Runtime: …
Run Code Online (Sandbox Code Playgroud)

amazon-web-services aws-lambda aws-codepipeline aws-codebuild

7
推荐指数
1
解决办法
5151
查看次数

处理AWS CodePipeline中的运行时和构建时间机密

我们正在处理为使用AWS CodePipeline构建并部署到ECS的应用程序提供构建时间和运行时机密的问题.

最终,我们的愿景是为每个应用程序创建一个通用管道,以实现以下目标:

  • 完全分离访问权限
    • app-a-pipeline中的服务无法访问任何凭据或使用app-b-pipeline中使用的任何密钥,反之亦然
  • 分配开发人员的秘密管理
    • 只有负责app-a的开发人员才能读取和写入app-a的秘密

以下是手头的问题:

  • 我们的一些应用程序需要访问私有存储库以在构建时进行依赖项解析例如,我们的Java应用程序需要访问私有maven存储库才能成功构建
  • 我们的一些应用程序在运行时需要数据库访问凭据例如,运行我们的应用程序的servlet容器需要一个包含凭据的.xml配置文件来查找和访问数据库

除了一些警告:

  • 我们的代码库位于公共存储库中.我们不希望通过在我们的存储库中放置秘密的明文或密文来暴露秘密
  • 即使ECR访问受到限制,我们也不希望将运行时机密烘焙到我们在CodeBuild中创建的Docker镜像中
  • ECS资源的Cloudformation模板及其相关参数文件以纯文本格式驻留在公共存储库中.这消除了通过参数将运行时机密传递到ECS Cloudformation模板的可能性(据我所知)

我们已经考虑使用像credstash这样的工具来帮助管理凭据.此解决方案要求CodeBuild和ECS任务实例都能够使用AWS CLI.为了避免改组更多凭据,我们认为最好将特权角色分配给需要使用AWS CLI的实例.这样,CLI就可以从实例元数据中的角色推断凭据

考虑到这些限制,我们试图设法管理我们的秘密.对于每个应用程序,我们创建一个管道.使用Cloudformation模板,我们创建:

  • 4资源:

    • DynamoDB凭据表
    • KMS凭证密钥
    • ECR回购
    • CodePipeline(构建,部署等)
  • 3个角色:

    • CodeBuildRole对DynamoDB凭证表的读访问权限使用KMS密钥解密权限写入ECR仓库
    • ECSTaskRole对DynamoDB凭证表的读访问权限使用KMS密钥解密权限从ECR仓库读取
    • DeveloperRole对DynamoDB凭据表的读写访问权限使用KMS密钥加密和解密权限

CodePipeline的CodeBuild步骤假定CodeBuildRole允许它从凭证表中读取构建时间机密.CodeBuild然后构建项目并生成一个Docker Image,它将其推送到ECR.最后,部署步骤使用Cloudformation模板和项目公共存储库中存在的附带参数文件创建ECS服务ECS任务定义包括假设ECSTaskRole允许任务从凭证表读取运行时机密并提取所需图像来自ECR.

以下是AWS资源及其关系的简单图表

我们当前提出的解决方案存在以下问题:

  • 角色沉重
    • 创建角色是我们组织中的特权行为.并非所有尝试创建上述管道的开发人员都有权创建必要的角色
  • 手动假设DeveloperRole:
    • 目前,开发人员需要手动承担DeveloperRole.我们玩弄了将开发者用户ARN列表作为参数传递给管道Cloudformation模板的想法.Cloudformation是否具有将角色或策略分配给指定用户的机制?

是否有更成熟的方法来传递我们可能忽略的CodePipeline中的秘密,或者这是我们能得到的最好的方法?

credentials amazon-ecs aws-codepipeline aws-codebuild

7
推荐指数
1
解决办法
1386
查看次数

AWS CodeBuild中的Python 3.6不可用,AWS Lambda中的Python 3.5不可用

我有一个Python 3项目,我试图通过AWS Codestar部署到AWS Lambda - > Codepipeline - > Codebuild - > Cloudformation.

我的项目(实际上只包含一个简单的API网关处理程序方法)导入了Python 3(需要3个)项目(报纸).我在家用电脑上使用Virtualenv 15.1.0,如果我使用Python 3.5安装Newspaper然后上传到Lambda(Python 3.6运行时),它会抛出与PIL/Pillow相关的错误.

首先它说它找不到_image,这似乎是通过删除site-packages中的PIL目录来解决的,但这只会导致它抛出无法找到PIL的错误.

但是,如果我使用Python 3.6构建然后上传到Lambda,它可以正常工作(无论我是否删除PIL).

所以,在我看来,我无法使用3.5安装Newspaper并尝试在3.6运行时执行.

所以,现在我试图通过Codestar进行部署,但Codestar似乎默认为aws/codebuild/eb-nodejs-4.4.6-amazonlinux-64:2.1.3,即使对于Python项目,它似乎都可用于Yum存储库是Python 3.5,当然Lambda只有3.6运行时.

即使我在Codebuild本身内切换图像,似乎也没有使用Python3.6运行时构建的任何图像(根据文档).甚至Docker图像似乎也缺乏Python 3.6.

所以,我试图在我的buildspec.yml文件的INSTALL阶段在Codebuild中安装Python 3.6,但是在安装后我找不到python3*可执行文件.

我能想到的唯一另一件事是创建Codestar项目,编辑codebuild以使用Ubuntu然后安装所有东西(就像我在本地做的那样),但是没有办法在Codestar中做到这一点,我觉得这可能带来我在一个兔子洞里,这很难自动化.有没有办法将该配置作为我项目中的代码?

编辑 尝试从源代码构建和安装Python 3.6,但是当尝试安装Pip时,我收到错误,说没有安装SSL.回顾构建日志时,似乎还没有安装其他"位".

所以,我的问题是:

  • 如何将Python 3.6引入Codestar项目中的Codebuild环境?
  • 我应该继续尝试从源代码构建它还是切换到Ubuntu环境?
  • 如何在代码/项目中自动配置图像/环境?

编辑1对于其他任何人,我的完整的buildspec.yml用于安装和使用Python3.6如下.请注意,它可以使一切尽可能安静,以减少日志消息,降低Cloudwatch成本并加快流程.通过这样做(安装Python并构建我的应用程序),我最终在整个过程中大约缩短了90秒.由于CodeBuild根据花费的时间收费,因此这一点至关重要.

version: 0.2

phases:
  install:
    commands:
      - yum -qye 0 update
      - yum -qye 0 groupinstall development
      - yum -y install python-devel
      - yum -qye 0 install libxml2-devel libxslt-devel libjpeg-devel zlib-devel libpng-devel openssl-devel sqlite-devel
      - export HOME_DIR=`pwd`
      # I would recommend hosting …
Run Code Online (Sandbox Code Playgroud)

python amazon-web-services aws-lambda aws-codebuild aws-codestar

7
推荐指数
2
解决办法
2890
查看次数

通过aws codebuild为nodejs lambda创建zip文件的问题

我想通过aws codebuild进程为我的nodejs lambda创建一个zip工件 - 这样lambda函数可以在S3中使用这个zip文件作为源代码,我们在codebuild中使用git commit id进行管理的部署"证明"

我在github-repo中的文件结构是

folder1
   - myfile.js
   - otherfile.js
folder2
   - otherfiles.js
package.json
Run Code Online (Sandbox Code Playgroud)

现在对于nodejs lambda项目我想要没有zip文件夹的zip文件(我们需要lambda中的nodejs项目)所以zip应该直接包含以下文件

- myfile.js
- node_module ==> folder from codebuild via npm install command 
Run Code Online (Sandbox Code Playgroud)

问题:

1)S3中的输出zip包含在文件夹即.zip-> rootfolder-> myfile.js而不是我们需要.zip-> myfiles.js这对于lambda是不可用的,因为对于nodejs它应该有root zip文件而不是里面他们(文件夹内没有相对路径)

2)路径 - 你可以看到myfile.js在一个文件夹里面我想要相对路径被省略 - 我试过丢弃路径但问题是所有的node_module文件也在文件夹而不是在文件夹中,因为丢弃路径适用于两者 - 我可以只为myfile.js而不是为node_module文件夹设置discard路径吗?我目前的yaml文件:

artifacts:
  files:
    - folder/myfile.js
    - node_modules/**/*
  discard-paths: yes 
Run Code Online (Sandbox Code Playgroud)

如果有人可以为此提供解决方案,那会很棒吗?

如果解决方案不包含更改github-repo文件夹结构并且我想在该repo中为其他文件重复此操作以创建其他lambda函数,那将是很好的.

编辑:

我使用下面的yaml文件,@awsnitin回答后一切正常

version: 0.2

phases:
  build:
    commands:
      - echo Build started on `date`
      - npm install
  post_build:
    commands:
      - echo Running post_build commands
      - mkdir build-output …
Run Code Online (Sandbox Code Playgroud)

amazon-web-services node.js aws-lambda aws-codebuild

7
推荐指数
1
解决办法
3181
查看次数

访问AWS CodePipeline中的AWS CodeBuild变量

我正在尝试使用AWS CodeBuild Id作为我的docker镜像的标记.此docker镜像是在CodeBuild的构建阶段构建的.我想在AWS Code Pipeline阶段获得这个Coudebuild Id,这是我的docker标记.如何在aws codepipeline中访问这些codebuild环境变量?

CodeBuild阶段:

CodeBuildProject:
Type: AWS::CodeBuild::Project
Properties:
  Artifacts:
    Location: !Ref ArtifactBucket
    Type: "S3"
  Source:
    Location: !Sub ${ArtifactBucket}/source.zip
    Type: "S3"
    BuildSpec: |
      version: 0.1
      phases:
        pre_build:
          commands:
            - $(aws ecr get-login --region $AWS_DEFAULT_REGION)
            - sudo apt-get update
            - echo Pulling maven image...
            - docker pull maven:3.3-jdk-8
            - echo done with the pre build phase
        build:
          commands:
            - echo Build started on `date`
            - printf "%s" $REPOSITORY_URI
            - docker run -i --rm -w /opt/maven -v $PWD:/opt/maven -v …
Run Code Online (Sandbox Code Playgroud)

amazon-web-services aws-codepipeline aws-codebuild

7
推荐指数
1
解决办法
1793
查看次数

在CodePipeline中获取提交ID

我使用CodePipelineCodeCommit。按下master分支自动触发构建。在CodePipeline控制台中,可以清楚地看到我正在接收提交ID,但是我需要在构建环境中获取它,以便在构建它时可以将它们作为标签添加到ECS映像中。有没有一种进入构建环境的方法。 这是我要找的身份证

continuous-integration amazon-web-services continuous-deployment aws-codepipeline aws-codebuild

7
推荐指数
3
解决办法
2700
查看次数

无法创建AW​​S CodeBuild Webhook

我正在尝试通过AWS CodeBuild创建一个webhook,这是我收到的错误.

这是错误 我还尝试使用以下命令通过AWS CLI创建webhook:

aws codebuild create-webhook --project-name myClassifiedProjectName
Run Code Online (Sandbox Code Playgroud)

我得到同样的错误:

An error occurred (OAuthProviderException) when calling the CreateWebhook operation: Unable to create webhook at this time. Please try again later.
Run Code Online (Sandbox Code Playgroud)

有什么建议?

webhooks amazon-web-services aws-codebuild

7
推荐指数
3
解决办法
2330
查看次数

Puppeteer 无法在 AWS CodeBuild 上运行 Chrome

我正在使用 Karma 使用 ChromeHeadless 测试 Angular4 项目,并且在本地一切正常。然后我尝试让它在 AWS CodeBuild 上运行。最初的问题是 CodeBuild VM 不包含 chrome headless,所以我包含了 Puppeteer npm 包并在 Karma conf 中相应地设置了 ENV Var。这在本地仍然可以正常工作,但是在 AWS CodeBuild 上我收到错误...

puppeteer/.local-chromium/linux-526987/chrome-linux/chrome: error while loading shared libraries: libXss.so.1: cannot open shared object file: No such file or directory

构建是从执行 maven 的标准 buildspec.yml 触发的mvn -B package。角度构建/测试是使用 eislett/frontend-maven-plugin (v1.4) 从 maven 完成的。

Puppeteer v1.0.0 Node v6.10.1 Karma v1.7.1 AWS CodeBuild - Ubuntu / Java / OpenJDK 8

我看过其他关于在 CI 机器上进行额外安装的帖子,但 CodeBuild 在每次运行时都会启动一个干净的 VM,所以这不是一个选项。有什么建议!?

karma-jasmine aws-codebuild angular google-chrome-headless puppeteer

7
推荐指数
3
解决办法
3243
查看次数

AWS Codebuild将所有工件放在S3存储桶的根目录中

我正在构建一个项目,将所有文件放在'dist'文件夹中,并通过CodeBuild运行它.我试图让它将'dist'中的所有文件和文件夹放入s3存储桶的根目录中,但是我无法弄清楚如何使其工作.

我的'dist'文件夹看起来像这样:

- index.html - somecssfiles.css - fonts/ - - some fonts or w/e - js/ - - some javascript files

我已经尝试了很多不同的东西,但似乎无法让它只是将'dist/*'放入s3存储桶的根目录中.这是artifacts在buildspec.yml文件中我的属性的当前迭代:

artifacts: files: - '*' discard-paths: yes base-directory: 'dist'

我认为这可能会奏效,但它忽略了文件夹.任何帮助表示赞赏,感谢阅读.

aws-codebuild

7
推荐指数
2
解决办法
4935
查看次数

如何增加AWS lambda部署程序包(RequestEntityTooLargeException)的最大大小?

我从AWS Codebuild上传了我的lambda函数源。我的Python脚本使用NLTK,因此需要大量数据。我的.zip软件包太大,RequestEntityTooLargeException发生了。我想知道如何增加通过UpdateFunctionCode命令发送的部署包的大小。

AWS CodeBuild用来将源代码从GitHub存储库转换为AWS Lambda。这是关联的buildspec文件:

version: 0.2
phases:
 install:
   commands:
     - echo "install step"
     - apt-get update
     - apt-get install zip -y
     - apt-get install python3-pip -y
     - pip install --upgrade pip
     - pip install --upgrade awscli
     # Define directories
     - export HOME_DIR=`pwd`
     - export NLTK_DATA=$HOME_DIR/nltk_data
 pre_build:
   commands:
     - echo "pre_build step"
     - cd $HOME_DIR
     - virtualenv venv
     - . venv/bin/activate
     # Install modules
     - pip install -U requests
     # NLTK download
     - pip …
Run Code Online (Sandbox Code Playgroud)

amazon-web-services aws-lambda aws-codebuild

7
推荐指数
7
解决办法
3319
查看次数