Serverless Framework에서 임의의 상태 코드를 반환하는 API 만들기

다만 램바다 에이전트를 사용해 임의의 HTTP 상태 코드를 병합해 되돌려주는 API를 만들려고 했으나 이런 정보라는 것을 제대로 알아채지 못해 적어뒀다.
정식 문서를 보면 매우 빠르다.
https://www.serverless.com/framework/docs/providers/aws/events/apigateway#status-codes
람다에 JSON{ statusCode: 404, body: "msg" }에 답장하면 된다는 것이다.
※ 람바다 대리합병integration: lambda이 아니면 귀찮아 추천하지 않습니다.
※ 람바다 대리 합병integration: lambda_proxy은 기본값, 생략 가능
※ HTTP 상태 코드는 HTTP 응답 상태 코드 - HTTP | MDN 참조.

Serverless Framework의 프로그램 설계


다음 서버less입니다.yml과 hanlder.pysls deploy --aws-profile <your_profile>를 준비하면 티팟이 될 수 있다.
혹은 가벼운 마음으로 컨디션 코드를 조사했더니 모르는 컨디션 코드가 대거 나타나 급하다.
curl -i -X GET https://your_apigw_id.execute-api.ap-northeast-1.amazonaws.com/dev/status?c
ode=418
HTTP/2 418
content-type: application/json
content-length: 13
date: Sun, 26 Sep 2021 11:08:53 GMT
x-amzn-requestid: aec3359e-5e8b-4358-bbcf-XXXXXXXXXXX2
x-amz-apigw-id: GRIu6FgttjMFUAA=
x-amzn-trace-id: Root=1-615054c5-48d2867864cfe4de591XXXXX;Sampled=0
x-cache: Error from cloudfront
via: 1.1 1e25bd98fa0bda7498f5119d7dcXXXXX.cloudfront.net (CloudFront)
x-amz-cf-pop: NRT51-C3
x-amz-cf-id: WEG7QPCeJnqVv_RLjbJjmdbIvbL--xGu0XsMBH8N1QjZYpNKXXXXXA==

I'm a teapot

serverless.yml


service: api-response-codes
provider:
  name: aws
  runtime: python3.9
  region: ap-northeast-1
  lambdaHashingVersion: "20201221"
  stage: dev

package:
  patterns:
    - "!**"
    - handler.py

functions:
  handler:
    handler: handler.lambda_handler
    events:
      - http:
          method: get
          path: /status

handler.py


def lambda_handler(event, context):
    try:
        code = int(event.get("queryStringParameters", {}).get("code"))
    except:
        code = 200

    # see https://developer.mozilla.org/ja/docs/Web/HTTP/Status
    msg = {
        100: "Continue",
        101: "Switching Protocol",
        102: "Processing",
        103: "Early Hints",
        200: "OK",
        201: "Created",
        202: "Accepted",
        203: "Non-Authoritative Information",
        204: "No Content",
        205: "Reset Content",
        206: "Partial Content",
        207: "Multi-Status",
        208: "Already Reported",
        226: "IM Used",
        300: "Multiple Choice",
        301: "Moved Permanently",
        302: "Found",
        303: "See Other",
        304: "Not Modified",
        305: "Use Proxy",
        306: "unused",
        307: "Temporary Redirect",
        308: "Permanent Redirect",
        400: "Bad Request",
        401: "Unauthorized",
        402: "Payment Required",
        403: "Forbidden",
        404: "Not Found",
        405: "Method Not Allowed",
        406: "Not Acceptable",
        407: "Proxy Authentication Required",
        408: "Request Timeout",
        409: "Conflict",
        410: "Gone",
        411: "Length Required",
        412: "Precondition Failed",
        413: "Payload Too Large",
        414: "URI Too Long",
        415: "Unsupported Media Type",
        416: "Range Not Satisfiable",
        417: "Expectation Failed",
        418: "I'm a teapot",
        421: "Misdirected Request",
        422: "Unprocessable Entity",
        423: "Locked",
        424: "Failed Dependency",
        425: "Too Early",
        426: "Upgrade Required",
        428: "Precondition Required",
        429: "Too Many Requests",
        431: "Request Header Fields Too Large",
        451: "Unavailable For Legal Reasons",
        500: "Internal Server Error",
        501: "Not Implemented",
        502: "Bad Gateway",
        503: "Service Unavailable",
        504: "Gateway Timeout",
        505: "HTTP Version Not Supported",
        506: "Variant Also Negotiates",
        507: "Insufficient Storage",
        508: "Loop Detected",
        510: "Not Extended",
        511: "Network Authentication Required",
    }.get(code, "Hello Unknown StatusCode!")

    return dict(
        statusCode=code,
        body=f"{msg}\n",
    )

좋은 웹페이지 즐겨찾기