운동하는 공대생
AWS Lambda 에서 외부 API 호출하기(OCR) 본문
728x90
반응형
Intro
프로젝트를 진행하면서 AWS에서 지원하지 않는 서비를 이용하기 위해서 다른 외부의 API를 호출해야 하는 일이 있었다. 이는 영수증 정보(이미지) 파일을 입력하면 파일에 있는 텍스트 정보를 추출하여 저장해주는 서비스이다. 이는 OCR이라는 기법이다.
What is OCR
Optical Character Recognition(OCR)[1]
보통 컴퓨터가 2진법(0/1) 데이터를 폰트를 통해 인간이 인식할 수 있는 형태로 글자를 보여 준다면, OCR은 그 반대로 인간이 종이 위에 써 놓은 글씨를 인지하여 텍스트 데이터로 치환한다. 보통은 스캐너로 읽어 들인 이미지 파일을 분석하여 텍스트나 워드 파일로 결과물을 내놓는다.
Naver CLOVA OCR
AWS에서 제공하는 OCR영수증 인식 서비스는 한글 형식을 제공하지 않아서 이번에는 국내 네이버에서 지원하는 CLOVA OCR서비스를 사용하였다.
CLOVA OCR에서 서비스를 호출하는 API를 생성했다면 접근을 위한 키와 그리고 API의 URL을 받을수 있다.
Call external API in AWS Lambda
네이버 CLOVA API를 생성했다면 이제 AWS에서 이 API를 호출을 해보겠다.
API호출하기 위해서 URL과 접근 키값을 받았다면 이제 API에 값을 전달하는 형식을 맞춰 주어야 한다. 아래 코드와 같이 네이버에서 요구하는 형식에 맞춰서 입력값을 설정하고 API에 전달을 해준다.
{
"images": [
{
"format": "png",
"name": "medium",
"data": null,
# API에 전달하는 데이터 예시에서는 데이터를 전달하지 않고 URL로 네이버에서 제공하는 클라우드 저장소 주소를 가지고 데이터를 전달했다.
"url": "https://kr.object.ncloudstorage.com/ocr-img/OCR_ko(1)REAN_ko(1).png"
}
],
"lang": "ko",
"requestId": "string",
"resultType": "string",
"timestamp": {{$timestamp}},
"version": "V1"
}
AWS Lambda Code
import json
import requests
from datetime import datetime
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry
import boto3
import base64
import uuid
import time
import pandas as pd
import io
import os
def lambda_handler(event, context):
#api에서 받은 데이터를 base64 디코딩 한다.
file=event['content']
decode_file=base64.b64decode(file)
# TODO implement
#naver clova 를 이용하기 위한 naver api와 secret_key 지정
api_url = (외부 API 주소)
secret_key = (외부 API 키값)
file_data=decode_file
# naver api 를 호출하기 위해서 파일 형식을 json형식으로 api를 호출하며 데이터를 넘긴다.
request_json = {
'images': [
{
'format': 'jpg',
'name': 'demo',
'data': base64.b64encode(file_data).decode()
}
],
'requestId': str(uuid.uuid4()),
'version': 'V2',
'timestamp': int(round(time.time() * 1000))
}
payload = json.dumps(request_json).encode('UTF-8')
headers = {
'X-OCR-SECRET': secret_key,
'Content-Type': 'application/json'
}
#requests함수를 이용하여 api를 호출 결과값을 result에 저장
response=requests.post(api_url, headers=headers, data = payload)
result=response.json()
}
이렇게 외부 API를 호출하기 위해서 외부 API주소와 키값을 가지고 호출하고 전달하는 데이터도 외부 API의 형식에 맞춰서 호출하면 결괏값을 얻을 수 있다.
728x90
반응형
'AWS > Lambda' 카테고리의 다른 글
Docker Container Image 로 AWS Lambda 함수 구현 (0) | 2022.10.31 |
---|---|
AWS Lambda(layer-계층 생성하기) (0) | 2022.10.07 |
AWS Lambda(layer) (0) | 2022.10.06 |
AWS Gate Way(Lambda) (1) | 2022.09.21 |
Comments