함호에서 함명을 조사하는 API를 만들어 봤어요.

개시하다
몇 달 전에 회사 후배들이 몸이 안 좋아졌어요.
부서는 다르지만 걱정스럽게 물어봤더니'영원히 끝나지 않을 위탁 사건'때문에 마음이 꺾인 것 같다.
나는 좋은 건의를 할 수 있는 우수한 사람이 아니며, 감히 이 일관재앙의 시대에 너를 초대해서 점심을 먹을 수도 없다.
그럼에도 불구하고 내가 무엇을 할 수 있을지 고민하다가 후배들이 좋아하는 해상자위대 함선과 관련된 프로그램을 만들기로 했다.
규격.
  • 함호를 매개 변수로 건네준 뒤 해당 함호에 대응하는 함명 등의 정보를 API로 되돌려준다.
  • 내 실력으로 이 정도는 한계야...
  • API의 규격은 매우 간단하고 사용할 수 있는 파라미터는 함호code를 표시하는 것이 하나밖에 없다.
  • https://{APIのドメイン}?code={艦番号}
  • 되돌아오는 데이터는 JSON 형식으로 구조는 다음과 같다.
  • 응답하는 JSON의 예
    {
        "code": "183",
        "name": "いずも",
        "class": "「いずも」型",
        "hullCode": "護衛艦(DDH)"
    }
    
    시스템 전체 이미지
  • 아래 그림과 같이 API Gateway와 Lambda를 조합한 매우 간단한 시스템입니다.
  • 후술한 함정 데이터를 S3 등에 두는 것이 지능적이라고 생각했는데 이번에는 아빠와 함께 하는 것이 우선이고 함정 데이터는 람바다 안에 배치됐다.

  • 함정 데이터의 준비
  • 는 해상자위대'함호 일람표 페이지의 내용을 복사해 다음 CSV 형식으로 전환했다.
  • ships.csv
    number,name,class,hull_code
    91,はしだて,「はしだて」型,特務艇(ASY)
    101,むらさめ,「むらさめ」型,護衛艦(DD)
    102,はるさめ,「むらさめ」型,護衛艦(DD)
    103,ゆうだち,「むらさめ」型,護衛艦(DD)
    104,きりさめ,「むらさめ」型,護衛艦(DD)
    105,いなづま,「むらさめ」型,護衛艦(DD)
    ...
    
  • 이 CSV 파일은 다음에 설명한 Lambda 함수(lambda function.rb)와 같은 층에 있습니다.

  • Lambda 함수 만들기
  • "GetWarShipByCode"라는 이름으로 Ruby2.7 함수를 만들었습니다.
  • 구조 선택x86_64.

  • URL 매개 변수event['queryStringParameters']['code']의 값을 가져옵니다.
  • 이후 상기code를 읽고 URL 매개 변수ships.csv의 값과 일치하는 데이터를 JSON 형식으로 변환한다.
  • 일치하는 데이터가 없으면 오류 메시지가 반환됩니다.
  • code 이 이름의 머리는 그 뒤에 나오는 CORS에 대응하기 위한 곳이다.
  • lambda_function.rb
    require 'json'
    require 'json'
    require 'csv'
    
    def lambda_handler(event:, context:)
        # TODO implement
        #{ body: event.to_s }
    
        code = event['queryStringParameters']['code']
    
        json_hash = nil
    
        CSV.foreach("./ships.csv") do |row|
            # 行に対する処理
            if row[0]==code
                json_hash = {
                    "statusCode": "200", 
                    "headers": {
                        "Access-Control-Allow-Headers": "'Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token",
                        "Access-Control-Allow-Origin": "*",
                        "Access-Control-Allow-Methods": "GET,OPTION"
                    },
                    "body": JSON.dump({"code": row[0], "name": row[1], "class": row[2], "hullCode": row[3]})
    
                }
            end
        end
    
        if json_hash.nil?
            json_hash = {
                "statusCode": "503", 
                "headers": {
                    "Access-Control-Allow-Headers": "'Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token",
                    "Access-Control-Allow-Origin": "*",
                    "Access-Control-Allow-Methods": "GET,OPTION"
                },
                "body": JSON.dump({"errorMessage": "The specified code was not found."})
            }
        end
    
        return json_hash
    end
    
    API Gateway 설정
    API 생성
  • API Gateway 화면을 열고 [API 생성]을 눌러 Rest API를 선택(구축)합니다.
  • 프로토콜은 REST입니다. 새 API를 선택하고 API 이름을warship으로 설정합니다.
  • 끝점을 영역으로 설정합니다.

  • 리소스 및 메서드 추가
  • API를 만드는 단계에는 아무것도 없기 때문에 [액션]에 따라 자원과 방법을 추가합니다.
  • 자원은 Access-Controll-..의 자원 명칭과 상응하는 부분을 가리킨다.
  • 방법은 HTTP 방법, GET, POST 등이다.
  • 이번이 시도이기 때문에 최초 존재하는 자원https://{apiのドメイン}/{リソース名}/에 대해 GET 방법을 추가했다.
  • 그래서 이번에는 제작 자원이 없다.
  • GET 방법을 추가하면 설치 화면이 표시되므로 다음과 같이 설정합니다.
  • 복합 유형: Lambda 함수
  • Lambda 에이전트를 이용한 통합: 예
  • Lambda 영역: Lambda 함수를 만드는 리존
  • Lambda 함수: 이전에 생성된 함수 이름
  • 기본 시간 초과의 규격: 예(※ 기본값)

  • URL 조회 문자열 매개변수 지정하기
  • Lambda 측에 URL 매개 변수를 전달하기 위해 아래 화면에서 [방법 요청]을 누르고 방법 요청의 편집 화면에 들어갑니다.
  • [검색 문자열 추가]를 누르면 매개 변수/를 추가합니다.
  • 사양상 필수 매개 변수이지만 여기에는'필수'를 선택하지 않았습니다.

  • CORS의 유효성
    ※ API Gateway에 독립된 도메인을 추가하여 동일한 도메인에서 액세스할 때 설정할 필요가 없습니다.
  • 일반 브라우저는 CSRF 등의 조치로 인해 서로 다른 분야의 자원을 방문하는 것을 제한한다.
  • 이 문제를 해결하기 위해 [액션]에서 [CORS의 유효성]에 따라 CORS를 유효성화시킨다.
  • [CORS의 유효성] 키를 누르면 다음 팝업이 표시되므로 [예, 기존 값 바꾸기]를 선택합니다.
  • 설정해야 할 사이트가 더 있지만 제 경우는 이렇게 해서 CORS 문제를 해결했습니다.

  • 프로그램 설계
  • API Gateway의 화면 왼쪽 위에 있는 [액션] 버튼을 눌러 API를 디버깅합니다.
  • 아직 개발 목적지의'무대'를 만들지 않았기 때문에'개발된 무대'를'새로운 무대'로 설정하고 무대 이름을 지정한 후 디버깅을 진행한다.

  • 실행 테스트
  • API Gateway의 [단계] 화면에 들어가고 제작하는 단계의 편집기 화면에 들어간다.
  • 테스트에 사용할 API를 호출하는 URL이 편집기 화면 상단에 표시됩니다.
  • 이번 API는 매개 변수code가 필요하기 때문에 실제 테스트의 URL은code이다.
  • 이번 API는 GET 방법으로, 브라우저에서 URL을 클릭한 후 JSON이 다음과 같이 회신되는지 확인했다.

  • 잘한 "API 따라하기"를 후배들에게 보여줬습니다.
    후배에게 "API Gateway와 람바다로 API를 만들어 봤다"고 말한 뒤 https://xxxxxx.execute-api.ap-northeast-1.amazonaws.com/prod?code={艦番号} 매개변수가 부착된 URL을 보내자 "오, 해 본 두부 API냐!"
    그리고 URL을 보는 순간 처음부터 "번호상의 문제인 줄 알았는데 완전'구슬'이네요"
    (어매호의 함호는 181)
    이렇게 기분을 좀 전환하면 좋을 텐데...
    (그리고 나도 AWS를 조금 배울 수 있어서 다행이다...)
    사실 이렇게 하고 싶어요.
  • API에 자신의 도메인을 부여하려고 했는데 이번에는 그렇게 많이 받지 못했다.
  • 참조 링크
  • 함호 일람표
  • 0부터 하면서 외우는 API Gateway 환경 구축
  • 좋은 웹페이지 즐겨찾기