1. AWS Console 접속 후 RDS 선택

2. 업그레이드 할 MySQL 5.6 Instance 선택

3. 인스턴스 수정 선택



4. 그리고나서 아래로 쭉쭉 내려가고 업그레이드 진행까지 눌렀을 떄 아무 이상없이 잘된다면 다행이지만,

이런 메시지가 나올 수 있습니다.


Current Parameter Group (xxx-parameter-group) is non-default. "You need to explicitly specify a new Parameter Group in this case (default or custom)"


(여기서 xxx-parameter-group은 임의의 파라미터 그룹명을 나타내는겁니다. 실제로는 각각 다르게 나타날 것입니다.)


이러한 에러가 나오면서 진행이 안되는 이유는 간단합니다.

만약에 5.6 버전에서 파라미터 그룹이 default로 지정된 상태라면 모를까, 

임의의 파라미터 그룹을 생성 후 적용 중이라면 업그레이드 시 적용되지 않습니다.


그 이유는 AWS RDS - MySQL의 파라미터 그룹(Parameter Group)은 각 버전 별로 생성되고 관리되기 때문입니다.



위 사진과 보시다시피, RDS의 파라미터 그룹은 각 패밀리 별로 구성되어 있으며, 패밀리는 DB의 Version 별로 관리가 됩니다.

즉 기존에 사용되었던 파라미터 그룹은 MySQL 5.6전용이므로, 버전 업그레이드 시 그대로 사용할 수 없습니다.


그러므로 MySQL 5.6에서 5.7로 업그레이드하기 위해서는 MySQL 5.7용 파라미터 그룹을 미리 생성을 해야 합니다.


MySQL 5.7 버전 파라미터 그룹을 미리 생성한 후, 

기존 MySQL 5.6 인스턴스를 업그레이드하기 위해서 위 절차대로 다시 수정하려고 하면 파라미터 그룹은 다음과 같이 나타납니다.



여기에서의 custom-group은 MySQL 5.7 버전용으로 미리 생성해놓은 파라미터 그룹으로, MySQL 5.7 버전 업그레이드 시 기본으로 표시되게 됩니다.

이 상태에서 업그레이드를 하면 아무 문제없이 진행되며, 10분 정도 시간이 소요된 후 완료가 됩니다.


MySQL Version Upgrade 시 유의사항이므로 참고하시기 바랍니다.


추후에는 MariaDB나 AuroraDB로의 Migration에 대해서도 시간나면 다루어 보겠습니다.



WRITTEN BY
鬼風
생각이 깨어있지 않다면 살아갈 이유도 없다

트랙백  0 , 댓글  0개가 달렸습니다.
secret

이번 글에서는 Amazon Linux(AMI) 및 Python에서 Tesseract-ocr을 설치하고 사용하는 법을 알아본다.


먼저 Tesseract-ocr 이란 무엇인가부터 보자.

간단하게, 이미지에서 문자를 추출하기 위한 ocr 기술을 오픈소스로 제공하는 도구로 보면 된다.


사실 이것과 관련해서는 이 블로그 외에도 다른 블로그에도 상당히 많은 자료가 있어서 금방 찾기가 쉽다.

하지만, Amazon Linux AMI 및 Python 2.7 기반에서 설치 및 사용하는 부분은 문서 하나로 정리되어 있지 않고 여러 문서를 통해서 나타나 있어서

이를 하나로 정리하고자 포스팅을 올려본다.


개발 환경

OS: Amazon Linux AMI

python: 2.7

tesseract-ocr: 3.04



1. tesseract-ocr 설치 및 실행

Amazon Linux에서의 tesseract-ocr 설치는 다음 문서를 기반으로 한다.

https://gist.github.com/IaroslavR/834066ba4c0e25a27078

물론 OS가 다르다면 다른 블로그 및 tesseract-ocr 설치 문서에 의거해서 설치가 가능하지만,

Amazon Linux AMI는 해당 문서대로 설치해도 설치가 실제로 잘 안된다.

그러므로 위 링크에 있는 문서를 기반으로 하게 되었다.


다만 위 문서대로 100% 할 수는 없다. 

왜냐하면 우리는 한국어 버전을 설치하고 사용해야 하기 때문에, 코드도 이에 맞게 변형이 필요하다.

이에 따라 위 문서를 기반으로 코드를 수정하면 다음과 같다.


# 기본 프로그램 설치
sudo yum install autoconf aclocal automake
sudo yum install libtool
sudo yum install libjpeg-devel libpng-devel libtiff-devel zlib-devel

# Leptonica 설치 - 이미지 처리 분석을 위한 도구

cd ~/downloads
wget http://www.leptonica.com/source/leptonica-1.72.tar.gz
tar -zxvf leptonica-1.72.tar.gz
cd leptonica-1.72
./configure
make
sudo make install
cd ..

# Tesseract-ocr 3.04 설치

# 주의점: c++이 설치되어있지 않으면 설치가 안된다. 
# 만약 설치가 안되어있다면 sudo yum install gcc-c++ 을 실행해서 설치한다.

wget https://github.com/tesseract-ocr/tesseract/archive/3.04.00.tar.gz

tar -zxvf 3.04.00.tar.gz
cd tesseract-3.04.00/
./autogen.sh
./configure
make
sudo make install
sudo ldconfig

# 언어 팩을 다운받고 추가하는 부분을 아래에서 진행한다.

cd /usr/local/share/tessdata
# 원문 문서에서는 해당 경로가 아닌 다른 경로에서 다운받도록 되어있으나, 3.04 파일이 아니므로 아래 링크에서 받아야 한다.

# 만약 다운을 받았는데 용량이 너무 적게 나타나면, 제대로 다운로드가 안된것이니 참고하도록 한다.

sudo wget https://github.com/tesseract-ocr/tessdata/tree/3.04.00/eng.traineddata
sudo wget https://github.com/tesseract-ocr/tessdata/tree/3.04.00/kor.traineddata
export TESSDATA_PREFIX=/usr/local/share/

# 최적화에 사용되는 파일이다. 이것은 받아두도록 한다.
sudo wget hhttp://tesseract-ocr.googlecode.com/files/tesseract-ocr-3.01.osd.tar.gz
sudo tar xvf tesseract-ocr-3.01.osd.tar.gz
sudo mv tesseract-ocr/tessdata/* .
sudo rm tesseract-ocr-3.01.osd.tar.gz

nano ~/.bash_profile
# Copy this line to the end: export TESSDATA_PREFIX=/usr/local/share/
# Verify:
tesseract --list-langs



여기까지만 하면 설치 완료. 테스트를 해보도록 한다.

테스트를 위해서 아무 문서나 막 퍼오면 안되므로, 공정거래법 조항 일부를 이미지로 저장해보도록 한다.



이제 한번 실행해보도록 한다.


~/$ tesseract test.png ./out_kor -l kor hocr
Tesseract Open Source OCR Engine v3.04.00 with Leptonica


여기서 파라미터를 보자.

test.png: 이미지파일

out_kor: 텍스트파일, out_kor.txt로 생성된다.

-l kor: language를 한국어(kor)로 한다.

hocr: 이건 사실 안붙여도 된다. 결과값을 XML로 받아볼 때 쓰는 파라미터로, out_kor.hocr 파일이 추가 생성된다.


이제 한번 결과를 보도록 한다.



제1징 충직
제1조(독적) 미 킵톨 시밉저익 시짐저쎄직저뮈익 님욤피 과도한 결재릭익 짐중들 말저히고「 부딥한곰돔뱉뮈 및 믈곰짐거레뱉뮈쿨 규재히며 곰절히고 저뮤로문 결젤들 촉 같으로써 칠익직민 기밉팥돔들 조

제츠조썹의) 미 밑에서 시욤히는 욤머익 짐익는 다믈피 같다 <개절 `딘므2 `2 핀′ 잿딘므듭 `2 3[| ′ 잿므므므 2 5 ′ 2[|미 ` 내 ′ 2띤띤4 `2 어 ′2[|띤7 4 27 ′ 2딘[|7 된 3 ′ 2미7 4 내 ′ 2미7 m 읽 >
` 쩨밉쟈맙 말든 재조밉「 서비스밉「 기다시밉들 미 }는 저들 말한다 시밉저익 미믹들 무 햐뱉뮈쿨 흡 밈뮌 좁밉뮌 대리인 기다익 저는 시밉저한체에 관한 규절익 직욤에 있어서는 미룰 시밉저로 튼다
`익2 에주회샤맙 말릴 ×식(붉홍들 쪼힙한다 미바같다뵙 소뮤쿨 톰히며 극내회시익 시밉내욤들 저쎄바는 것들 주된 시밉으로 허는 회시로서 저 솝긔미 다쇼톨효렬미 접히는 굳맥미심민 회시쿨 렬한다
잿익딘 셈저회시셈긴흔 펫주회시에 익히며 돠쇼롤효렬미 접히는 기준에 따리 그 시밉내욤들 저쎄말는 극내회시쿨 말한다
`익4 "손 텃샤한 저회시에 익히며 다쇼롤효렬으로 접히는 기준에 따리시밉내욤들 저쎄말는 극내회시쿨 말한다
2 미밉짐」 미리 말든 돔말민미 다들 칵독익 구쿤에 따리다쇼롤효렬미 접히는 기준에 익히며 시실십 그 시밉내욤들 저쎄히는 회시익 짐한들
기 돔말민미 회시민 결무그 돔말민피그 돔말민미 저배늘 」 히다미십익 회시익 징한
다 돔말민미 회시기미닌 결무 그 돔말민미 저쎄히는 2미심익 회시익 징한
3 에멸회샤맙 말든 2미십익 회시기돔말한기밉짐한에 속하는 결무에 미돌 회시는 서로 심대말익 계멸회시리 한다
3익2 에멸줄쟈틴 기밉짐한 소속 회시기 계멸회시익 주식들 취득 또는 소뮤히는 뱉뮈쿨 }
딘익딘 에멸줄저회 린 계멸줄저쿨 톱히며 튼 계열 법 주식들 또는 소뮤히는 계멸회시쿨 말한다
3익4 에멸줄저대뺄뵈샤틴 계멸줄저쿨 뺄바며 계멸줄저회시기 쉐득 또는 소뮤히는 계멸회시 주식들 말뱉한 계멸회시쿨 말한다
딘익드 }줄저”린 크게 미십익 계멸줄저로 민결된 계멸회시모두기계멸줄저회시 및 계멸줄저대심회시기 되는 계멸줄저 핀계쿨 말한다
딘익듭 〉줄저회시짐한"미린 기밉짐한 소 회시중 순흰줄저핀계에 있는 계 법 짐한들 말한다
3익7 재무보즐떼린 기밉짐한에 속바는 회시기다믈 칵 독인 어느 히다에 레딥바는 극내굳튤기핀익 며신피핀킥히며 극내계멸회시에 대히며 뱉히는 보즐 말한다



보다시피, 100% 만족하는 결과가 나오지는 못하였다.

하지만 그래도 어느 정도의 인식은 가능하다는 것을 증명할 수 있다.

해당 부분의 정확도를 높이기 위한 부분은 추후 테스트를 통해서 세부적으로 다룰 예정이다.



2. python에서의 설치 및 실행 (pytesseract)

Python 2.7에서는 pytesseract 를 설치하여 구현이 가능하다.

물론 Tesseract가 사전에 설치가 되어 있어야 한다.

그러므로 설치한다.



~/$ pip install opencv-python
~/$ pip install pytesseract

이렇게 두개를 설치하면 된다.

테스트 코드도 다음과 같이 짜본다.



import cv2
import PIL
import pytesseract

img_path = 'test.png'
img = cv2.imread(img_path,cv2.IMREAD_COLOR)
img2 = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
img2 = PIL.Image.fromarray(img2)
txt = pytesseract.image_to_string(img2, lang='kor')
print(txt)



1. test.png를 img_path 이름으로 한다.

2. img 변수에 cv2.imread를 이용해서 이미지를 실제로 불러온다.

3. img2 변수에 Grayscale(흑백) 으로 변환을 시킨다.

4. 이미지 처리 및 핸들링을 위해서 PIL Image를 사용한다. (다만 위 예제에서는 이를 직접적으로 활용하지는 않는다, 세부적으로 다룰 때 사용할 것으로 보인다)

5. pytesseract를 사용하여 이미지 내 글자 추출을 txt로 하고 출력한다.


이렇게 하면 다음과 같은 결과가 나온다.



제1징 충직
재1조(독적) 미 킵톨 시밉저익 시짐저쎄직저뮈익 님욤피 과도한 결재릭익 짐중들 말저히고「 부딥한곰돔뱉뮈 및 믈곰짐거레뱉뮈쿨 규재히며 곰절히고 저뮤로문 결젤들 촉 같으로써 칠익직민 기밉팥돔들 조

재츠조찔의) 미 밑에서 시욤히는 욤머익 짐익는 다믈피 같다 <개절 `딘므2 `2 핀′ 잿딘므듭 `2 3[| ′ 잿므므므 2 5 ′ 2[|미 ` 내 ′ 2띤띤4 `2 어 ′2[|띤7 4 27 ′ 2딘[|7 된 3 ′ 2미7 4 내 ′ 2미7 m 읽 >
` 쩨밉쟈맙 말든 재조밉「 서비스밉「 기다시밉들 미 }는 저들 말한다 시밉저익 미믹들 무 햐뱉뮈쿨 흡 밈뮌 좁밉뮌 대리인 기다익 저는 시밉저한체에 관한 규절익 직욤에 있어서는 미룰 시밉저로 튼다
`익2 에주회샤맙 말릴 ×식(붉홍들 쪼힙한다 미바같다뵙 소뮤쿨 톰히며 극내회시익 시밉내욤들 저쎄바는 것들 주된 시밉으로 허는 회시로서 저 솝긔미 다쇼톨효렬미 접히는 굳맥미심민 회시쿨 렬한다
잿익딘 셈저회시셈긴흔 펫주회시에 익히며 돠쇼롤효렬미 접히는 기준에 따리 그 시밉내욤들 저쎄말는 극내회시쿨 말한다
`익4 "손 텃샤한 저회시에 익히며 다쇼롤효렬으로 접히는 기준에 따리시밉내욤들 저쎄말는 극내회시쿨 말한다
2 미밉짐」 미리 말든 돔말민미 다들 칵독익 구쿤에 따리다쇼롤효렬미 접히는 기준에 익히며 시실십 그 시밉내욤들 저쎄히는 회시익 짐한들
기 돔말민미 회시민 결무그 돔말민피그 돔말민미 저배늘 」 히다미십익 회시익 징한
다 돔말민미 회시기미닌 결무 그 돔말민미 저쎄히는 2미심익 회시익 징한
3 에멸회샤맙 말든 2미십익 회시기돔말한기밉짐한에 속하는 결무에 미돌 회시는 서로 심대말익 계멸회시리 한다
3익2 에멸줄쟈틴 기밉짐한 소속 회시기 계멸회시익 주식들 취득 또는 소뮤히는 뱉뮈쿨 }
딘익딘 에멸줄저회 린 계멸줄저쿨 톱히며 튼 계열 법 주식들 또는 소뮤히는 계멸회시쿨 말한다
3익4 에멸줄저대뺄뵈샤틴 계멸줄저쿨 뺄바며 계멸줄저회시기 쉐득 또는 소뮤히는 계멸회시 주식들 말뱉한 계멸회시쿨 말한다
딘익드 }줄저”린 크게 미십익 계멸줄저로 민결된 계멸회시모두기계멸줄저회시 및 계멸줄저대심회시기 되는 계멸줄저 핀계쿨 말한다
딘익듭 〉줄저회시짐한"미린 기밉짐한 소 회시중 순흰줄저핀계에 있는 계 법 짐한들 말한다
3익7 재무보즐떼린 기밉짐한에 속바는 회시기다믈 칵 독인 어느 히다에 레딥바는 극내굳튤기핀익 며신피핀킥히며 극내계멸회시에 대히며 뱉히는 보즐




물론 위 예제와 마찬가지로 글씨 필터링이 썩 만족스럽지는 못한다.

다만 tesseract-ocr에서 직접 실행한 것보다는 그나마 조금 나아 보이기도 하다.


이제 이 부분을 바탕으로 좀 더 정교한 검색 및 부분 추출 등에 대해서는 다음 글에서 다루도록 하며,

기초적인 설치 및 사용은 여기서 마친다.





WRITTEN BY
鬼風
생각이 깨어있지 않다면 살아갈 이유도 없다

트랙백  0 , 댓글  0개가 달렸습니다.
secret

제가 맨날 연구하고 개발만 한다고 블로그에 글만 쓰고 정작 진행된 것은 하나도 없었는데,

이번에 드디어 처음으로 성과물이 하나 나왔습니다.


http://caocao.kr


조조전 온라인 코스트 계산기입니다.




개발 프로그래밍 프레임워크: Django 1.9

개발 프로그래밍 언어: Python 2.7

Database: MySQL 5.6

웹 서버: Amazon Web Service Elasticbeanstalk

개발 서버 Instance: Amazon Web Service - Amazon Linux Instance

도메인: hosting.kr 을 통해서 도메인 보유 후 AWS Route 53 에서 Web Hosting



기존에는 Django에서 웹 개발하는 몇몇 샘플 게시물만 올렸었는데, 개발 과정과 관련된 글도 정리해서 올리겠습니다.




WRITTEN BY
鬼風
생각이 깨어있지 않다면 살아갈 이유도 없다

트랙백  0 , 댓글  0개가 달렸습니다.
secret

이번 글에서는 Amazon Web Service(AWS) 에서 DynamoDB를 사용하는 방법을 Python을 이용해서 다루도록 하겠습니다.

처음에 AWS Python 카테고리에서 DynamoDB를 다루고자 했던 것은 아니였지만, 이번 회사에서 기술보고서를 작성하는 과정에 있어서 주제를 DynamoDB를 하다 보니까 블로그에도 같이 다루는 것이 좋을 것 같아서 올려봅니다.


2018/06/03 - [Onik Lab./AWS Python] - AWS DynamoDB in Python (Boto3) - #1. 소개

2018/06/03 - [Onik Lab./AWS Python] - AWS DynamoDB in Python (Boto3) - #2. 테이블 관리

2018/06/03 - [Onik Lab./AWS Python] - AWS DynamoDB in Python (Boto3) - #3. 항목 관리


이번 글은 지난 글에 이어서 AWS SDK for Python인 Boto3 를 사용한 DynamoDB의 항목(Items) 호출을 위한 Query & Scan에 대해서 다루어보도록 하겠습니다.

모든 내용은 AWS의 Boto3 Documentation에 있는 내용이며, 번역자료가 없기 때문에 제가 직접 실습하면서 나타내도록 하겠습니다.


원본 문서: http://boto3.readthedocs.io/en/latest/guide/


영어 문서이므로 참고하시기 바랍니다.


1. Query & Scan 

두 가지 모두 DynamoDB의 항목 호출을 위한 기능이지만, 사용 용도는 약간 차이가 있습니다.

Query는 특정 값을 검색했을 때 나타나는 결과를 조회할 때 사용됩니다. 예제에서는 하나의 항목만 반환하지만, get_items() 함수와 기능은 비슷하지만, get_items()가 단순히 키를 지정했을 때의 값을 가져오는 것이지만, Query는 더욱 자세한 조건을 통해서 값을 가져오는 것이 가능합니다.

Scan은 Query와는 다르게 특정 값을 지정해서 불러올 수도 있지만, 주 용도는 호출하고자 하는 값의 범위를 검색 조건으로 할 때 사용됩니다. 내부 속성으로는 FilterExpression을 사용하며, 이는 즉 필터링을 위한 용도로 보는 것이 맞을 것입니다.

Query & Scan을 사용하기 위해서는 boto3를 import하는 것 외에도 추가 클래스를 호출해야 합니다.

추가 클래스는 boto3.dynamodb.conditions.Key와 boto3.dynamodb.conditions.Attr 클래스로, 호출 방법은 아래와 같습니다.

from boto3.dynamodb.conditions import Key, Attr

import boto3 바로 밑에 작성하면 아무 문제 없이 클래스 import가 가능합니다.


아래 Query & Scan을 위한 기본 예제 테이블은 users 테이블로 할 것이며, 해당 테이블의 항목은 아래와 같습니다.

항목의 Address가 내재된 속성(Nested Attributes)들을 포함하고 있으므로, 각 항목 별 값을 나타내면 다음과 같습니다.


 


이 점을 참고하시고 아래 예제를 실행한 결과를 보시면 더욱 이해가 될 수 있을 것입니다.


2. Query

Query 예제는 아래와 같으며, username 파티션 키 값이 'johndoe'의 값을 가진 항목(Equal: EQ)을 조회하는 내용입니다.

당연히 import 에서 클래스 로드까지 모두 마친 상태입니다.

response = table.query(

    KeyConditionExpression=Key('username').eq('johndoe')

)

items = response['Items']

print(items)

결과는 johndoe의 항목이 호출됩니다.


3. Scan

Scan 첫번째 예제입니다. age 속성의 값이 27보다 작을 때 (Lower Than: LT) 의 내용입니다.

response = table.scan(

    FilterExpression=Attr('age').lt(27)

)

items = response['Items']

print(items)

 

결과는 johndoe와 bobsmith의 항목이 호출됩니다.



Scan 두번째 예제입니다. 조건이 조금은 더 복잡해졌습니다.

first_name의 값이 'J'로 시작(Begins_with)하고, account_type이 'super_user'와 동일할 때의 내용입니다.

response = table.scan(

    FilterExpression=Attr('first_name').begins_with('J') & Attr('account_type').eq('super_user')

)

items = response['Items']

print(items)

 

결과는 janedoering의 항목이 호출됩니다.



Scan 세번째 예제입니다. 위 예제와는 달리, 속성 내에 내재된 속성, 즉 속성 안에 속성 값을 검색할 때 쓰는 조건입니다.

Nested Attributes에 대한 검색 관리도 아래와 같이 할 수 있으며, addresss 속성의 state 속성의 값이 'CA'일 때 나타내는 내용입니다.

response = table.scan(

    FilterExpression=Attr('address.state').eq('CA')

)

items = response['Items']

print(items)

결과는 johndoe와 alicedoe의 항목이 호출됩니다.



Python SDK인 Boto3를 활용하여 DynamoDB를 관리하는 방법에 관한 글은 여기까지입니다.

이 모든 내용은 AWS Boto3 Documentation에 있는 내용이지만, 번역이 되어 있지 않았고,

앞으로도 DynamoDB를 사용할 일이 생길 때 Python으로 어떻게 해야 할 지를 나타내고자 할 때에는 이러한 기본 예제를 들어 활용하면 될 것입니다.


하지만 고급 프로그래밍을 하게 되면 이것보다는 훨씬 복잡한 명령어를 작성해야 할 것입니다.

그렇기 때문에 AWS에서는 이를 위한 예제를 별도로 제공하고 있습니다.

Tic-tac-toe라는 Python Application에서 DynamoDB를 사용한 예제를 AWS에서 제공하고 있으니, 향후 DynamoDB 프로그래밍이 필요할 때에는 위에서 다룬 내용을 바탕으로 하고, 예제 문서를 참고하여 프로그램을 개발하면 될 것으로 생각됩니다.


Tic-tac-toe Python Link: https://docs.aws.amazon.com/ko_kr/amazondynamodb/latest/developerguide/TicTacToe.html


이상 글 마치겠습니다.


 



WRITTEN BY
鬼風
생각이 깨어있지 않다면 살아갈 이유도 없다

트랙백  0 , 댓글  0개가 달렸습니다.
secret

이번 글에서는 Amazon Web Service(AWS) 에서 DynamoDB를 사용하는 방법을 Python을 이용해서 다루도록 하겠습니다.

처음에 AWS Python 카테고리에서 DynamoDB를 다루고자 했던 것은 아니였지만, 이번 회사에서 기술보고서를 작성하는 과정에 있어서 주제를 DynamoDB를 하다 보니까 블로그에도 같이 다루는 것이 좋을 것 같아서 올려봅니다.


2018/06/03 - [Onik Lab./AWS Python] - AWS DynamoDB in Python (Boto3) - #1. 소개

2018/06/03 - [Onik Lab./AWS Python] - AWS DynamoDB in Python (Boto3) - #2. 테이블 관리


이번 글은 지난 글에 이어서 AWS SDK for Python인 Boto3 를 사용한 DynamoDB의 항목(Items) 관리에 대해서 다루어보도록 하겠습니다.

모든 내용은 AWS의 Boto3 Documentation에 있는 내용이며, 번역자료가 없기 때문에 제가 직접 실습하면서 나타내도록 하겠습니다.


원본 문서: http://boto3.readthedocs.io/en/latest/guide/


영어 문서이므로 참고하시기 바랍니다.


먼저 항목(Items)이 무엇인지에 대해서 간단히 언급하겠습니다.

항목이란 쉽게 말해서, 데이터 값입니다.

RDBMS에서는 레코드(Record) 또는 행(Row)이라고도 하는데, DynamoDB는 NoSQL의 특성에 맞게 항목(Items)으로 나타납니다.

이 점을 참고하시면 될 것으로 생각됩니다.


이 게시물에 있는 모든 예제는 users Table에서 이루어집니다.

users Table의 기본 키(Primary Key)는 username(Partition Key)과 last_name(Sort Key)로 구성되어 있으니 이 점 반드시 참고 바랍니다.


1. 기본 데이터 처리 - CRUD

DB를 하시는 분은 CRUD가 무엇인지 정도는 다 알 것입니다. 

RDBMS에서는 SQL에서 Insert / Select / Update / Delete의 기능으로도 볼 수 있겠고요.


DynamoDB의 항목 생성/호출/갱신/삭제 또한 마찬가지입니다.


1) 생성

table.put_item(

   Item={

        'username': 'janedoe',

        'first_name': 'Jane',

        'last_name': 'Doe',

        'age': 25,

        'account_type': 'standard_user',

    }

)


생성은 put_item 을 사용하여 입력이 이루어집니다.

위에 언급했다 시피, username과 last_name 속성은 기본 키이므로, first_name, age, account_type은 추가 속성으로 자유롭게 입력된 것을 확인할 수 있습니다.

결과는 다음과 같습니다.


2) 호출

일반적으로 호출이라 함은 SQL에서 select에 해당되는 부분으로 볼 수 있습니다.

하지만 실제 자세한 호출은 아래에서 상세히 다룰 예정이며, 지금 예제는 하나의 값을 단순히 불러오는 예제로 보시면 되겠습니다.

response = table.get_item(

    Key={

        'username': 'janedoe',

        'last_name': 'Doe'

    }

)

item = response['Item']

print(item)

 

위 예제와 같이, 기본 키를 입력해서 해당 키의 값을 불러오는 과정으로, 커맨드 창에서 파이썬을 실행한 결과는 다음과 같습니다.


3) 갱신

갱신은 특정 값을 변경하는 것이므로, 변경 대상 항목과 변경될 값을 입력하면 됩니다.

table.update_item(

    Key={

        'username': 'janedoe',

        'last_name': 'Doe'

    },

    UpdateExpression='SET age = :val1',

    ExpressionAttributeValues={

        ':val1': 26

    }

)

예제에서와 같이, 변경 대상 항목 지정을 위한 Key를 입력하고, UpdateExpression을 통해서 대상 속성의 값을 지정합니다.

그리고 ExpressionAttributeValues를 통해서 특정 값에 대한 변수 값을 입력합니다.

AWS Console에서의 갱신 결과는 아래와 같습니다.


4) 삭제

삭제는 기본 키를 조건으로 지정하면 즉시 삭제가 가능합니다.

table.delete_item(
    Key={
        'username': 'janedoe',
        'last_name': 'Doe'
    }
)

결과는 아래와 같습니다.

AWS Console에서 아무 항목도 없는 것으로 확인될 것입니다.



사실 여기까지는 너무 기본적인 내용입니다.

이제 DynamoDB에서 활용하는 데이터 관리에 대해서 좀 더 알아보도록 하겠습니다.



2. Batch Writing

DynamoDB에서는 대용량의 데이터를 입력할 때, Batch Writing기능을 사용하여 속도를 향상시키고, 요청에 필요할 수를 줄일 수 있습니다. 이 기능은 항목(Item)을 Batch 순서에 의해서 자동으로 조절할 수 있으며, 데이터 전송이 이루어지지 않을 때에 재전송 기능도 수행하도록 되어 있습니다.다.

데이터 추가는 put_item 명령어를 사용하는 것을 기본으로 하며, 반대로 삭제는 delete_item 명령어를 사용하는 것을 기본 명령어로 수행합니다.


라고 제 요량대로 번역해본 것입니다. 원문은 아래와 같습니다.

출처: 맨 위의 Boto3 Documentation


If you are loading a lot of data at a time, you can make use of DynamoDB.Table.batch_writer() so you can both speed up the process and reduce the number of write requests made to the service.

This method returns a handle to a batch writer object that will automatically handle buffering and sending items in batches. In addition, the batch writer will also automatically handle any unprocessed items and resend them as needed. All you need to do is call put_item for any items you want to add, and delete_itemfor any items you want to delete:

 


위의 기본 데이터 처리는 하나의 값을 넣는 형태로 이루어지지만, 대용량으로 한꺼번에 입력이 필요할 때, 이에 대한 속도 처리를 위한 명령어를 Boto3에서 제공한다고 보시면 간단히 이해가 될 것입니다.

일단 Batch Writing을 사용하여 여러 개의 데이터를 입력하는 예제부터 보여드리겠습니다.


with table.batch_writer() as batch:

    batch.put_item(

        Item={

            'account_type': 'standard_user',

            'username': 'johndoe',

            'first_name': 'John',

            'last_name': 'Doe',

            'age': 25,

            'address': {

                'road': '1 Jefferson Street',

                'city': 'Los Angeles',

                'state': 'CA',

                'zipcode': 90001

            }

        }

    )

    batch.put_item(

        Item={

            'account_type': 'super_user',

            'username': 'janedoering',

            'first_name': 'Jane',

            'last_name': 'Doering',

            'age': 40,

            'address': {

                'road': '2 Washington Avenue',

                'city': 'Seattle',

                'state': 'WA',

                'zipcode': 98109

            }

        }

    )

    batch.put_item(

        Item={

            'account_type': 'standard_user',

            'username': 'bobsmith',

            'first_name': 'Bob',

            'last_name':  'Smith',

            'age': 18,

            'address': {

                'road': '3 Madison Lane',

                'city': 'Louisville',

                'state': 'KY',

                'zipcode': 40213

            }

        }

    )

    batch.put_item(

        Item={

            'account_type': 'super_user',

            'username': 'alicedoe',

            'first_name': 'Alice',

            'last_name': 'Doe',

            'age': 27,

            'address': {

                'road': '1 Jefferson Street',

                'city': 'Los Angeles',

                'state': 'CA',

                'zipcode': 90001

            }

        }

    )

batch_writer를 사용하여 여러 개의 값을 입력하는 형태입니다.

4개의 값이 순차적으로 입력된 것을 확인할 수 있습니다.


다음은 for 반복문을 이용한 입력 결과입니다.

with table.batch_writer() as batch:

    for i in range(50):

        batch.put_item(

            Item={

                'account_type': 'anonymous',

                'username': 'user' + str(i),

                'first_name': 'unknown',

                'last_name': 'unknown'

            }

        )

순서는 좀 뒤죽박죽인 것 같습니다.


다음은 기본 키를 사용한 예제입니다.

with table.batch_writer(overwrite_by_pkeys=['username', 'last_name']) as batch:

    batch.put_item(

        Item={

            'username': 'p1',

            'last_name': 's1',

            'other': '111',

        }

    )

    batch.put_item(

        Item={

            'username': 'p1',

            'last_name': 's1',

            'other': '222',

        }

    )

    batch.delete_item(

        Key={

            'username': 'p1',

            'last_name': 's2'

        }

    )

    batch.put_item(

        Item={

            'username': 'p1',

            'last_name': 's2',

            'other': '444',

        }

    )

다른 예제와는 다르게, 상단에 overwrite by pkeys = [‘username’,’last_name’] 구문이 들어가 있는 것을 확인할 수 있을 것입니다.

여기에서의 pkeys는 기본키가 들어가며, 파티션 키, 정렬 키의 값이 들어갑니다.


위 예제에서는 [p1, s1, 111], [p1, s1, 222] 값을 입력한 후, [p1, s2] 키 값을 삭제하고 [p1, s2, 444] 값을 입력하는 순서로 되어 있습니다.

하지만 여기서 생각을 해야 할 것이 있습니다.


기본 키가 같을 경우, 세부 속성이 다르더라도 중복된 값이 들어가면 안됩니다.


그러므로 batch.put_item을 일반적으로 썼더라면 에러가 발생할 수 있습니다.

하지만 실제 결과는 다음과 같습니다.

[p1, s1, 222]와 [p1, s2, 444] 2개만 들어간 것을 확인할 수 있습니다.

어떻게 된 것일까요.


이는 batch_writer에서 overwrite by pkeys를 지정했기 때문에 오류가 발생하지 않는 것입니다.

만약에 같은 기본키에 값이 또 들어올 경우에는 overwrite를 해서 먼저 입력된 값을 덮어 씌우라는 뜻이였으므로,

[p1, s1, 111] 의 값이 이미 기본키로 들어가 있었지만, 그 후에 [p1, s1, 222]의 값으로 대체가 된 것으로 보시면 됩니다.


Batch Writer를 통한 입력/삭제는 위와 같이 활용하면 대용량 데이터 입력 시에도 원하는 형태로의 코드 작성이 가능할 것으로 생각됩니다.


다음은 마지막으로 실제 항목, 즉 데이터 호출을 위한 Query & Scan에 대해서 알아보도록 하겠습니다.


WRITTEN BY
鬼風
생각이 깨어있지 않다면 살아갈 이유도 없다

트랙백  0 , 댓글  0개가 달렸습니다.
secret

이번 글에서는 Amazon Web Service(AWS) 에서 DynamoDB를 사용하는 방법을 Python을 이용해서 다루도록 하겠습니다.

처음에 AWS Python 카테고리에서 DynamoDB를 다루고자 했던 것은 아니였지만, 이번 회사에서 기술보고서를 작성하는 과정에 있어서 주제를 DynamoDB를 하다 보니까 블로그에도 같이 다루는 것이 좋을 것 같아서 올려봅니다.


2018/06/03 - [Onik Lab./AWS Python] - AWS DynamoDB in Python (Boto3) - #1. 소개


이번 글은 Boto3 및 DynamoDB 테이블 관리에 대해서 다루어보도록 하겠습니다.

이전 글에서 언급했다시피, AWS DynamoDB를 사용하기 위해서 Amazon에서는 각 프로그래밍 언어 별 SDK를 배포하고 있다고 하였습니다.

Python SDK도 당연히 있으며, AWS SDK in Python 인 Boto3 를 이용해서 DynamoDB와 연동해보도록 하겠습니다.


원본 문서: http://boto3.readthedocs.io/en/latest/guide/

영어 문서이므로 참고하시기 바랍니다.


1. Boto3 설치

매우 쉽습니다. 이미 Python 2.7 이상 버전이 모두 설치되어 있을 것이므로, pip를 통해서 설치를 하면 됩니다.

$ pip install boto3 


큰 문제가 없다면 설치가 정상적으로 이루어 질 것입니다. 중간 과정은 너무 길어서 생략했습니다.

참고로 중간에 빨간색 에러메시지가 나타날 수 있는데, 해당 부분보다도 성공적으로 설치되었는지 확인만 하면 됩니다. 

(다만 에러메시지 부분은 추후 재확인해보도록 하겠습니다)


2. Table 생성

Boto3 만 설치했는데 테이블을 바로 생성한다고요?

네 그렇습니다. DynamoDB는 AWS의 EC2 Server 구축만 되어있고, Python, Boto3, AWS CLI 설치가 완료되면 곧바로 사용이 가능합니다.


AWS Console 상에서 테이블을 생성하는 것이 가능하지만, Python과의 연동을 위해서 Python을 통해서 생성하도록 하겠습니다.


import boto3

 

# Get the service resource.

dynamodb = boto3.resource('dynamodb')

 

# Create the DynamoDB table.

table = dynamodb.create_table(

    TableName='users',

    KeySchema=[

        {

            'AttributeName': 'username',

            'KeyType': 'HASH'

        },

        {

            'AttributeName': 'last_name',

            'KeyType': 'RANGE'

        }

    ],

    AttributeDefinitions=[

        {

            'AttributeName': 'username',

            'AttributeType': 'S'

        },

        {

            'AttributeName': 'last_name',

            'AttributeType': 'S'

        },

 

    ],

    ProvisionedThroughput={

        'ReadCapacityUnits': 5,

        'WriteCapacityUnits': 5

    }

)

 

# Wait until the table exists.

table.meta.client.get_waiter('table_exists').wait(TableName='users')

 

# Print out some data about the table.

print(table.item_count)


이게 다입니다. 굉장히 쉬울 것입니다.

그리고 실행만 하면 끝.


1) import boto3를 하여 boto3 SDK를 불러옵니다.

2) DynamoDB의 기본 키(Primary Key) 생성을 위해서 Key Schema 속성을 사용하고, 파티션키와 정렬키를 각각 HASH / RANGE 속성값으로 지정합니다.

3) 기본 키에 해당하는 속성의 유형을 AttributeDefinitions로 지정하고, 문자열(String) 유형인 'S"로 지정합니다.

4) 읽기 / 쓰기 용량도 더불어 지정합니다.

5) 커맨드 창에서 Python을 실행하면 '0'이라고 나오는데, 정상입니다. '0'은 생성된 이후 항목(Item) 개수를 나타내는 결과값이기 때문입니다.


생성된 DynamoDB 테이블을 보도록 하겠습니다.


아무 문제 없이 설치가 완료된 것을 볼 수 있습니다.


3. Table 사용

테이블 사용은 매우 간단합니다. 

아래의 세번째 라인의 table 변수에 dynamodb.Table(테이블명)을 입력하면 간단합니다.

import boto3

dynamodb = boto3.resource('dynamodb')

table = dynamodb.Table('users')

단 앞으로 DynamoDB의 Table에서 사용되는 모든 값은 이 table 변수를 통해서 사용하므로, 모든 예제에는 위의 코드가 반드시 들어가야 한다는 점을 참고하시기 바랍니다.


4. Table 삭제

삭제는 위의 table 변수가 지정된 상태에서 delete() 함수를 실행하면 됩니다.

table.delete()


DynamoDB의 Table 생성/사용/삭제 등 관리 방법에 대해서 알아보았습니다.

생각보다는 매우 쉽게 관리가 이루어진다는 것을 알 수 있습니다.

하지만 실제 데이터를 어떻게 관리하는 지도 보아야 되겠죠?


다음 글에서 다루도록 하겠습니다.






WRITTEN BY
鬼風
생각이 깨어있지 않다면 살아갈 이유도 없다

트랙백  0 , 댓글  0개가 달렸습니다.
secret

이번 글에서는 Amazon Web Service(AWS) 에서 DynamoDB를 사용하는 방법을 Python을 이용해서 다루도록 하겠습니다.

처음에 AWS Python 카테고리에서 DynamoDB를 다루고자 했던 것은 아니였지만, 이번 회사에서 기술보고서를 작성하는 과정에 있어서 주제를 DynamoDB를 하다 보니까 블로그에도 같이 다루는 것이 좋을 것 같아서 올려봅니다.


DynamoDB는 Amazon에서 AWS에 최적화된 NoSQL 데이터베이스로, 당연하게도 AWS에 최적화되어 있습니다. 

하지만 DynamoDB에 대한 소개는 AWS 홈페이지나 다른 인터넷 자료에도 나와있지만, 정작 국내에서는 이와 관련된 서적을 찾지 못하였고 해외 원서로만 존재하고 있습니다. 그 이유는 DynamoDB가 별로이기 때문이 아니라, 등장한 지 오래 되지 않은 데이터베이스이기 때문으로 볼 수 있습니다.



그렇지만, AWS에서 제공하는 다른 RDS 서비스와는 다르게 별도의 카테고리를 둬서 관리한다는 것은 그만큼 DynamoDB를 AWS에서 주력으로 밀겠다는 것으로도 볼 수 있습니다.



DynamoDB의 사용은 사실 어렵지 않습니다. AWS의 다른 서비스하고는 다르게 인스턴스를 생성한다거나 복잡한 과정을 거치지 않고, AWS Console에서 Table을 생성하는 것에서부터 시작하기 때문입니다.

그러므로 AWS Console에서 Table을 생성하고 관리하는 것은 매우 간단한 절차이므로, 이 글에서는 별도로 다루지 않겠습니다.



그렇다면 DynamoDB를 실제로 사용하려면 어떻게 해야 할까요.

기존의 RDBMS와는 다른 NoSQL 유형이기 때문에 별도의 SQL Programming을 하지 않는 대신, 일반 프로그래밍 언어 상에서 DB Scheme를 설계하고 데이터를 관리할 수 있어야 합니다.

그래서 AWS에서는 DynamoDB를 사용하기 위한 SDK를 프로그래밍 언어 별로 제공하고 있습니다.


지원 언어는 다음과 같습니다.

l  Java

l  Javascript

l  Node.js

l  .NET

l  PHP

l  Python

l  Ruby


그 중에서도 저는 Python을 사용하여 DynamoDB를 구현하고 나타낼 예정이며, 이는 현재 제 블로그에서 다루고 있는 주제가 AWS Python인 것과도 일맥상통하기 때문이겠지요.

다음 글에서는 Python 언어를 사용하여 AWS DynamoDB를 어떻게 구현하는 지를 다루어 보도록 하겠습니다.


WRITTEN BY
鬼風
생각이 깨어있지 않다면 살아갈 이유도 없다

트랙백  0 , 댓글  0개가 달렸습니다.
secret

이번 글에서 다룰 부분은 AWS(Amazon Web Service)에서의 Python 설치를 다루도록 하겠습니다.

사실 AWS에서 Python을 설치하는 것은 자습서 상에서 매우 잘 나타나 있지만, 여러 페이지를 옮겨다니면서 확인해야 하기 때문에 번거로움이 있었습니다.

이에 따라, 제 블로그에서는 옮겨다니는 번거로움을 줄이는 대신, 연재글의 형태로 순서대로 진행할 수 있도록 할 예정이니 참고하시기 바랍니다.


※ AWS의 VPC 네트워크 구축, IAM 서비스, S3 Storage 서비스 구축 부분은 생략하겠습니다.

※ AWS Console 수행을 위한 계정은 이미 보유하고 있어야 하며, VPC, S3는 이미 구축이 사전에 되어 있어야 하니 참고하시기 바랍니다.

※ PUTTYXMING 미리 설치해주시기 바랍니다. (설치 링크는 왼쪽의 글자를 누르면 됩니다)


이전 글: 

2018/05/12 - [Onik Lab./AWS Python] - AWS EC2 (Ubuntu) 구축 및 접속

2018/05/19 - [Onik Lab./AWS Python] - AWS CLI, AWS EB CLI 설치

2018/05/19 - [Onik Lab./AWS Python] - AWS Python Django Application 환경설정



10. Elastic Beanstalk 배포를 위한 구성

이전 글에서 수행했던 명령에 바로 이어서 한다면 가상환경이 이미 활성화되어 있는 상태일 것입니다.

하지만 가상환경에 들어오지 않았다면 가상환경을 먼저 들어가도록 합니다.

(eb-virt) ~/ebdjango$ source ~/eb-virt/bin/activate


그 다음에는 전에 실행했던 pip freeze를 실행합니다. 하지만 이번에는 실행 결과를 requirements.txt에 저장합니다.

(eb-virt) ~/ebdjango$ pip freeze > requirements.txt

이 부분은 매우 중요합니다. Elastic Beanstalk에서 애플리케이션을 실행할 때 어떤 패키지를 설치할 것인지를 결정하는데, 이 때 requirements.txt 파일을 참조하기 때문입니다. 


다음은 .ebextensions을 새로 생성한 후, django.config 파일을 생성해서 애플리케이션을 시작하는 데 사용되는 WSGI 스크립트 위치를 지정합니다.
(eb-virt) ~/ebdjango$ mkdir .ebextensions
(eb-virt) ~/ebdjango$ vi .ebextensions/django.config
django.config는 없는 파일이므로 새로 생성해야 하며, 다음의 내용을 넣도록 합니다.

option_settings:
  aws:elasticbeanstalk:container:python:
    WSGIPath: ebdjango/wsgi.py


다음은 가상환경을 비활성화 합니다.
(eb-virt) ~/ebdjango$ deactivate

(그러나 제가 테스트한 결과, 가상환경을 비활성화 하지 않고 다음 작업을 진행해도 문제는 없었습니다. 다만, 가상환경 활성화가 애플리케이션에 패키지를 추가하거나 로컬에서 실행할 때 활성화를 한다는 점에 비추어 봤을 때에는 주 용도로 사용될 때에만 가상환경을 활성화하는 것을 권장합니다.)


11. Elastic Beanstalk 배포

개인적으로 이 부분에서 시간을 많이 소모한 것 같습니다.

세팅을 똑같이 했는데도 에러메시지가 매번 다르게 나타났지 싶었습니다.

사실 정확한 원인을 찾아내는 데에는 어려움이 있었지만, 어떤 유형의 오류가 있었는지도 소개하도록 하겠습니다.


참고문서: https://docs.aws.amazon.com/ko_kr/elasticbeanstalk/latest/dg/create-deploy-python-django.html



먼저 Elastic Beanstalk(이하 EB) Repository를 초기화하고, Application을 생성해 줍니다.

~/ebdjango$ eb init -p python-2.7 django-tutorial
Application django-tutorial has been created.

python 2.7을 사용할 것이므로 언어는 다음과 같이 사용하도록 합니다.


※ 제가 이 부분과 관련해서 eb init 만 입력하고 여러 가지 테스트를 많이 해봤습니다만, 위와 같이 사용 언어(python-2.7) 및 애플리케이션 이름(django-tutorial)을 다 입력하는 것이 가장 안정적입니다. 물론 애플리케이션 이름은 어떤 것을 써도 문제는 전혀 없습니다.


참고문서에서는 SSH를 통해 실행할 때 Pair Key를 입력하는 방법도 추가로 나와있지만, 이 게시물에서는 생략합니다.

(실제로 생략해도 문제 없습니다)


이제 실제로 애플리케이션을 생성하도록 합니다.

/ebdjango$ eb create django-env

※ 이 부분 역시 'eb create'만 실행한 후 환경 이름을 직접 입력하는 방법도 해봤지만, 처음부터 환경이름을 명령어 뒤에 붙여주고 실행하는 것이 안정적입니다. 오히려 별도로 여러가지 입력을 하다가 에러가 발생하는 상황이 더욱 많이 발생합니다.


이 부분에서 시간이 거의 5분정도 소요 되니, 그 사이에 다른 준비를 하셔도 무방합니다.


생성이 완료되었으면 실제 가동을 하도록 합니다.

~/ebdjango$ eb open

테스트 결과는 다음과 같습니다.


먼저 django-env2라는 개발 환경에서 실행한 결과입니다.


다음은 django-env3라는 개발 환경에서 실행한 결과입니다.


모두 예상했듯이, django-env3 의 결과처럼 나오는 것이 정상이고, django-env2의 결과처럼 나오는 것이 비정상입니다.

놀랍게도 두 개의 환경은 모두 같은 환경설정에 같은 운영체제, 같은 설정값을 한 웹 애플리케이션입니다.


그런데도 이렇게 정반대의 결과가가 나온 이유는 저도 사실 파악을 하지는 못했습니다만,

한 가지 추정되는 것은 django-env2 가 제대로 나오지 않고, S3 Storage의 미사용 중인 Bucket을 삭제한 이후로 올바르게 나타난 것으로 보아 EB에 배포할 때 사용되던 이름 문제인 것으로 추정됩니다. (다만 정확한 원인은 좀 더 알아보겠습니다)


다음은 ebdjango/ebdjango/setting.py 에서 TIME ZONE을 수정합니다.


위와 같이 'ROK'라고 입력했는데, 이는 Republic of Korea의 줄임말로 군대에서 많이 듣던 용어였을 것입니다.

AWS의 Timezone은 한국을 ROK로 공식 표기하므로 이를 참고하시면 됩니다.


다음은 애플리케이션을 EB 환경에 배포합니다.

~/ebdjango/$ eb deploy


여기까지가 실제 Application을 배포하는 부분입니다.

참고자료에는 관리자 페이지 설정 및 배포 부분도 같이 나와있는데, 해당 부분은 블로그에서 언급하기보다는 직접 자료를 보시면서 실습하는 것이 더욱 유익할 것으로 생각됩니다.


이상 Python Django Application 배포를 마치도록 하며, 추후 실제 실습을 통해서 더욱 좋은 글로 찾아뵙겠습니다.


WRITTEN BY
鬼風
생각이 깨어있지 않다면 살아갈 이유도 없다

트랙백  0 , 댓글  2개가 달렸습니다.
  1. 안녕하세요 여기까지 잘 따라왔습니다.
    ~/ebdjango$ eb init -p python-2.7 django-tutorial

    이 명령어를 실행시키니
    You have not yet set up your credentials or your credentials are incorrect
    You must provide your credentials.
    (aws-access-id) :

    라고 나왔습니다.
    일단 저는 따로 IAM을 만들지 않고 계속해서 root권한을 가진 계정으로 작업을 해왔습니다
    여기서 id는 어떤 id를 입력해야 하는 건가요?
    • 먼저 댓글 감사드립니다!
      AWS계정 아이디는 당연히 아닙니다.
      Management Console에 로그인 하시면 로그인한 사용자 아이콘이 우측상단에 나오고 이걸 클릭하시면 “내 자격증명”인가 하는 메뉴가 나옵니다. 거기로 들어가시면 accessid와 password를 발급받을 수 있습니다. 거기서 발급받은 내용을 입력해주시면 됩니다.
secret