我正在使用AWS CloudFormation创建API网关。我有一个AWS::ApiGateway::Deployment
资源,在我创建堆栈时效果很好。但是,如果我更新我的堆栈(例如,AWS::ApiGateway::Method
中的更改),则不会再次部署API。我必须在API网关中手动部署API。
任何人都知道我可以在更新堆栈时自动部署网关吗?
答案 0 :(得分:8)
我在说明中添加了日期/时间戳,以便在每次更新模板时强制重新部署。这对我来说很容易,因为我使用Troposphere并且似乎可以做到这一点。或者,您可以将日期/时间戳作为参数传递。
答案 1 :(得分:1)
我可能来晚了,但是如果API资源发生更改,您可以重新部署这些选项,这可能对仍在寻找选项的人有所帮助-
尝试将AutoDeploy设置为true。如果使用的是V2版本的部署。 请注意,您需要通过V2创建APIGW。 V1和V2是 彼此不兼容。 https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-stage.html#cfn-apigatewayv2-stage-autodeploy
Lambda支持的自定义资源,Lambda依次调用createDeployment API-https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-custom-resources.html
CodePipeline,它具有一个调用Lambda函数的操作,就像自定义资源一样-https://docs.aws.amazon.com/codepipeline/latest/userguide/actions-invoke-lambda-function.html
SAM(无服务器应用程序模型)遵循与CloudFormation相似的语法,该语法将资源创建简化为抽象,并使用那些来构建和部署普通的CloudFormation模板。 https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/what-is-sam.html
如果您正在使用任何抽象层(如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