묻지마 https resutful api service
nginx 웹서비스와 python에서 flask 프레임워크로 생각없이 restful api service를 구성 해보자.
ssl 서버 구축
사설 ssl 인증서 생성
cat ~/bin/nginx-ssl.sh
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/nginx/ssl/nginx.key -out /etc/nginx/ssl/nginx.crt \
-subj "/C=KR/ST=Seoul/L=Seoul/O=Open Security/OU=IT Department/CN=api.cloudv.kr"
Nginx ssl 인증서 설정
cat /etc/niginx/site-available/api.conf
server {
listen 80;
listen 443 ssl;
server_name localhost;
ssl_certificate /etc/nginx/ssl/nginx.crt;
ssl_certificate_key /etc/nginx/ssl/nginx.key;
location /api
{
dav_methods PUT DELETE;
dav_access all:r;
proxy_pass http://localhost:5000;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
Rest API 서버
mkdir -p ~/rest-api/app
cat ~/rest-api/run.py
#!~/venv/bin/python
from app import app
app.run(debug=True)
cat ~/rest-api/app/init.py
from flask import Flask
app = Flask(__name__)
from app import api
cat ~/rest-api/app/api.py
from flask import request, jsonify, make_response
from app import app
from pprint import pprint
from datetime import datetime
@app.route('/api/echo', methods=['GET', 'POST', 'PUT', 'DELETE' ])
def echo():
if request.method == 'GET' :
return jsonify( { 'method': 'GET' } )
data = request.get_json(force=True);
return jsonify({ 'method' : request.method , 'data': data } )
@app.route('/api/uptime', methods=['GET', 'POST', 'PUT', 'DELETE'])
def uptime():
with open('/proc/uptime', 'r') as f:
uptime_seconds = float(f.readline().split()[0])
uptime_string = str(timedelta(seconds = uptime_seconds))
data={ 'uptime': uptime_string }
return jsonify(results=data)
실행
$ sudo service nginx restart
$ sudo ~/rest-api/run.py
예제 시험
$ curl --k https://localhost/api/echo
{
"method": "GET"
}
$ cat a.json
{
"fruit": "strawberry"
}
$ sudo curl -k -H "Content-Type: application/json" -d @a.json -X POST https://localhost/api/echo
{
"data": {
"fruit": "strawberry"
},
"method": "POST"
}
curl -k -H "Content-Type: application/json" -d @a.json -X PUT https://localhost/api/echo
{
"data": {
"fruit": "strawberry"
},
"method": "PUT"
}
$ curl -k -H "Content-Type: application/json" -d @a.json -X DELETE https://localhost/api/echo
{
"data": {
"fruit": "strawberry"
},
"method": "DELETE"
}
마치는 말. nginx에 ssl 인증서를 설치하고 flask로 restapi 서버를 설치하고나서 api를 시험해보았다. 코드만 보아도 주석없이도 쉽게 이해가 될 정도의 수준이다. flask와 python 설치를 뱄지만, 그 정도는 인터넷에서 쉽게 찾아서 설치할 수 있을 것이다. 인프라에 코드를 넣기위해 시작하는 사람에게 스낵과 같이 가볍게 보고 지나갈수 있는 예제가 되길 바란다.