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

时间:2017-09-13 05:37:11

标签: amazon-web-services aws-lambda serverless-framework aws-codepipeline aws-codebuild

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

如您所见,我使用 codePipeline codeBuild 来自动部署。我的后端基于Serverless Framework,它在触发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

现在,我有 3个问题关于 CodeBuild 无服务器

问题1:命令sls deploy取决于名为config.yml的文件,其中包含密码,例如db password。此文件不会被检入git。您认为在codeBuild中包含config.yml的最佳方法是什么?

问题2: 回滚可以通过AWS完成,前提是我们必须使用 codeDeploy 部署传统的EC2应用程序。对于无服务器,我们不使用 codeDeploy ,无服务器也支持回滚功能。我们如何在 codePipeline 中利用无服务器回滚?

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

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

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

回答2:我想不出这个黑客。寻找你的答案。

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

2 个答案:

答案 0 :(得分:6)

问题1

更新

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

示例:

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}

原始答案:

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

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

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

问题2

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

问题3

CodePipelines与单个分支相关联,因此要使其在PR分支上运行,您必须像您提到的文章那样进行黑客攻击。我已经使用 API网关 + Lambda + CodeBuild (没有 CodePipeline )来执行此操作。

答案 1 :(得分:0)

只需添加到问题1的已接受答案(感谢@dashmug和@Lakshman Diwaakar)

这确实阐明了如何将参数存储值添加到Lambda中。但是,这些值在Lambda控制台中显示为纯文本。我接下来需要弄清楚如何添加加密。

参数存储

AWS Systems Manager>参数存储

中将环境变量添加为参数

https://eu-west-1.console.aws.amazon.com/systems-manager/parameters

buildspec.yml

version: 0.2    
phases:
  install:
    commands:
      - npm install
      - npm install -g serverless
  build:
    commands:
      - serverless deploy

serverless.yml

在serverless.yml中引用创建的参数

为安全字符串附加〜true。

provider:
  name: aws
  runtime: nodejs6.10
  region: eu-west-1
  stage: prod
  environment:
    FOO: ${ssm:/app/production/foo}
    DB_USERNAME: ${ssm:/app/production/myDatabase/username~true}
    DB_PASSWORD: ${ssm:/app/production/myDatabase/password~true}

handler.js

在处理程序中使用环境变量

export async function main (event, context, callback) {

  console.log('process.env.FOO', process.env.FOO)
  console.log('process.env.DB_USERNAME', process.env.DB_USERNAME)
  console.log('process.env.DB_PASSWORD', process.env.DB_PASSWORD)

  callback(null, ok('success'))
}