API Gateway CLI 实操入门笔记(基于 LocalStack)

news2025/6/1 7:23:52

API Gateway CLI 实操入门笔记(基于 LocalStack)

Categories: Cloud
Google Rank Proof: No
Last edited time: May 26, 2025 4:18 AM
Status: Early draft
Tags: aws

主要先简单的走一下流程,熟悉一下在 terminal 操作 API Gateway

local stack 配置

这里主要用的就是 docker 去启动一个 docker 的容器,运行 local stack,直接 cv docker-compose 就行:

version: "3.8"

services:
  localstack:
    image: localstack/localstack:latest
    container_name: localstack_main
    ports:
      - "4566:4566" # main edge port
      - "4571:4571"
    environment:
      - SERVICES=SERVICES=lambda,dynamodb,apigateway,iam,logs,s3,ec2,cloudformation,sts,ssm,secretsmanager
      - DEBUG=1
      - LAMBDA_EXECUTOR=docker
      - DOCKER_HOST=unix:///var/run/docker.sock
    volumes:
      - "./localstack:/var/lib/localstack"
      - "/var/run/docker.sock:/var/run/docker.sock"、

安装 aws cli

其实准确的说是 awscli 和 awslocal,后者是用来跑 awslocal,也就是和 local stack 对接的,整体脚本如下:

❯ brew install awscli

==> Auto-updating Homebrew...
Adjust how often this is run with HOMEBREW_AUTO_UPDATE_SECS or disable with
HOMEBREW_NO_AUTO_UPDATE. Hide these hints with HOMEBREW_NO_ENV_HINTS (see `man brew`).
==> Downloading https://ghcr.io/v2/homebrew/portable-ruby/portable-ruby/blobs/sha256:9fd394a40fb1467f89206a9c89c1274d9dc053af688176667a0cac0c3014113f
######################################################################### 100.0%
# ...

❯ aws --version
aws-cli/2.27.22 Python/3.13.3 Darwin/23.4.0 source/x86_64

❯ pip3 install "awscli-local[ver1]" --upgrade
Defaulting to user installation because normal site-packages is not writeable
Collecting awscli-local[ver1]
  Downloading awscli-local-0.22.0.tar.gz (11 kB)
Collecting localstack-client
  Downloading localstack_client-2.10.tar.gz (11 kB)
Collecting awscli

❯ awslocal --version
aws-cli/1.40.22 Python/3.9.6 Darwin/23.4.0 botocore/1.38.23

❯ awslocal lambda list-functions

{
    "Functions": []
}

这个步骤用 homebrew 去安装 aws cli,然后用 pip 安装 awscli-local——运行的时候直接跑 awslocal

另外一个需要注意的就是,要把 python 安装的 package 添加到 env variable 里

小试 API Gateway

local stack 是 没有 UI 的,所以一切的操作都会在 terminal 上运行

API Gateway 结构

UI 上显示的树状结构如下:

API Gateway
└── APIs
    └── [my-api-name]
        ├── Resources                # Route paths + HTTP methods
        ├── Stages                  # Deployment environments (dev, prod, etc.)
        ├── Authorizers             # Cognito or Lambda-based authorizers
        ├── Models                  # JSON schema models for validation
        ├── Documentation           # API documentation parts or export (e.g. Swagger)
        ├── Binary Media Types      # Supported binary MIME types (e.g. image/png)
        ├── Gateway Responses       # Custom error responses (403, 404, etc.)
        ├── Settings                # Stage-level settings: variables, tracing, caching
        ├── Dashboard               # Traffic and integration visual overview
└── Usage Plans                    # Rate limiting and quota plans
└── API Keys                       # Issued access keys for API clients
└── Custom Domain Names
└── Client Certificates
└── Settings

有注释的部分,是会主要涉及到的部分

一些 get commands

开篇前先放一些可能会用得到的 get request,首先需要注意的是,除了 get-rest-apis 之外,其他的操作都需要用到 --rest-api-id 这个 flag,所以 get-rest-apis 可以说是所有 query 相关的基础

awslocal apigateway get-rest-apis                         # → all API
awslocal apigateway get-resources --rest-api-id <id>      # → path tree
awslocal apigateway get-stages --rest-api-id <id>         # → deployed stage
awslocal apigateway get-authorizers --rest-api-id <id>    # → JWT / Lambda Auth
awslocal apigateway get-models --rest-api-id <id>         # → Request / Response Model

创建一个新的测试 GET

这里 9 步,其实在 UI 操作挺简单的,不过 API 的话……嗨……不是为了省点钱嘛……

  1. 创建新的 rest api

    本质上来说,创建的是一个新的 API 的 namespace/project/service,官方的解释说:

    an API refers to a collection of resources and methods that can be invoked through HTTPS endpoints

    # create a new rest apiAPI_ID=$(awslocal apigateway create-rest-api \
      --name first-api-test \
      --query 'id' --output text)
    echo "API_ID = $API_ID"
    API_ID = pgvkwbu238
    
    # retrieve the api
    ❯ awslocal apigateway get-rest-apis
    
    {
        "items": [
            {
                "id": "pgvkwbu238",
                "name": "first-api-test",
                "createdDate": 1748215219.0,
                "apiKeySource": "HEADER",
                "endpointConfiguration": {
                    "types": [
                        "EDGE"
                    ]
                },
                "disableExecuteApiEndpoint": false,
                "rootResourceId": "imbynwu6qd"
            }
        ]
    }
    
  2. 获取 root resource id,也就是 / 的 id

    PARENT_ID=$(awslocal apigateway get-resources \
      --rest-api-id $API_ID \
      --query 'items[?path==`/`].id' --output text)
    echo "ROOT_ID = $PARENT_ID"
    
    ROOT_ID = imbynwu6qd
    
  3. 创建新的资源(resource)

    RESOURCE_ID=$(awslocal apigateway create-resource \
      --rest-api-id $API_ID \
      --parent-id $PARENT_ID \
      --path-part first-api-test \
      --query 'id' --output text)
    echo "RESOURCE_ID = $RESOURCE_ID"
    RESOURCE_ID = e3b1j0zyih
    
  4. 在新的资源下创建一个 GET 方法

    # for aws ver2, using authorization-type
    # for aws ver1, should be using autorization
    ❯ awslocal apigateway put-method \
      --rest-api-id $API_ID \
      --resource-id $RESOURCE_ID \
      --http-method GET \
      --authorization-type NONE
    {
        "httpMethod": "GET",
        "authorizationType": "NONE",
        "apiKeyRequired": false
    }
    
  5. mock 实现

    这一步是很重要的,因为这个方法并没有绑定 lambda 或者是任何服务,所以需要 mock 一个服务

    也就是说,当抵达这个 method 的时候,API Gateway 会返回一个 dummy 数据,让下一步操作可以正常进行

    ❯ awslocal apigateway put-integration \
      --rest-api-id $API_ID \
      --resource-id $RESOURCE_ID \
      --http-method GET \
      --type MOCK \
      --request-templates '{"application/json":"{\"statusCode\": 200}"}' \
      --integration-http-method GET
    
    {
        "type": "MOCK",
        "requestTemplates": {
            "application/json": "{\"statusCode\": 200}"
        },
        "passthroughBehavior": "WHEN_NO_MATCH",
        "timeoutInMillis": 29000,
        "cacheNamespace": "e3b1j0zyih",
        "cacheKeyParameters": []
    }
    
  6. 设置 integration response

    也就是设定返回数据

    ❯ awslocal apigateway put-integration-response \
      --rest-api-id $API_ID \
      --resource-id $RESOURCE_ID \
      --http-method GET \
      --status-code 200 \
      --response-templates '{
        "application/json": "{\n  \"message\": \"Hello from first-api-test! This API was successfully created.\"\n}"
      }'
    {
        "statusCode": "200",
        "responseTemplates": {
            "application/json": "{\n  \"message\": \"Hello from first-api-test! This API was successfully created.\"\n}"
        }
    }
    
    
  7. 设置 method response

    这里主要设定的是 model 和返回的 status code

    具体的周期会在后面细说,但是这个实现确实有点反直觉

    ❯ awslocal apigateway put-method-response \
      --rest-api-id $API_ID \
      --resource-id $RESOURCE_ID \
      --http-method GET \
      --status-code 200 \
      --response-models '{"application/json": "Empty"}'
    
    {
        "statusCode": "200",
        "responseModels": {
            "application/json": "Empty"
        }
    }
    
  8. 部署到 dev stage

    这一步也会创建一个新的 stage

    ❯ awslocal apigateway create-deployment \
      --rest-api-id $API_ID \
      --stage-name dev
    
    {
        "id": "e0ypqaj7kw",
        "createdDate": 1748217426.0
    }
    
  9. 验证

    local stack 不会启用任何的 custom domain,所以只能通过这个固定的 URL 访问

    curl http://localhost:4566/restapis/$API_ID/dev/_user_request_/first-api-test
    {
      "message": "Hello from first-api-test! This API was successfully created."
    }
    

创建一个 API Keys 和 usage plan

🔍 在 LocalStack 中,即使设置了 apiKeyRequired: true 并配置 Usage Plan,使用 MOCK integration 时可能还是没办法触发 API Key 校验机制。之后有机会换到 HTTPAWS_PROXY integration 去试试看

其实最好有机会的话,在 AWS 实际环境中验证效果应该是最好的,但是那个 cost 啊……

Anywa,下面也是按照步骤熟悉一下创建 API Key 和 Usage Plan

  1. 创建一个新的 API Key

    ❯ awslocal apigateway create-api-key \
      --name "test-key" \
      --enabled \
      --description "Key for external access"
    {
        "id": "3bqhpkxiy4",
        "value": "DCA6GNt8S5pLkbelM1rYUFXInVHczfmZxjJOKTPB",
        "name": "test-key",
        "description": "Key for external access",
        "enabled": true,
        "createdDate": 1748222725.0,
        "lastUpdatedDate": 1748222725.0,
        "stageKeys": []
    }
    
    
  2. 创建一个新的 Usage Plan

    这里我踩过一个雷,想要先创建 Usage Plan,再绑定到对应的 API Stage,不过最后失败了

    找了一下资料,大概是说 API Stage 必须要在 Usage Plan 创建的时候就进行绑定,不知道 UI 操作是怎么样的……可能设置默认值……?

    ❯ awslocal apigateway create-usage-plan \
      --name "correct-usage-plan" \
      --api-stages apiId=$API_ID,stage=dev \
      --throttle burstLimit=10,rateLimit=5 \
      --quota limit=100,period=DAY
    {
        "id": "yjxybm75wk",
        "name": "correct-usage-plan",
        "apiStages": [
            {
                "apiId": "pgvkwbu238",
                "stage": "dev"
            }
        ],
        "throttle": {
            "burstLimit": 10,
            "rateLimit": 5.0
        },
        "quota": {
            "limit": 100,
            "offset": 0,
            "period": "DAY"
        }
    }
    
  3. 将 Usage Plan 和 API Key 进行绑定

    我这里没有设置 variable,就用了明文,将就着看吧

    ❯ awslocal apigateway create-usage-plan-key \
      --usage-plan-id yjxybm75wk \
      --key-id 3bqhpkxiy4 \
      --key-type "API_KEY"
    {
        "id": "3bqhpkxiy4",
        "type": "API_KEY",
        "value": "DCA6GNt8S5pLkbelM1rYUFXInVHczfmZxjJOKTPB",
        "name": "test-key"
    }
    
    # verify
    ❯ awslocal apigateway get-usage-plans
    
    {
        "items": [
            {
                "id": "yjxybm75wk",
                "name": "correct-usage-plan",
                "apiStages": [
                    {
                        "apiId": "pgvkwbu238",
                        "stage": "dev"
                    }
                ],
                "throttle": {
                    "burstLimit": 10,
                    "rateLimit": 5.0
                },
                "quota": {
                    "limit": 100,
                    "offset": 0,
                    "period": "DAY"
                }
            }
        ]
    }
    

这里的配置表明设定是完成了,毕竟 stage,apiId 都绑定了,不过本地没办法验证

request-response 生命周期

简单来说,生命周期是这样的:

Client Request
    ↓
Method Request
    ↓
Integration Request
    ↓
Backend (Lambda / HTTP / Mock)
    ↓
Integration Response
    ↓
Method Response
    ↓
Client

这也是上面步骤为什么要先创建 integration request( put-integration ),再到 Integration Response( put-integration-response) 的关系,需要跟着这个生命周期去走

它们具体负责的功能为:

  • Method Request
    • Purpose: 预处理 client end 发送到后端的请求
    • Configurable:
      • Authorization (e.g., Cognito, Lambda authorizer)
      • Request validation (query params, headers, body schema/request body, which can be associated with the models designed under current resource)
      • API key enforcement (就是上面配置的 API Key,这里可以检查是否存在)
      • Request models
    • 在这一步,请求是可以被 blocked 的
    • 这里同样会出现 ARN (Amazon Resource Name)
      这是对每个方法都是不一样的,也是一个 unique identifier,可以用在 IAM 中去控制对应 API 方法的访问/操作权限
  • Integration Request
    • Purpose: 将从 API Gateway 接受的请求,转化成后端接受的数据
    • Configurable:
      • Mapping templates (from method request to backend format)
      • Headers, query string, path parameters
      • Choose integration type: HTTP / AWS Lambda / MOCK / VPC Link
        我个人觉得这一步有点像是 Model → Model DTO 的转换……不是百分百的准确,做个类比
  • Integration Response
    • Purpose: 将后端传送的数据,转化成客户端所需要的格式
    • Configurable:
      • Mapping templates to reshape backend response (JSON → user-friendly)
      • Status code mapping (e.g., 200/400/500)
      • Mapping the response headers set in the Method Response
      • Catch backend errors and normalize response
        这里就是我觉得像 Model DTO → Model 的转化过程,当然,这里处理的更多一些,也包含对报错的处理
        UI 方面的操作是这样的,Status Code Mapping 必须要保证 Method Response 中要出现对应的 status code……从我个人的角度来说有些反直觉,大体来说,也最好是先吧 Method Response 配置完再配置这个部分吧
  • Method Response
    • Purpose: 显示最终会传给客户端的数据
    • Configurable:
      • Status codes (200, 400, 500, etc.)
      • Response headers
      • Response models (optional schema enforcement)
        这一步也是可以进行 models/schema 的检查的,就像是 Method Request 做的那样

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2392213.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据分析案例-基于红米和华为手机的用户评论分析

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

深度学习入门:从零搭建你的第一个神经网络

深度学习入门&#xff1a;从零搭建你的第一个神经网络 系统化学习人工智能网站&#xff08;收藏&#xff09;&#xff1a;https://www.captainbed.cn/flu 文章目录 深度学习入门&#xff1a;从零搭建你的第一个神经网络摘要引言第一章&#xff1a;神经网络基础原理1.1 神经元…

【Python办公】Excel简易透视办公小工具

目录 专栏导读1. 背景介绍2. 功能介绍3. 库的安装4. 界面展示5. 使用方法6. 实际应用场景7. 优化方向完整代码总结专栏导读 🌸 欢迎来到Python办公自动化专栏—Python处理办公问题,解放您的双手 🏳️‍🌈 博客主页:请点击——> 一晌小贪欢的博客主页求关注 👍 该系…

Linux系列-2 Shell常用命令收集

背景 本文用于收集Linux常用命令(基于Centos7)&#xff0c;是一个持续更新的博客&#xff0c;建议收藏&#xff0c;编写shell时遇到问题可以随时查阅。 1.Shell类型 shell是用C语言编写的程序&#xff0c;作为命令解释器连接着用户和操作系统内核。常见的shell有sh(Bourne She…

MATLAB使用多个扇形颜色变化表示空间一个点的多种数值

MATLAB使用多个扇形颜色变化表示空间一个点的多种数值 excel中表格中数据格式&#xff0c;多行 lonlatdata1data2data3117380.11100 clear;close all; figure(Position,[100 100 800 800]);num_points 14; [num,txt,raw] xlsread(test.xlsx); x num(:,1); y num(:,2);d…

CAD精简多段线顶点、优化、删除多余、重复顶点——CAD c#二次开发

附部分代码如下: public static void Pl精简(){Document doc Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;Database db doc.Database;Editor ed doc.Editor;var plOrigon db.SelectCurve("\n选择多段线&#xff1a;");…

输电线路的“智慧之眼”:全天候可视化监测如何赋能电网安全运维

在电力需求持续攀升、电网规模日益庞大的今天&#xff0c;输电线路的安全稳定运行面临着前所未有的挑战。线路跨越地形复杂多变&#xff0c;尤其是在偏远山区、铁路沿线及恶劣天气条件下&#xff0c;传统的人工巡检方式显得力不从心——效率低、风险高、覆盖有限。如何实现更智…

两阶段法目标检测发展脉络

模式识别期末展示大作业&#xff0c;做个记录&#xff0c;希望大家喜欢。 R-CNN Fast R-CNN R-FCN 整个过程可以分解为以下几个步骤&#xff1a; 输入图像 (image) 和初步特征提取 (conv, feature maps)&#xff1a; 首先&#xff0c;输入一张原始图像&#xff0c;经过一系列…

小白的进阶之路系列之六----人工智能从初步到精通pytorch数据集与数据加载器

本文将介绍以下内容: 数据集与数据加载器 数据迁移 如何建立神经网络 数据集与数据加载器 处理数据样本的代码可能会变得混乱且难以维护;理想情况下,我们希望我们的数据集代码与模型训练代码解耦,以获得更好的可读性和模块化。PyTorch提供了两个数据原语:torch.utils…

NestJS——重构日志、数据库、配置

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;正逐渐往全干发展 &#x1f4c3;个人状态&#xff1a; 研发工程师&#xff0c;现效力于中国工业软件事业 &#x1f680;人生格言&#xff1a; 积跬步…

c++数据结构8——二叉树的性质

一、二叉树的基本性质 示图1&#xff1a; 性质1&#xff1a;层节点数上限 在一棵二叉树中&#xff0c;第i层至多有2^{i-1}个节点&#xff08;首层是第1层&#xff09; 这个性质可以通过数学归纳法证明&#xff1a; 第1层&#xff1a;2^{1-1}2^01个节点&#xff08;根节点&am…

Window Server 2019--08 网络负载均衡与Web Farm

本章要点 1、了解网络负载均衡技术 2、掌握Web Farm核心原理 3、掌握如何使用Windows NLB搭建Web Farm环境 网络负载均衡技术将外部计算机发送的连接请求均匀的分配到服务器集群中的每台服务器上&#xff0c;接受到请求的服务器独立地响应客户的请求。 网络负载均衡技术还…

SpringBoot:统一功能处理、拦截器、适配器模式

文章目录 拦截器什么是拦截器&#xff1f;为什么要使用拦截器&#xff1f;拦截器的使用拦截路径执行流程典型应用场景DispatcherServlet源码分析 适配器模式适配器模式定义适配器模式角色适配器模式的实现适配器模式应用场景 统⼀数据返回格式优点 统一处理异常总结 拦截器 什…

AI Agent工具全景解析:从Coze到RAGflow,探索智能体自动化未来!

在人工智能技术持续深入行业应用的背景下&#xff0c;越来越多的企业和个人寻求通过自动化技术来提高效率和减少重复性劳动&#xff0c;AI Agent的崛起已经成为了不可忽视的趋势。AI Agent&#xff0c;即人工智能代理&#xff0c;是一种基于先进的人工智能技术&#xff0c;特别…

Onvif协议:IPC客户端开发-IPC相机控制(c语言版)

前言&#xff1a; 本博文主要是借鉴OceanStar大神的博文&#xff0c;在他的博文的基础之上做了一部分修改与简化。 博文链接&#xff1a; Onvif协议&#xff1a;IPC客户端开发之鉴权_onvif鉴权方式-CSDN博客 Onvif协议&#xff1a;IPC客户端开发之PTZ控制_onvif ptz-CSDN博客…

如何最简单、通俗地理解Pytorch?神经网络中的“梯度”是怎么自动求出来的?PyTorch的动态计算图是如何实现即时执行的?

PyTorch是一门科学——现代深度学习工程中的一把锋利利器。它的简洁、优雅、强大,正在让越来越多的AI研究者、开发者深度应用。 1. PyTorch到底是什么?为什么它重要? PyTorch是一个开源的深度学习框架,由Facebook AI Research(FAIR)于2016年发布,它的名字由两个部分组成…

QT+opecv如何更改图片的拍摄路径

如何更改相机拍摄图片的路径 前言&#xff1a;基础夯实&#xff1a;效果展示&#xff1a;实现功能&#xff1a;遇到问题&#xff1a;未解决&#xff1a; 核心代码&#xff1a; 前言&#xff1a; 最近在项目开发中遇到需要让用户更改相机拍摄路径的问题&#xff0c;用户可自己选…

秋招Day11 - JVM - 类加载机制

了解类的加载机制吗&#xff1f; JVM是运行Java字节码&#xff0c;也就是运行.class文件的虚拟机&#xff0c;JVM把.class文件中描述类的数据结构加载到内存中&#xff0c;并对数据进行校验&#xff0c;解析和初始化&#xff0c;最终转化为JVM可以使用的类型&#xff08;Klass…

Webug4.0靶场通关笔记03- 第3关SQL注入之时间盲注(手注法+脚本法 两种方法)

目录 一、源码分析 1.分析闭合 2.分析输出 &#xff08;1&#xff09;查询成功 &#xff08;2&#xff09;查询失败 &#xff08;3&#xff09;SQL语句执行报错 二、第03关 延时注入 1.打开靶场 2.SQL手注 &#xff08;1&#xff09;盲注分析 &#xff08;2&#xf…

Vert.x学习笔记-什么是Handler

Vert.x学习笔记 在Vert.x中&#xff0c;Handler是一个核心概念&#xff0c;用于处理异步事件和回调。它是Vert.x响应式编程模型的核心组件之一&#xff0c;通过函数式接口的方式简化了异步编程的复杂性。 1. Handler的定义 Handler是一个函数式接口&#xff0c;定义如下&#…