AWS CloudFormation does not support AWS API Gateway. This is a Lambda-backed custom resource to add AWS API Gateway's Resource to CloudFormation. This module allows construction of an arbitrarily large tree of resources. The standalone module for a single resource is cfn-gateway-resource
(NPM / GitHub).
This package on NPM
This package on GitHub
This Lambda makes use of the Lambda-Backed CloudFormation Custom Resource flow module, cfn-lambda
(GitHub / NPM).
See ./example.template.json
for a sample CloudFormation template. The example uses Condition
statements, Parameters
, and dynamic ServiceToken
generation fully.
"ResourceLogicalIdInResourcesObject": {
"Type": "Type": "Custom::ApiGatewayResourceTree",
"Properties": {
"ServiceToken": "arn:aws:lambda:<cfn-region-id>:<your-account-id>:function:<this-deployed-lambda-name>",
"ParentId": { // REQUIRED - can be any APIG Resource ID
"Fn::GetAtt": [ // This example uses the root of an API RestApi object.
"MyRestApi",
"RootResourceId"
]
},
"RestApiId": {
"Ref": "MyRestApiId" // REQUIRED 10 char alphanum ID for RestApi
},
"ChildResources": <A ChildResources Object>, // REQUIRED see struct below.
}
}
CAUTION: ResourceTree
will destroy any other properties on the ParentId
Resource.
CAUTION: Any modification to any property triggers a full replacement.
Recursively nestable tree structure definition for your API Gateway structure.
[
{
"PathPart": "pathwithoutchildren"
// Do not need to include ChildResources.
},
{
"PathPart": "pathwithchildren",
"ChildResources": <A ChildResourcesObject>
},
{
"PathPart": "{pathparam}",
"ChildResources": `<a ChildResourcesObject>`
}
]
Fn::GetAtt
provides a key-value pair set for the ResourceId's of each path. These operate relative to the trees.
// This will return the `ResourceId` for the resource at relative path `/foo/{id}/bar`.
// The root is defined as the `ParentResourceId`'s Path on the `RestApi` object.
{"Fn::GetAtt": "/foo/{id}/bar"}
Ref
returns a value only used for tracking internal state:
[
<RestApiId>,
<ParentResourceId>,
SHA256(JSON.stringify(<ChildResources>))
].join('---')
While the resource works on its own, the ./example.template.json
requires use of some more custom resources...:
Custom::ApiGatewayRestApi
(GitHub / NPM)Custom::ApiGatewayMethod
(GitHub / NPM)Custom::ApiGatewayMethodResponse
(GitHub / NPM)Custom::ApiGatewayIntegration
(GitHub / NPM)Custom::ApiGatewayIntegrationResponse
(GitHub / NPM)Custom::ApiGatewayDeployment
(GitHub / NPM)
The way that takes 10 seconds...
# Have aws CLI installed + permissions for IAM and Lamdba
$ npm run cfn-lambda-deploy
You will have this resource installed in every supported Region globally!
... And the way more difficult way.
IMPORTANT: With this method, you must install this custom service Lambda in each AWS Region in which you want CloudFormation to be able to access the ApiGatewayResourceTree
custom resource!
- Go to the AWS Lambda Console Create Function view:
-
Zip this repository into
/tmp/ApiGatewayResourceTree.zip
$ cd $REPO_ROOT && zip -r /tmp/ApiGatewayResourceTree.zip;
-
Enter a name in the Name blank. I suggest:
CfnLambdaResouce-ApiGatewayResourceTree
-
Enter a Description (optional).
-
Toggle Code Entry Type to "Upload a .ZIP file"
-
Click "Upload", navigate to and select
/tmp/ApiGatewayResourceTree.zip
-
Set the Timeout under Advanced Settings to 10 sec
-
Click the Role dropdown then click "Basic Execution Role". This will pop out a new window.
-
Select IAM Role, then select option "Create a new IAM Role"
-
Name the role
lambda_cfn_api_gateway_resource
(or something descriptive) -
Click "View Policy Document", click "Edit" on the right, then hit "OK"
-
Copy and paste the
./execution-policy.json
document. -
Hit "Allow". The window will close. Go back to the first window if you are not already there.
-
Click "Create Function". Finally, done! Now go to Usage or see the example template. Next time, stick to the instant deploy script.
Submit pull requests or Tweet @ayetempleton if you want to get involved with roadmap as well, or if you want to do this for a living :)
Work is (extremely) active, published here:
Andrew's NPM Account