当前位置: 首页 > 知识库问答 >
问题:

AWS codeBuild/codePipeline与无服务器框架

通博实
2023-03-14

如您所见,我正在使用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]触发代码管道来请求拉取。但我觉得,这个功能必须作为开箱即用的功能提供。此功能的代码管道是否有任何更新?

共有2个答案

松景铄
2023-03-14

只是为了补充问题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'))
}
况谦
2023-03-14

问题一

更新:

无服务器框架现在支持引用参数存储中的变量。这意味着您可以跳过在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控制台中手动启用。