주:
- 이 사용지침서에서는 Oracle Cloud에 액세스해야 합니다. 무료 계정에 등록하려면 Oracle Cloud Infrastructure Free Tier 시작하기를 참조하십시오.
- Oracle Cloud Infrastructure 인증서, 테넌시 및 구획에 대한 예제 값을 사용합니다. 실습을 마치면 이러한 값을 자신의 클라우드 환경과 관련된 값으로 대체합니다.
OCI API 게이트웨이, 함수 및 관찰 기능을 사용하여 JSON 콘텐츠 검증 및 API 헤더 및 본문 모니터링
소개
특히 마이크로서비스를 기반으로 한 아키텍처에서 분산 애플리케이션을 개발할 때는 실행 시 확장 및 성능이 뛰어난 구성요소를 원합니다. 매우 복잡한 구조, 다른 구성 요소를 실행하는 구성 요소, 다른 구성 요소를 실행하는 구성 요소 등을 무한한 수의 끝없는 호출로 수행합니다.
각각을 개발하는 방법을 계획하는 것은 큰 일입니다. Oracle Cloud Infrastructure API Gateway(OCI API Gateway)를 통해 Kubernetes 클러스터에 구축된 마이크로서비스를 노출할 수 있습니다. 통화 인증 및 권한 부여, 데이터 검증 및 통화 최적화 수행과 같은 일련의 기능이 있습니다. 또한 기존 메소드가 요구 사항을 해결하기에 충분하지 않은 경우 개인화된 인증 및 권한 부여 방식을 생성하기 위해 OCI Functions를 사용하여 호출을 실행할 수도 있습니다.
이 자습서에서는 사용자정의 메커니즘을 사용하여 다음과 같은 일부 사용 사례를 검증하는 방법을 보여줍니다.
-
JSON 매개변수 데이터의 크기를 검증합니다.
-
최대 JSON 항목 수를 검증합니다.
OCI API Gateway의 인증 및 권한 부여 메커니즘에도 불구하고 다음과 같은 다른 요구 사항에 도움이 될 수 있습니다.
-
HEADER, 질의 매개변수 또는 REST 호출 본문에서 데이터를 캡처합니다.
-
문제 디버깅을 용이하게 하기 위해 이 데이터를 OCI Observability에 전송합니다. 이 정보가 없으면 종종 감지할 수 없습니다.
주: 데이터를 Observability로 전송하는 경우 코드에서 비밀번호나 민감한 데이터와 같은 HEADER 또는 BODY 콘텐츠에 대한 개정 사용을 사용하는 것이 좋습니다. 또 다른 방법은 디버깅을 위해 함수를 설정/해제하는 것입니다.
목표
-
API 배치를 구성합니다.
-
API 요청에서 HEADER 및 BODY를 캡처하는 OCI 함수를 개발합니다.
-
본문 JSON 데이터를 검증합니다.
-
HEADER 및 BODY 정보를 OCI Observability로 전송합니다.
필요 조건
-
운영 Oracle Cloud 테넌트. 한 달 동안 US$ 300.00의 무료 Oracle Cloud 계정을 생성하여 이 자습서를 사용해 볼 수 있습니다. 무료 Oracle Cloud 계정 생성을 참조하십시오.
-
OCI API 게이트웨이 인스턴스가 생성되어 인터넷에 노출되었습니다. Oracle Cloud에서 첫번째 API 게이트웨이 생성을 참조하십시오.
작업 1: OCI 관찰성 구성
-
OCI 테넌시에 로그를 생성하여 함수에서 로그를 수집합니다. 관찰성 및 관리로 이동하여 OCI 콘솔에서 로그를 선택합니다.
-
사용자정의 로그 생성을 누릅니다.
-
사용자정의 로그 이름 필드에 이름을 입력하고 적절한 구획 및 로그 그룹을 선택합니다.
참고: 로그의 OCID를 캡처하는 것이 중요합니다. 코드에 필요합니다.
작업 2: API 요청에서 HEADER 및 BODY를 캡처하는 OCI 함수 생성
다음 단계를 실행하려면 function.zip에서 코드를 다운로드합니다.
-
API 요청에서 HEADER 및 BODY를 캡처합니다.
-
본문 JSON 데이터를 검증합니다. 각 배열의 항목 수를 검증하는 방법이 있습니다.
-
HEADER 및 BODY 정보를 OCI Observability로 전송합니다.
import io import json import logging import requests import oci from fdk import response from datetime import timedelta def count_items(dictData): counting = 0 for item in dictData: if type(dictData[item]) == list: counting += len(dictData[item]) else: if not type(dictData[item]) == str: counting += count_items(dictData[item]) return counting def handler(ctx, data: io.BytesIO = None): jsonData = "API Error" c = 0 try: config = oci.config.from_file("./config","DEFAULT") logging = oci.loggingingestion.LoggingClient(config) rdata = json.dumps({ "active": True, "context": { "requestheader": data.getvalue().decode('utf-8'), }, }) jsonData = data.getvalue().decode('utf-8') # Get the body content from the API request body = dict(json.loads(data.getvalue().decode('utf-8')).get("data"))["body"] body = dict(json.loads(body)) # Count the number of items on arrays inside the JSON body c = count_items(body) # If JSON body content has more than 1 item in arrays, block the authorization for the API backend if (c > 1): # Send a log to observability with out of limit of items in array put_logs_response = logging.put_logs( log_id="ocid1.log.oc1.iad.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", put_logs_details=oci.loggingingestion.models.PutLogsDetails( specversion="EXAMPLE-specversion-Value", log_entry_batches=[ oci.loggingingestion.models.LogEntryBatch( entries=[ oci.loggingingestion.models.LogEntry( data="out of limit of items in array " + str(c), id="ocid1.test.oc1..00000001.EXAMPLE-id-Value")], source="EXAMPLE-source-Value", type="EXAMPLE-type-Value")])) return response.Response( ctx, status_code=401, response_data=json.dumps({"active": False, "wwwAuthenticate": "API Gateway JSON"}) ) # Send a log to observability with HEADERs and BODY content put_logs_response = logging.put_logs( log_id="ocid1.log.oc1.iad.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", put_logs_details=oci.loggingingestion.models.PutLogsDetails( specversion="EXAMPLE-specversion-Value", log_entry_batches=[ oci.loggingingestion.models.LogEntryBatch( entries=[ oci.loggingingestion.models.LogEntry( data=jsonData, id="ocid1.test.oc1..00000001.EXAMPLE-id-Value")], source="EXAMPLE-source-Value", type="EXAMPLE-type-Value")])) return response.Response( ctx, response_data=rdata, status_code=200, headers={"Content-Type": "application/json"} ) except(Exception) as ex: jsonData = 'error parsing json payload: ' + str(ex) + ", " + json.dumps(jsonData) pass return response.Response( ctx, status_code=401, response_data=json.dumps({"active": False, "wwwAuthenticate": jsonData}) )
코드 이해
이 코드는 function.zip에서 찾을 수 있습니다.
참고: 함수를 개발하고 API Gateway에서 호출하는 방법을 모르는 경우 API Gateway를 사용하여 함수 호출을 참조하십시오.
-
count_items 메소드는 JSON 구조 내의 배열에서 항목을 계산하는 데 사용됩니다.
-
이 코드 부분은 Python용 OCI SDK를 사용하여 구성 파일 및 개인 키를 로드하고 OCI 테넌시에 액세스합니다.
-
rdata는 요청에서 매개변수를 캡처하고 함수가 API 게이트웨이 구성의 백엔드를 호출하도록 권한을 부여하는 응답을 준비합니다.
active
=True
는 권한 부여를 실행합니다. -
jsonData는 OCI Observability에 HEADER 및 BODY 콘텐츠를 생성하는 데 사용됩니다.
-
이 코드는 요청에서 BODY JSON 구조만 캡처합니다.
-
아래 코드는 BODY JSON 구조 내의 배열에 있는 항목을 계산합니다. 항목 수가 둘 이상의 항목을 초과하면 활성이 False로 설정되고 오류 로그가 OCI 관찰성으로 전송됩니다. 로그를 보내려면 Python OCI SDK를 사용해야 합니다.
주: log_id 변수를 작업 1에서 생성된 OCID 로그로 바꿉니다.
개수가 1보다 작거나 같으면 요청 HEADERs 및 BODY 콘텐츠가 있는 로그가 OCI 관찰성에서 생성됩니다. log_id 변수를 OCID 로그로 바꿔야 합니다.
참고: 다른 OCI 로그에서 로그를 생성할 수 있습니다. 이 자습서에서는 로그가 하나만 생성되었지만 더 많은 로그를 생성할 수 있습니다.
-
오류가 발생하면 오류가 있는 메시지가 여기에 생성됩니다.
OCI에 대한 SDK 인증 구성
OCI에 배포하기 전에 구성 파일을 구성하고 OCI 전용 키와 지문을 함수에 포함시켜야 합니다. OCI CLI(Oracle Cloud Infrastructure 명령행 인터페이스) 설치 및 구성에서 config 및 private key 파일을 생성해야 합니다.
OCI CLI를 설치하고 구성하려면 OCI CLI 설치를 참조하십시오. 이 설치 및 구성은 두 개의 파일을 생성합니다. config 및 private key 파일을 찾습니다(기본값: oci_api_key.pem). 설치 지침에 폴더 경로가 표시됩니다.
function.zip를 다운로드하여 코드, 구성 파일 및 개인 키를 확인합니다. 구성 및 개인 키 파일을 OCI CLI 파일로 바꿉니다.
OCI 함수 작성 및 배치
이 단계에서는 OCI CLI를 사용하여 OCI 함수를 생성하고 코드를 테넌시에 배포해야 합니다. OCI 함수를 생성하려면 OCI 함수 QuickStart를 참조하고 Python 옵션을 검색합니다. 다음 정보를 사용하여 함수를 생성해야 합니다.
- 애플리케이션: fn_apigw_json
함수를 배치한 구획을 기억하십시오. OCI API Gateway 배포를 구성하려면 이 정보가 필요합니다.
작업 3: API 게이트웨이에서 OCI 함수 구성
API를 배포하고 OCI Functions와 통합하여 요청 매개변수(헤더 및 BODY)를 검증하고 OCI Observability에 전송해 보겠습니다. OCI API 게이트웨이에 백엔드를 노출하는 방법을 모르는 경우 OCI API 게이트웨이: API 설정, 생성 및 배포를 참조하십시오.
-
배포 편집을 엽니다.
-
인증 섹션을 누릅니다.
-
단일 인증을 누르고 권한 부여자 함수를 선택합니다.
-
함수 구획(함수를 배치한 위치)을 선택하고 fn_apigw_json 애플리케이션 및 함수 python-json-header를 선택합니다.
-
HEADER 및 BODY를 캡처하도록 Functions 인수를 구성합니다. 이름이 header 및 header2인 HEADER와 이름이 body로 지정될 BODY 콘텐츠를 캡처합니다.
-
경로를 누르고 헤더 변환을 구성합니다. 이 구성은 요청 데이터가 포함된 응답 콘텐츠(HEADER 및 BODY 콘텐츠) 또는 요청에서 생성된 오류를 보기 위한 선택 사항입니다. 함수를 디버그하는 것이 유용합니다.
작업 4: 요청 테스트
주: API 배치에서 권한 부여자 함수를 구성하고 함수 인수를 설정하면 함수 인수에 대한 캐시가 활성화됩니다. 캐시할 데이터 유형을 설정할 수 있습니다. 질의 매개변수 또는 헤더에 대한 캐시는 구성할 수 있지만 본문 콘텐츠에는 구성할 수 없습니다.
API 요청을 테스트할 수 있습니다. 본문의 배열에서 한 항목만 테스트해 보겠습니다.
curl --location 'https://xxxxxxxxxxxxxxxxxxxx.apigateway.us-ashburn-1.oci.customer-oci.com/path_index/path' \
--header 'Content-Type: text/plain' \
--header 'header: header' \
--header 'header2: header2' \
--header 'header3: header3' \
--data '{"data": {"clientID": "xxxxxxxxxxxxxxxxxxx", "secretID": "xxxxxxxxxxxxxxxxxxx", "jList":[{"added_by":"Ani","description":"example description.","start_date":"2014-10-10","mark":255,"id":975}]}}' -i
header3이 전송되었지만 OCI API 게이트웨이에서 함수 인수로 구성되지 않았으므로 로그에 표시됩니다. BODY JSON 배열에는 항목이 하나만 있으므로 적합한 권한 부여 요청입니다.
배열 및 테스트에 항목을 하나 더 넣습니다.
curl --location 'https://xxxxxxxxxxxxxxxxxxxx.apigateway.us-ashburn-1.oci.customer-oci.com/path_index/path' \
--header 'Content-Type: text/plain' \
--header 'header: header' \
--header 'header2: header2' \
--header 'header3: header3' \
--data '{"data": {"clientID": "xxxxxxxxxxxxxxxxxxx", "secretID": "xxxxxxxxxxxxxxxxxxx", "jList":[{"added_by":"Ani","description":"example description.","start_date":"2014-10-10","mark":255,"id":975}, {"added_by":"Ani","description":"example description.","start_date":"2014-10-10","mark":255,"id":975}]}}' -i
관련 링크
확인
- 작성자 - Cristiano Hoshikawa(Oracle LAD A-Team 솔루션 엔지니어)
추가 학습 자원
docs.oracle.com/learn에서 다른 실습을 살펴보거나 Oracle Learning YouTube 채널에서 더 많은 무료 학습 콘텐츠에 액세스하십시오. 또한 education.oracle.com/learning-explorer를 방문하여 Oracle Learning Explorer가 되십시오.
제품 설명서는 Oracle Help Center를 참조하십시오.
Use OCI API Gateway, Functions and Observability to Validate JSON Content and Monitor API Headers and Body
F89782-01
November 2023
Copyright © 2023, Oracle and/or its affiliates.