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

如您所见,我正在使用codePipeline和codeBuild来自动化我的部署。我的后端基于无服务器框架,它在触发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和Serverless:
问题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上有任何更新吗?
发布于 2017-09-13 13:16:09
问题1
更新:
Serverless框架现在支持从Parameter引用变量。这意味着您可以跳过在CodeBuild中定义它们,因为部署时,无服务器将从Parameter中检索它们。
示例:
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中。像戴伦夫这样的工具在这方面非常出色。
问题2
您可以通过重新运行以前的CodeBuild作业来执行手动回滚。我想不出一种像CodeDeploy那样自动完成任务的简单方法。也许Lambda函数可以进行部署后测试,如果失败,它可以触发重新运行以前的CodeBuild作业。
问题3
CodePipelines与单个分支绑定在一起,因此要使它在PR分支上工作,就必须像您提到的文章那样进行黑客操作。我求助于使用API + Lambda + CodeBuild (No CodePipeline)来实现这一点。
发布于 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
version: 0.2
phases:
install:
commands:
- npm install
- npm install -g serverless
build:
commands:
- serverless deployserverless.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
在处理程序中使用env
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'))
}https://stackoverflow.com/questions/46189597
复制相似问题