如何使用Cloudformation强制重新部署我的API网关

时间:2016-07-14 01:05:05

标签: aws-api-gateway amazon-cloudformation

我正在使用AWS CloudFormation创建API网关。我有一个AWS::ApiGateway::Deployment资源,在我创建堆栈时效果很好。但是,如果我更新我的堆栈(例如,AWS::ApiGateway::Method中的更改),则不会再次部署API。我必须在API网关中手动部署API。

任何人都知道我可以在更新堆栈时自动部署网关吗?

5 个答案:

答案 0 :(得分:8)

我在说明中添加了日期/时间戳,以便在每次更新模板时强制重新部署。这对我来说很容易,因为我使用Troposphere并且似乎可以做到这一点。或者,您可以将日期/时间戳作为参数传递。

答案 1 :(得分:1)

我可能来晚了,但是如果API资源发生更改,您可以重新部署这些选项,这可能对仍在寻找选项的人有所帮助-

  1. 尝试将AutoDeploy设置为true。如果使用的是V2版本的部署。 请注意,您需要通过V2创建APIGW。 V1和V2是 彼此不兼容。 https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-stage.html#cfn-apigatewayv2-stage-autodeploy

  2. Lambda支持的自定义资源,Lambda依次调用createDeployment API-https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-custom-resources.html

  3. CodePipeline,它具有一个调用Lambda函数的操作,就像自定义资源一样-https://docs.aws.amazon.com/codepipeline/latest/userguide/actions-invoke-lambda-function.html

  4. SAM(无服务器应用程序模型)遵循与CloudFormation相似的语法,该语法将资源创建简化为抽象,并使用那些来构建和部署普通的CloudFormation模板。 https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/what-is-sam.html

  5. 如果您正在使用任何抽象层(如Sceptre)进行云形成,则可以在对资源进行任何更新后使用钩子来调用createDeployment https://sceptre.cloudreach.com/2.3.0/docs/hooks.html

因为我一直使用Scepter进行Cloudformation部署,所以我选择了第三个选项。在权杖中实现钩子也很容易。

答案 2 :(得分:0)

您可以拥有自己的阶段和部署资源,其中阶段资源中的DeploymentId引用部署资源,然后可以使用诸如添加时间戳的方法为部署资源定义动态名称。

这迫使每次都重新部署。

答案 3 :(得分:0)

这就是我在几乎纯净的sls中所做的事情。您将需要安装aws cli工具和json解析器jq。它只能在UNIX / Linux上使用。

首先使用这些插件:

plugins:
  - serverless-plugin-scripts
  - '@anttiviljami/serverless-stack-output' 

如此配置:

  output:
    file: ./config.json
  scripts:
    hooks:
      'after:aws:deploy:finalize:cleanup': jq < config.json .myRestAPI | xargs -I%% aws --profile ${self:custom.stage} apigateway create-deployment --rest-api-id %% --stage-name ${self:custom.stage} --description 'Deployment ${sls:instanceId}'

只需确保将API剩余ID像这样输出在同一堆栈中(不需要导出该值):

  myRestAPI:
    Value:
      Ref: myApiGatewayRestAPI

请注意,我的阶段名称与我的AWS配置配置文件名称匹配,您可能需要更新“ --profile $ {self:custom.stage}”以适合。

答案 4 :(得分:0)

在我们的案例中,使用上面建议的答案将当前时间戳添加到名称/描述中以强制进行新的部署不是一个好的解决方案,因为那时每个部署的Api调用网址都会不同。

当我们所有的Api客户都连接并使用先前的调用Url时,这是一个问题,我们不想更新我们的应用程序,也不希望我们的客户每次部署都更新此Url。

这是我们的解决方案:

1)为部署的rest-api-id添加输出,如下所示:

Outputs:
  OutputApiId:
    Value: 
      Ref: NameOfMyApiHere
    Description: Api generated Id
    Export: 
      Name: OutputApiId

注意:在我们的示例中,NameOfMyApiHere是类型“ AWS :: ApiGateway :: RestApi”。

2)(按照您的常规方式)执行cloudformation部署/更改

3)像这样在AWS CLI命令中使用云形成输出的'OutputApiId'值:

aws apigateway create-deployment --rest-api-id {{ OutputApiId }} --region {{my-region}}

我们使用ansible作为部署工具来完成cloudformation步骤的工作并捕获返回的输出-依次调用AWS CLI命令,但我确定还有其他选择。

请参阅AWS CLI文档以在此处部署Rest Api https://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-deployments.html