具有无服务器框架的AWS codeBuild/codePipeline

Lak*_*kar 13 amazon-web-services aws-lambda aws-codepipeline serverless-framework aws-codebuild

我正在尝试为我的应用程序自动化部署管道.这是自动化架构,我想出了: 自动化架构

如您所见,我使用codePipelinecodeBuild来自动部署.我的后端基于无服务器框架,它在kick sls deploy命令上部署lambda函数.这就是我没有使用codeDeploy进行传统部署的原因.buildspec.yml文件看起来像这样:

version: 0.1

phases:
  install:
    commands:
      – apt-get -y update
      – npm install -g serverless@1.9.0
  build:
    commands:
      – cd nj2jp/serverless && npm install
  post_build:
    commands:
      – serverless deploy –verbose

artifacts:
  files:
    – serverless.yml
  discard-paths: yes
Run Code Online (Sandbox Code Playgroud)

现在,我有3个关于CodeBuildServerless的问题:

问题1:该命令sls deploy取决于一个名为config.ymldb password的秘密.此文件不会被检入git.您认为config.yml在codeBuild中包含的最佳方式是什么?

问题2: 如果我们必须使用codeDeploy部署传统的EC2应用程序,则可以使用AWS完成回滚.在无服务器的情况下,我们不使用codeDeploy,无服务器也支持回滚功能.我们如何在codePipeline中利用无服务器回滚?

问题3:发生Pull Request时触发codePipeline .我看到一些帖子说,codePipeline不支持它.但那些帖子来自去年,现在是否由CodePipeline支持Is Pull Request?

黑客答案(不正确,但有效.需要更好的答案.)

答1:config.yml文件可以保存在一个私人的S3存储桶,可以拉到codeBuild作为一部分pre-build的设置或我们可以添加所有秘密codeBuild的信封变量.我不喜欢第二个选项,因为我想在所有环境中保持一致.对这个问题有更好的解决方案吗

答案2:我想不出这个问题.寻找你的答案.

答案3:我遇到了一些使用[APIGateway + Lambda + S3]触发codePipeline拉取请求的博文.但我觉得,这个功能必须作为一个开箱即用的功能提供.codePipeline上是否有针对此功能的更新?

das*_*mug 7

问题1

更新:

无服务器框架现在支持从Parameter Store引用变量.这意味着您可以跳过在CodeBuild中定义它们,因为无服务器将在部署时从Parameter Store检索它们.

例:

serverless.yaml

provider:
  name: aws
  runtime: nodejs8.10
  region: us-west-2
  stage: ${env:REGION}
  environment:
    S3_BUCKET: ${env:/s3/bucket}
    # Use ~true for SecureString parameters
    DB_USERNAME: ${ssm:/db/username~true}
    DB_PASSWORD: ${env:/db/password~true}
Run Code Online (Sandbox Code Playgroud)

原答案:

如果你想坚持下去config.yml,那么让它发挥作用的唯一方法就是通过类似于你已经在做的黑客攻击,因为它不受版本控制.

我建议将您的环境变量存储在EC2参数存储中,您可以在CodeBuild中引用它buildspec.yml.您可以在serverless.yml使用中访问这些变量${env:VARIABLE_NAME}.

对于本地开发,您还应该使用真实环境变量而不是存储它们config.yml.像direnv这样的工具在这方面很棒.

问题2

您可以通过重新运行以前的CodeBuild作业来进行手动回滚.我想不出像CodeDeploy那样自动执行的简单方法.也许Lambda函数可以执行部署后测试,如果失败,它可以触发重新运行以前的CodeBuild作业.

问题3

CodePipelines与一个分支相关联,因此要使它在PR分支上运行,你必须像你提到的文章一样做.我已经使用API Gateway + Lambda + CodeBuild(No CodePipeline)来执行此操作.