【问题标题】:How to automatically deploy api gateway in AWS codepipeline如何在 AWS Codepipeline 中自动部署 api 网关
【发布时间】:2017-11-27 13:32:25
【问题描述】:

目前我可以通过推送到 github 来部署 lambda。我也自动部署了一个 lambda,但这只是因为 api 网关是 lambda yaml 文件中的一个事件

AWSTemplateFormatVersion: '2010-09-09'
Transform: 'AWS::Serverless-2016-10-31'
Description: Identifies paragraphs in documents and links to the law
Resources:
  LambdaParagraphLinker:
    Type: 'AWS::Serverless::Function'
    Properties:
      Handler: LambdaParagraphLinker.lambda_handler
      Runtime: python3.6
      CodeUri: ./
      Description: Identifies paragraphs in documents and links to the 
      law
       MemorySize: 512
      Timeout: 10      
      Events:
        Api:
          Type: Api
          Properties:
            Path: /LambdaParagraphLinker
            Method: ANY

如何使用 swagger 文件部署 api 网关?

【问题讨论】:

    标签: amazon-web-services aws-api-gateway amazon-cloudformation aws-codepipeline aws-codebuild


    【解决方案1】:

    AWS::Serverless::Api

    https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessapi

    您可以在各处找到 Swagger 文档,有关 API Gateway 扩展的文档位于开发人员指南中。我将首先进入 API Gateway 控制台并查看 Lambda 为您创建的 API。您可以转到“阶段”页面,对于任何阶段,您都可以将 API 导出为 Swagger。

    【讨论】:

      【解决方案2】:

      毫无疑问,在代码管道中执行此操作的最佳方法是使用https://serverless.com/ 框架。这取代了我以前使用的每一个超级复杂的黑客工作和解决方法。 IMO 不太复杂。

      创建一个代码管道,将其链接到 src 和一个 codebuild 项目,设置一些权限,完成。

      //serverless.yml

      service: my-api
      provider:
        name: aws
        runtime: python2.7
      
      functions:
        hello:
          handler: handler.hello
          events:
            - http:
                path: api/v1/message
                method: post
      

      //buildspec.yml

      version: 0.2
      phases:
        install:
          commands:
            #BUILD
            - sudo apt-get update -y
        build:
          commands:
            - echo $environment
            - serverless package --stage $environment --region us-east-1
            - serverless deploy --stage $environment --region us-east-1
      

      或者通过执行以下选项之一来折磨自己......

      您可以在代码管道中的 cloudformation 中执行此操作。从 gatewayapi 控制台中导出 swagger 规范并放置在 cloudformation 模板中。

      AWSTemplateFormatVersion: '2010-09-09'
      Resources:
        PlayersAPI:
          Type: AWS::ApiGateway::RestApi
          Properties:
            Name: MyApi
            Description: API Description
            Body:
             "SWAGGER HERE"
      

      将其连接到 lambda 有点麻烦,但我可以描述这些步骤。首先创建一个包含源代码、构建和部署步骤的代码管道项目。

      • src 应该是来自 github 或 codecommit 的标准
      • build 应该输出一个 zip 文件并使用 buildspec.yml 类似这样的东西...

      //buildspec.yml

      version: 0.1
      phases:
        install:
          commands:
            #BUILD
            - zip -r lambda.zip . -x *.git*
      artifacts:
        files:
          - '**/*.zip'
          - '**/*.yml'
        discard-paths: no
      

      让构建步骤导出一个工件 MyAppBuild(或任何您想调用的名称)

      最后的流水线步骤是在这个 repo 中创建 lambda 函数作为一个独立的函数,通过控制台(它可重复使用): https://github.com/tkntobfrk/codepipeline-lambda-s3

      此 lambda 函数下载管道工件/压缩 lambda 函数并使用 boto 对其进行更新。

      在这些步骤之后,您可以添加另一个步骤作为 cloudformation 部署步骤。将其连接到您刚刚部署的 lambda 函数。

      如果您要处理多个环境,您可以为每个环境创建 lambda 函数和 gatewayapi cloudformation 模板,然后依次运行它们。

      • 第一阶段:源代码
      • 第 2 阶段:构建
      • 第三阶段:部署 lambda 测试,部署网关 api cloudformation 测试
      • 第 4 阶段:验证测试
      • 第 5 阶段:部署 lambda 产品,部署网关 api cloudformation 产品

      像这样直接使用 AWS 无服务器也可以。但是,您需要为 uri 使用标准工件位置。该 API 的 DefinitionUri: 可以是从 gatewayapi 控制台导出的 swagger。

      //cloudformation.yml

      AWSTemplateFormatVersion: '2010-09-09'
      Transform: AWS::Serverless-2016-10-31
      Resources:
        MySimpleFunction:
          Type: AWS::Serverless::Function
          Properties:
            Handler: app.lambda_handler
            Runtime: python2.7
            CodeUri: s3://somebucket/somezip.zip
        MyAPI:
           Type: AWS::Serverless::Api
           Properties:
              StageName: prod
              DefinitionUri: s3://somebucket/somezip.zip
      

      【讨论】:

      • 亲爱的布鲁斯。谢谢。暂时我放弃了。我没时间了。我发现亚马逊解决方案的启动和运行非常复杂。我不明白为什么亚马逊不提供即插即用解决方案:-)
      • 我确实通过并验证了这项工作,但这是一个相当复杂的解决方案。真正的问题在于 Cloudformation 中的 Type: 'AWS::Serverless::Function' 类型是否需要外部 s3 uri。如果您能够在模板中指定本地输入工件,那么在代码管道中将非常简单明了。
      • 再次感谢。顺便提一下……我的同事在几个小时内就在 Azure 上进行了持续部署。
      猜你喜欢
      • 2020-08-23
      • 2019-04-07
      • 1970-01-01
      • 2019-06-28
      • 2019-04-24
      • 2016-09-05
      • 2016-09-20
      • 1970-01-01
      • 2020-06-21
      相关资源
      最近更新 更多