首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无服务器结构的AWS码建/编解码管道

无服务器结构的AWS码建/编解码管道
EN

Stack Overflow用户
提问于 2017-09-13 05:37:10
回答 2查看 4.2K关注 0票数 15

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

如您所见,我正在使用codePipelinecodeBuild来自动化我的部署。我的后端基于无服务器框架,它在触发sls deploy命令时部署lambda函数。这就是我没有使用codeDeploy进行传统部署的原因。buildspec.yml文件如下所示:

代码语言:javascript
复制
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的文件,该文件包含诸如db密码之类的秘密。此文件将不会被签入git。您认为在codeBuild中包含config.yml的最佳方法是什么?

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

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

Hack回答(不正确,但有效)。(你需要更好的答案。)

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

回答2: --我想不出这是什么黑客。从你那里寻找答案。

答案3:我偶然看到一些使用codePipeline触发请求的博客文章。但我觉得,这个功能必须提供一个开箱即用的功能.该功能在codePipeline上有任何更新吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-09-13 13:16:09

问题1

更新:

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

示例:

serverless.yaml

代码语言:javascript
复制
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中。像戴伦夫这样的工具在这方面非常出色。

问题2

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

问题3

CodePipelines与单个分支绑定在一起,因此要使它在PR分支上工作,就必须像您提到的文章那样进行黑客操作。我求助于使用API + Lambda + CodeBuild (No CodePipeline)来实现这一点。

票数 9
EN

Stack Overflow用户

发布于 2018-07-19 14:26:10

为了补充问题1的公认答案(谢谢@dashmug和@Lakshman Diwaakar)

这就解决了如何将Parameter值放入Lambda中。但是,这些值在Lambda控制台中显示为纯文本。我需要解决的下一步是如何添加加密。

参数存储

在AWS系统管理器>参数存储中添加env变量作为参数

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

buildspec.yml

代码语言:javascript
复制
version: 0.2    
phases:
  install:
    commands:
      - npm install
      - npm install -g serverless
  build:
    commands:
      - serverless deploy

serverless.yml

引用serverless.yml中创建的参数

为安全字符串附加~true。

代码语言:javascript
复制
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

在处理程序中使用env

代码语言:javascript
复制
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'))
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46189597

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档