15

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

如您所见,我正在使用codePipelinecodeBuild来自动化我的部署。我的后端基于无服务器框架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 个关于CodeBuildServerless的问题:

问题1:该命令sls deploy依赖于一个名为的文件,该文件config.yml包含数据库密码等机密。该文件不会被检入 git。您认为包含config.yml在 codeBuild 中的最佳方式是什么?

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

问题 3:Pull Request发生时触发 codePipeline 。我看到一些帖子说,codePipeline 不支持。但是这些帖子是去年的,codePipeline 现在是否支持 Pull Request?

破解答案(不正确,但有效。需要您提供更好的答案。)

答案 1:config.yml文件可以保存在私有S3 存储桶中,并且可以作为设置的一部分拉到 codeBuild,pre-build或者我们可以将所有机密添加到 codeBuild 的 Env 变量。我不喜欢第二种选择,因为我希望在所有环境中保持一致。这个问题有更好的解决方案吗?

答案 2:我想不出有什么破解之法。期待你的答案。

答案 3:我看到一些博客文章使用[APIGateway + Lambda + S3]来触发codePipeline以进行拉取请求。但我觉得,这个功能必须作为开箱即用的功能提供。此功能的 codePipeline 是否有任何更新?

4

2 回答 2

9

问题 1

更新:

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

例子:

无服务器.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 Parameter Store 中,您可以在 CodeBuild 中引用这些变量buildspec.yml。这些变量可以在您的serverless.ymlusing中访问${env:VARIABLE_NAME}

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

问题2

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

问题 3

CodePipelines 绑定到单个分支,因此要使其在 PR 分支上工作,您必须像您提到的文章那样进行黑客攻击。我已经求助于使用API Gateway + Lambda + CodeBuild (No CodePipeline ) 来做到这一点。

于 2017-09-13T13:16:09.430 回答
0

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

这确实解决了如何将 Parameter Store 值获取到您的 Lambda 中。但是,这些值在 Lambda 控制台中显示为纯文本。我接下来需要解决的是如何添加加密。

参数存储

在AWS Systems Manager > Parameter store中添加您的环境变量作为参数

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

构建规范.yml

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

无服务器.yml

在 serverless.yml 中引用创建的 Params

为安全字符串附加 ~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'))
}
于 2018-07-19T14:26:10.480 回答