I Bajwa PHD
I Bajwa PHD

Reputation: 1756

Cloning an AWS apigateway API from existing apigateway from CLI

I have to create many AWS apigateway apis. All apis will use a Lambda function for invocation. These new apis will also include below common steps.

Here is apigateway clone API SYNOPSIS.

SYNOPSIS
            create-rest-api
          --name <value>
          [--description <value>]
          [--clone-from <value>]
          [--binary-media-types <value>]
          [--minimum-compression-size <value>]
          [--api-key-source <value>]
          [--endpoint-configuration <value>]
          [--policy <value>]
          [--api-version <value>]
          [--cli-input-json <value>]
          [--generate-cli-skeleton <value>]

How to clone an apigateway API from existing apigateway API from CLI and avoid doing all the repeated steps mentioned above.

Upvotes: 5

Views: 7480

Answers (3)

grepit
grepit

Reputation: 22392

From horse's mouth A.K.A AWS documentation

  • Export:

Go to API Gateway and click away as shown in the picture. enter image description here

  • Creative Step:

    Rename the API title: "title" and all the URI fields to something new "uri" in the exported JSON or YAML (depending which you selected)

  • Import

Just create new API and import what you had exported in the previous step.

enter image description here enter image description here

Upvotes: 2

Long Nguyen
Long Nguyen

Reputation: 11024

You could clone from existing API when creating new API by the console as well.

enter image description here

Upvotes: 13

I Bajwa PHD
I Bajwa PHD

Reputation: 1756

Use below commands as a shell script and execute the script with the mentioned parameters. Parameters names are self explanatory.

Here is the full script and every part is explained.

#!/bin/bash
APINAME=${1}
STAGENAME=${2}
LAMBDANAME=${3}
CLONEAPIID=${4}
USAGEPLANID=${5}
AWS_PROFILE=[PROFILENAME]
AWS_REGION=[AWSREGION]
AWS_ACCOUNT=[AWSACCOUNT]
METHOD=POST

Clone API from existing API

echo "Closing API ${APINAME} from API ${CLONEAPIID}"
RESTAPIID=`aws apigateway create-rest-api --name "${APINAME}" --description "${APINAME}" --clone-from ${CLONEAPIID} --endpoint-configuration '{"types":["REGIONAL"]}' --profile ${AWS_PROFILE} | grep '"id"' | sed 's/,//g;s/ //g;s/"//g;' | awk -F: '{ print $2 }'`

Display New Rest API ID

echo RESTAPIID: ${RESTAPIID}

Getting Resource

echo "Getting Resource"
RESOURCEID=`aws apigateway get-resources --rest-api-id ${RESTAPIID} --profile ${AWS_PROFILE} | grep '"id"' | sed 's/,//g;s/ //g;s/"//g;' | awk -F: '{ print $2 }'`

echo RESOURCEID: ${RESOURCEID}

Setting URI and Lambda as Invocation

echo "Setting Lambda ${LAMBDANAME}"
LAMBDA_URL="arn:aws:apigateway:${AWS_REGION}:lambda:path/2015-03-31/functions/arn:aws:lambda:${AWS_REGION}:${AWS_ACCOUNT}:function:${LAMBDANAME}/invocations"
aws apigateway put-integration --rest-api-id ${RESTAPIID} --resource-id ${RESOURCEID} --http-method ${METHOD} --type AWS --integration-http-method ${METHOD} --uri "${LAMBDA_URL}" --profile ${AWS_PROFILE} | grep uri

Generating UUID as statement-id

SID=`uuidgen`

Adding permissions for API gateway to execute Lambda Function

aws lambda add-permission --function-name arn:aws:lambda:${AWS_REGION}:${AWS_ACCOUNT}:function:findPostcode --source-arn arn:aws:execute-api:${AWS_REGION}:${AWS_ACCOUNT}:${RESTAPIID}/*/*/* --principal apigateway.amazonaws.com --action lambda:InvokeFunction --statement-id ${SID} --profile ${AWS_PROFILE}

Setting Integration Response

aws apigateway put-integration-response --rest-api-id ${RESTAPIID} --resource-id ${RESOURCEID} --http-method ${METHOD} --status-code 200 --selection-pattern 200 --response-parameters '{"method.response.header.Access-Control-Allow-Origin": "'"'"'*'"'"'"}' --selection-pattern "" --response-templates '{"application/json": ""}' --profile ${AWS_PROFILE}

Creating Initial Deployment

echo "Creating Initial Deployment for ${APINAME} API and Stage ${STAGENAME}"
DEPLOYMENTID=`aws apigateway create-deployment --rest-api-id ${RESTAPIID} --stage-name '' --profile ${AWS_PROFILE} | grep '"id"' | sed 's/,//g;s/ //g;s/"//g;' | awk -F: '{ print $2 }'`

Creating Stage

aws apigateway create-stage --rest-api-id ${RESTAPIID} --stage-name ${STAGENAME} --description ${STAGENAME} --deployment-id ${DEPLOYMENTID} --profile ${AWS_PROFILE} | grep stageName
sleep 10

Adding API stage in Usageplan

echo "Adding Stage in Usageplan"
aws apigateway update-usage-plan --usage-plan-id ${USAGEPLANID} --patch-operations op="add",path="/apiStages",value="${RESTAPIID}:${STAGENAME}" --profile ${AWS_PROFILE} | grep name
sleep 10

Redeploying Stage

echo "Redeploying Stage"
aws apigateway create-deployment --rest-api-id ${RESTAPIID} --stage-name ${STAGENAME} --description ${STAGENAME} --profile ${AWS_PROFILE} | grep description
sleep 5
echo "REST API Endpoints configured and deployed successfully.."

Note: Proper time delay (wait) is needed in different steps ( as mentioned in seconds by sleep commands).

Here is an example of executing above shell script.(Assuming script name cloneapi.sh)

./cloneapi.sh MyAPI MyAPIStage MyLambdaFunction apxxxxx upxxxx

Where

MyAPI is New API Name
MyAPIStage is new API Stage Name
MyLambdaFunction  is Lambda Function Name for New API
apxxxxx is the API ID (Cloning from)
upxxxx is Usage Plan ID

The above commands can be used with any AWS CLI version and on any Linux OS, but below is the CLI and OS version used.

aws --version

aws-cli/1.15.80 Python/2.7.14 Linux/4.14.94-89.73.amzn2.x86_64 botocore/1.10.79

cat /etc/os-release

NAME="Amazon Linux"
VERSION="2"
ID="amzn"
ID_LIKE="centos rhel fedora"
VERSION_ID="2"
PRETTY_NAME="Amazon Linux 2"
ANSI_COLOR="0;33"
CPE_NAME="cpe:2.3:o:amazon:amazon_linux:2"
HOME_URL="https://amazonlinux.com/"

Upvotes: 3

Related Questions