Amazon API Gateway Deployment with CloudFormation: Difference between revisions
(13 intermediate revisions by the same user not shown) | |||
Line 32: | Line 32: | ||
{{External|[https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-deployment.html AWS::ApiGateway::Deployment]}} | {{External|[https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-deployment.html AWS::ApiGateway::Deployment]}} | ||
Resources: | Resources: | ||
ApiDeployment: | ApiDeployment: | ||
Type: AWS::ApiGateway::Deployment | Type: AWS::ApiGateway::Deployment | ||
Line 39: | Line 39: | ||
RestApiId: !Ref Api | RestApiId: !Ref Api | ||
Description: 'something' | Description: 'something' | ||
If StageName: is specified and the stage does not exist, it will be created. | |||
==AWS::ApiGateway::Stage== | ==AWS::ApiGateway::Stage== | ||
{{External|[https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-stage.html AWS::ApiGateway::Stage]}} | {{External|[https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-stage.html AWS::ApiGateway::Stage]}} | ||
Resources: | |||
Stage: | |||
Type: AWS::ApiGateway::Stage | |||
DependsOn: | |||
- Api | |||
- ApiDeployment | |||
Properties: | |||
StageName: 'dev' | |||
RestApiId: !Ref Api | |||
DeploymentId: !Ref ApiDeployment | |||
==AWS::ApiGateway::VpcLink== | ==AWS::ApiGateway::VpcLink== | ||
{{External|[https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-vpclink.html AWS::ApiGateway::VpcLink]}} | {{External|[https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-vpclink.html AWS::ApiGateway::VpcLink]}} | ||
= | =Idiosyncrasy= | ||
As per March 2019, an attempt to re-deploy a new version of an API, as expressed in a version of an Open API file, with CloudFormation, does not work as expected. CloudFormation AWS::ApiGateway::RestApi resource update, as described [[#AWS::ApiGateway::RestApi|above]], works fine: the new API content is deployed and visible in the console. One would expect that the AWS::ApiGateway::Deployment resource, declared [[#AWS::ApiGateway::Deployment|above]], would detect that the API changed and re-snapshot it. However, that does not happens. No new deployment is created. As consequence, the stage points to a stale deployment. Changing the description of a Deployment does not work either, the description will be updated on the current deployment, but the content of the API snapshot won't change. | |||
On the same subject: | |||
* https://medium.com/@ngchiwang/aws-apigateway-deployment-not-update-3e04fcffe85b. This one did not work, the template modified as described triggered a validation error: "An error occurred (ValidationError) when calling the CreateStack operation: Template format error: Resource name ApiDeployment$timestamp is non alphanumeric." | |||
* https://stackoverflow.com/questions/41423439/cloudformation-doesnt-deploy-to-api-gateway-stages-on-update | |||
Possible solutions: | |||
==Add Deployments and Stages to the Template== | |||
Add a new AWS::ApiGateway::Deployment, with a different logical name, irrespective of whether we keep the old one or now: | |||
<syntaxhighlight lang='yaml'> | |||
Resources: | |||
Api: | |||
... | |||
ApiDeployment: | |||
Type: AWS::ApiGateway::Deployment | |||
DependsOn: Api | |||
Properties: | |||
RestApiId: !Ref Api | |||
Stage: | |||
Type: AWS::ApiGateway::Stage | |||
DependsOn: | |||
- Api | |||
- ApiDeployment | |||
Properties: | |||
StageName: !Sub 'v0' | |||
RestApiId: !Ref Api | |||
DeploymentId: !Ref ApiDeployment | |||
ApiDeployment2: | |||
Type: AWS::ApiGateway::Deployment | |||
DependsOn: Api | |||
Properties: | |||
RestApiId: !Ref Api | |||
Stage2: | |||
Type: AWS::ApiGateway::Stage | |||
DependsOn: | |||
- Api | |||
- ApiDeployment2 | |||
Properties: | |||
StageName: 'v2' | |||
RestApiId: !Ref Api | |||
DeploymentId: !Ref ApiDeployment2 | |||
</syntaxhighlight> | |||
==Dynamically Change The Stack Template and Modify the API Deployment and Stage Logical IDs== | |||
Use timestamp or a counter. | |||
==Deploy API via CLI== | |||
Do not deploy the API and create the Stage with CloudFormation, but programmatically via CLI, from a follow up action. | |||
==Nested Stacks== | |||
Nested stacks, that describe new Deployment and stage. | |||
==Lambda-Backed Custom Resource== | |||
http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-custom-resources.html |
Revision as of 22:00, 21 March 2019
External
- https://currentlyunnamed-theclassic.blogspot.com/2018/12/mastering-cloudformation-for-api.html
- https://stackoverflow.com/questions/41423439/cloudformation-doesnt-deploy-to-api-gateway-stages-on-update
Internal
Overview
Resource Types
AWS::ApiGateway::RestApi
Resources: Api: Type: AWS::ApiGateway::RestApi Properties: Name: 'experimental-api' Description: 'An experimental API, deployed programmatically' FailOnWarnings: true BodyS3Location: Bucket: 'ovidiu-experiments' Key: 'openapi-aws.json'
AWS::ApiGateway::Deployment
Resources: ApiDeployment: Type: AWS::ApiGateway::Deployment DependsOn: Api Properties: RestApiId: !Ref Api Description: 'something'
If StageName: is specified and the stage does not exist, it will be created.
AWS::ApiGateway::Stage
Resources: Stage: Type: AWS::ApiGateway::Stage DependsOn: - Api - ApiDeployment Properties: StageName: 'dev' RestApiId: !Ref Api DeploymentId: !Ref ApiDeployment
AWS::ApiGateway::VpcLink
Idiosyncrasy
As per March 2019, an attempt to re-deploy a new version of an API, as expressed in a version of an Open API file, with CloudFormation, does not work as expected. CloudFormation AWS::ApiGateway::RestApi resource update, as described above, works fine: the new API content is deployed and visible in the console. One would expect that the AWS::ApiGateway::Deployment resource, declared above, would detect that the API changed and re-snapshot it. However, that does not happens. No new deployment is created. As consequence, the stage points to a stale deployment. Changing the description of a Deployment does not work either, the description will be updated on the current deployment, but the content of the API snapshot won't change.
On the same subject:
- https://medium.com/@ngchiwang/aws-apigateway-deployment-not-update-3e04fcffe85b. This one did not work, the template modified as described triggered a validation error: "An error occurred (ValidationError) when calling the CreateStack operation: Template format error: Resource name ApiDeployment$timestamp is non alphanumeric."
- https://stackoverflow.com/questions/41423439/cloudformation-doesnt-deploy-to-api-gateway-stages-on-update
Possible solutions:
Add Deployments and Stages to the Template
Add a new AWS::ApiGateway::Deployment, with a different logical name, irrespective of whether we keep the old one or now:
Resources:
Api:
...
ApiDeployment:
Type: AWS::ApiGateway::Deployment
DependsOn: Api
Properties:
RestApiId: !Ref Api
Stage:
Type: AWS::ApiGateway::Stage
DependsOn:
- Api
- ApiDeployment
Properties:
StageName: !Sub 'v0'
RestApiId: !Ref Api
DeploymentId: !Ref ApiDeployment
ApiDeployment2:
Type: AWS::ApiGateway::Deployment
DependsOn: Api
Properties:
RestApiId: !Ref Api
Stage2:
Type: AWS::ApiGateway::Stage
DependsOn:
- Api
- ApiDeployment2
Properties:
StageName: 'v2'
RestApiId: !Ref Api
DeploymentId: !Ref ApiDeployment2
Dynamically Change The Stack Template and Modify the API Deployment and Stage Logical IDs
Use timestamp or a counter.
Deploy API via CLI
Do not deploy the API and create the Stage with CloudFormation, but programmatically via CLI, from a follow up action.
Nested Stacks
Nested stacks, that describe new Deployment and stage.
Lambda-Backed Custom Resource
http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-custom-resources.html