如您所见,我正在使用codePipeline和codeBuild自动化部署。我的后端基于无服务器框架,它在触发slsdeploy
命令时部署lambda函数。这就是我没有使用codeDeploy进行传统部署的原因<代码>构建规范。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部署
依赖于一个名为config.yml
的文件,其中包含数据库密码等秘密。此文件将不会被签入git。你认为在codeBuild中包含config.yml
的最佳方式是什么?
问题2:如果我们必须使用codeDeploy部署传统的EC2应用程序,那么可以使用AWS进行回滚。对于serverless,我们不使用codeDeploy,serverless还支持回滚功能。我们如何在代码管道中利用无服务器回滚?
问题3:发生拉取请求时触发codePipeline。我看到一些帖子说,codePipeline不支持它。但这些帖子是去年发布的,现在代码管道支持拉请求了吗?
哈克答案(不正确,但工作。需要你更好的回答。)
回答1:config.yml
文件可以保存在私人S3桶中,并可以作为预构建
设置的一部分拉至codeBuild,或者我们可以将所有秘密添加到codeBuild的Env变量中。我不喜欢第二种选择,因为我想在所有环境中保持一致。这个问题还有更好的解决方案吗?
回答2:我想不出有什么办法可以解决这个问题。寻找你的答案。
回答3:我看到一些博客文章使用[APIGateway Lambda S3]触发代码管道来请求拉取。但我觉得,这个功能必须作为开箱即用的功能提供。此功能的代码管道是否有任何更新?
只是为了补充问题1的公认答案(感谢@dashmug和@Lakshman Diwaakar)
这确实解决了如何将参数存储值获取到Lambda中的问题。但是,这些值在Lambda控制台中显示为纯文本。我下一步需要解决的是如何添加加密。
参数存储
在AWS系统管理器中将环境变量添加为参数
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
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}
处理程序。js
在处理程序中使用env vars
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'))
}
问题一
更新:
无服务器框架现在支持引用参数存储中的变量。这意味着您可以跳过在CodeBuild中定义它们,因为无服务器将在部署时从参数存储中检索它们。
示例:
无服务器。亚马尔
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}
原始答复:
如果您想继续使用配置。yml
,那么让它工作的唯一方法就是通过类似于您已经在做的黑客攻击,因为它不受版本控制。
我建议将环境变量存储在EC2 Parameter Store中,您可以在CodeBuildbuildspec.yml
中引用。这些变量可以在您的serverless.yml
中使用${env:VARIABLE_NAME}
访问。
对于本地开发,您还应该使用真实的环境变量,而不是将它们存储在config.yml
中。像direnv这样的工具很擅长这个。
问题2
可以通过重新运行以前的CodeBuild作业来进行手动回滚。我想不出像CodeDeploy那样自动完成的简单方法。也许Lambda函数可以进行部署后测试,如果失败,它可以触发重新运行以前的CodeBuild作业。
问题三
代码管道绑定到一个分支,所以要使它在PR分支上工作,您必须像您提到的文章那样进行黑客攻击。我已经求助于使用API网关Lambda代码构建(无代码管道)来实现这一点。
我对计划中的应用程序的设计有一点问题,特别是数据库引擎和无服务器/非无服务器。目标是一个通过RESTAPI与数据库对话的Web应用程序。RESTAPI本身实际上只是CRUD操作,因此在我看来,无服务器aproach(AWS Lambda)非常适合。因此,最有效的数据库可能是DynamoDB(NoSQL)。 我熟悉RDBMS,对NoSQL数据库知之甚少。 应用程序的模式尚未完成,应该可以在以后进行扩
我想向无服务器 aws 节点模板添加 api 验证,到目前为止,我测试过的任何内容都运行良好。 我目前的方法是用包含我的验证模型的yml/json swagger定义覆盖现有的api-gateway,它是由无服务器框架生成的。当我在API-Gateway UI中测试它时,这对我来说是有效的,但是对于外部请求,API不会验证lambda-proxy的请求。 当我使用普通lambda时,api网关也不
我最近探索了serverless,我想为我的应用程序创建一个“简单”的后端。它应该像CRUD连接到DynamoDB,就像这里很好地显示的那样。然后转换成使用Cognoto记录用户。链接1和链接2( 在我的实施过程中,我遇到了一些问题,我想请您帮助,因为我不喜欢使用我只复制的东西,也不知道它是如何工作的: > 为什么我不需要设置CORS(标头)时初始化lambdas与无服务器,而不是在亚马逊控制台中
我正在尝试部署一个简单的Slack lambda api,它使用库从特定通道中删除成员和固定消息。我遇到的问题是函数没有问题地执行,并且它没有问题地删除通道成员,但是我的Lambda函数不断返回: 作为反应体。当我使用检查日志时,也没有看到任何错误。我看到我的函数的console.log成功执行。 null 为什么会出现此错误,以及如何解决此错误? 在处理程序函数中引用了这一点之后,我使用了。使用
我最近开始与appium合作。我在android emulator中使用appium成功调用了一个虚拟应用程序。 但是,当我尝试我们的实际应用程序时,会弹出一个弹出窗口,上面写着: 应用程序错误与服务器的连接不成功。(文件://android_asset/www/index.html) 一经接受,申请即被关闭。 我可以在emulator中手动访问同一个应用程序,并且不会抛出弹出窗口。我已经附上了问
有没有办法从无服务器上启用X射线。Lambda函数的yml?我已在文件中添加了X射线权限: 但高级跟踪仍需要在AWS控制台中手动启用。