본문 바로가기

helpdesk

html cgi를 이용해서 동적 웹페이지 구축기(aws 정보 조회)

며칠간 GUAM에 다녀온 뒤 회사에 와보니 우리 파트장은 약 보름간의 유럽여행을 갔었다.

그리고 내게 내어준 숙제 다음과 같은 web서비스를 만들어 보십시오.

 

AWS를 사용하는 우리는 Auto Scaling Group에 의해 EC2의 정보가 수시로 변하는데 해당 정보를 엑셀로 관리하고 있었기에 정보가 실시간으로 반영되기도 힘들고 관리도 힘든 이슈가 있었다.

다행이도 python 마스터의 길을 걷고 있는 JUNE에게 어느정도의 python 스크립트를 제공받았고, 해당 스크립트를 좀 가공하고 이것을 웹서비스만 되게끔 하면 되는것이였다.

근데..응??응???

생각보다 잘 안되네? 

python 하면 django 인데 django로 해야 하는것인가??아니면 flask??

무작정 django로 웹서비스를 하기위해 스터디해봤으나 여전히 python 스크립트가 동작하지 않았다....
(알고보면 내가 못한거임)

뜻밖에 django로 구축중 java에서 사용하는 MVC, django에서 사용하는 MTV의 차이가 뭔지 알았다는...

MVC 패턴

Model      :  class 우리가 자주사용하는 매개변수들을 (구조체와 비슷) 한데 모아둠.

View        : 웹상에서 보여지는 화면 (ex : jsp)

Controller  :(아래에서 참고) view에 출력하기 위해 사용됨

Controller에서는 view에서 어떤 이벤트를 발생시켰을때 내부적으로 일어나는 법칙?행동? 들을 정의해놓음.
(ex : 웹상에서 버튼을 클릭하였을떄 매개변수에 들어갈 값을 셋팅 한다던지. . .)


MTV 패턴

Model      :  class 우리가 자주사용하는 매개변수들을 (구조체와 비슷) 한데 모아둠.(백엔드, models.py)

Templets  : 웹상에서 보여지는 화면 (프론트엔드, 브라우저 화면, html)

View        : 애플리케이션의 제어흐름 및 처리 로직을 정의(백엔드, views.py)

 

쉽게 말하면 M은 데이터베이스와 같은 스토리지, V나 T는 우리가 보는 화면, C나 V는 백 로직을 말하는 것이였다.

각설하고,,,생각을 잘못했구나 라는 것을 직감한 나는 다시..폭풍검색

HTML CGI라는 키워드를 수집하게 된다. 

CGI는 외부의 응용 프로그램(예를 들면, 검색 엔진이나 데이터베이스 검색 프로그램 등)과 웹서버를 연결시켜주는 "표준"을 의미한다. 독립적으로 실행되는 응용 프로그램에 웹에서 입력받은 자료를 이들 응용 프로그램의 입력으로 전달한다든지, 응용 프로그램에서 실행된 결과를 웹에 전달해야 하는 등의 일을 위해서는 일정한 변수 전달 방법이 필요하다. 이러한 일의 실행을 위해 사용되는 "표준 방법"이 CGI이다. CGI를 이용한 데이터 전송 방법의 일반적인 과정은 다음과 같다.

이거면 가능하다...django, flask 이런것이 문제가 아닌것이다...

 

apache / httpd.conf에 아래와 같이 수정 또는 추가하면, python 스크립트를 호출할 수 있는 환경이 만들어진다.

DocumentRoot "<Source 경로>" 
<Directory "<Source 경로>"> 
<Files "*.py"> 
Options ExecCGI 
AddHandler cgi-script .py 

     #Options Indexes FollowSymLinks 
     Options None 
     AllowOverride None 
     Order allow,deny 
     Allow from all 

주의사항.

apache 버전별 명령어가 상이함 버전에 맞게 사용 할 수 있도록 한다.
<아파치 2.2> Order allow,deny Allow from all - 모든 요청 허가
<아파치 2.4> Require all granted - 모든 요청 허가

 

그리고 html에서 python 스크립트를 불러 올 수 있도록 작성만 하면 된다.

아래와 같이 iframe 태그를 사용하면 호출하려는 스크립트를 같은 page내에서 호출한다. 

<select id="mySelect" name="select" onchange="window.open(value,'test');">
    <option value="" selected disabled>API를 선택해주세요</option>
    <option value="<python스크립트경로>" target="<test>"><스크립트명></option>
</select>

<iframe name="test" src="" style="width:800px; height:800px;border:none"></iframe>

만약 새로운 page에서 호출하도록 하려면 iframe 태그를 삭제하고 아래와 같이 변경하면 새 page에서 호출한다.

<select id="mySelect" name="select" onchange="if(this.value) window.open(this.value);">
    <option value="" selected disabled>API를 선택해주세요</option>
    <option value="<python스크립트경로>" target="<test>"><스크립트명></option>
</select>

만약 설정이 제대로 이뤄지지 않으면, 소스코드가 그대로 출력 되니 주의할 것.

 

미세먼지 팁.

cli 또는 python 스크립트로 aws를 제어/조회 하는경우 pc 또는 서버에 aws에 대한 접근 권한이 있어야 한다.

aws configure를 통해 접근권한이 있는 계정의 accesskey, secret accsskey를 등록하면 되는데

리눅스 서버에서는 계정이 등록되어 있으면 상관없으나, 윈도우에서는 등록된 configure를 못가져오는 문제가 있었다
(이것도 찾아보면 해결방법은 있을듯)

일단 이런문제가 있을경우 소스상에 accesskey를 하드코딩하는 방법이 있다.
(단, 소스유출시 문제가 되므로 테스트시에만 사용하고 관리에 주의!!)

    clientASG = boto3.client('autoscaling',region_name='<region_name_입력>',aws_access_key_id='<access key 입력>',aws_secret_access_key='<secret access key 입력>')
    clientEC2 = boto3.client('ec2',region_name='<region_name_입력>',aws_access_key_id='<access key 입력>',aws_secret_access_key='<secret access key 입력>')