从 CLI 的现有 apigateway 克隆 AWS apigateway API

I B*_*jwa 2 amazon-web-services aws-api-gateway

我必须创建许多 AWS apigateway api。所有 api 都将使用 Lambda 函数进行调用。这些新的 api 还将包括以下常见步骤。

  • API 类型为区域和 REST API
  • 添加 POST 方法
  • 方法执行设置
  • 调用类型=Lambda 函数,并选择相应的 Lambda 函数。
  • CORS 设置
  • Lambda 权限
  • 积分响应设置
  • 部署 API
  • 在 API 使用计划中包含阶段
  • 重新部署 API

这是 apigateway 克隆 API 概要。

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>]
Run Code Online (Sandbox Code Playgroud)

如何从 CLI 的现有 apigateway API 克隆 apigateway API 并避免执行上述所有重复步骤。

Lon*_*yen 7

您也可以在通过控制台创建新 API 时从现有 API 进行克隆。

在此处输入图片说明


I B*_*jwa 3

使用以下命令作为 shell 脚本并使用上述参数执行脚本。参数名称是不言自明的。

这是完整的脚本,每个部分都有解释。

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

从现有 API 克隆 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 }'`
Run Code Online (Sandbox Code Playgroud)

显示新的 Rest API ID

echo RESTAPIID: ${RESTAPIID}
Run Code Online (Sandbox Code Playgroud)

获取资源

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}
Run Code Online (Sandbox Code Playgroud)

将 URI 和 Lambda 设置为调用

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
Run Code Online (Sandbox Code Playgroud)

生成 UUID 作为语句 ID

SID=`uuidgen`
Run Code Online (Sandbox Code Playgroud)

添加API网关执行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}
Run Code Online (Sandbox Code Playgroud)

设置积分响应

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}
Run Code Online (Sandbox Code Playgroud)

创建初始部署

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 }'`
Run Code Online (Sandbox Code Playgroud)

创造舞台

aws apigateway create-stage --rest-api-id ${RESTAPIID} --stage-name ${STAGENAME} --description ${STAGENAME} --deployment-id ${DEPLOYMENTID} --profile ${AWS_PROFILE} | grep stageName
sleep 10
Run Code Online (Sandbox Code Playgroud)

在Usageplan中添加API阶段

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
Run Code Online (Sandbox Code Playgroud)

重新部署阶段

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.."
Run Code Online (Sandbox Code Playgroud)

注意:不同步骤需要适当的时间延迟(等待)(如睡眠命令以秒为单位提到的)。

这是执行上述shell脚本的示例。(假设脚本名称cloneapi.sh)

./cloneapi.sh MyAPI MyAPIStage MyLambdaFunction apxxxxx upxxxx
Run Code Online (Sandbox Code Playgroud)

在哪里

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
Run Code Online (Sandbox Code Playgroud)

上述命令可用于任何 AWS CLI 版本和任何 Linux 操作系统,但以下是所使用的 CLI 和操作系统版本。

aws --版本

aws-cli/1.15.80 Python/2.7.14 Linux/4.14.94-89.73.amzn2.x86_64 botocore/1.10.79
Run Code Online (Sandbox Code Playgroud)

猫 /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/"
Run Code Online (Sandbox Code Playgroud)