我正在尝试为我的应用程序自动化部署管道。这是自动化架构,我想出了:
如您所见,我使用 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上是否有针对此功能的更新?
答案 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'))
}