서버형(EC2)과 서버리스형(S3+APIGateway+Lambda+DynamoDB)으로 전건 검색

안녕하세요 jimbot3입니다.
이번 서버리스를 보다 실감할 수 있도록,
서버형(EC2)과 서버리스형(S3+APIGateway+Lambda+DynamoDB)으로,
각각 전건 검색을 실시하려면 어떠한 작업이 필요한지를 시험해 보았습니다.

만든 것 ① EC2에서의 전건 검색



우선, 서버형으로서 EC2 온리로 전건 검색을 만들었습니다.
이것은 단순히 글로벌 IP를 가진 서버가 EC2라고 쉽게 얻을 수 있다는 이유이며,
EC2는 아니고 "글로벌 IP를 가진 물리 서버"라고 생각해도 같습니다.

1-1 EC2 준비 및 MySQL 설치 및 테이블 생성


$ whoami
ec2-user
$ cat /etc/system-release
Amazon Linux AMI release 2018.03

######MySQLのインストールとテーブルの作成######
$ sudo yum install -y mysql mysql-server
$ sudo chkconfig mysqld on
$ sudo service mysqld start
mysql> create database jimbot3 character set utf8;
mysql> connect jimbot3
mysql> create table jimbot3 (ID varchar(32) UNIQUE, BirthDay date,Name varchar(128));
mysql> insert into jimbot3 (ID, BirthDay, Name) values('001' ,19940525, 'Nanase Nishino');
mysql> insert into jimbot3 (ID, BirthDay, Name) values('002' ,19920122, 'Mai Shinuchi');
mysql> select * from jimbot3;
+------+------------+----------------+
| ID   | BirthDay   | Name           |
+------+------------+----------------+
| 001  | 1994-05-25 | Nanase Nishino |
| 002  | 1992-01-22 | Mai Shinuchi   |
+------+------------+----------------+
2 rows in set (0.00 sec)

1-2 html 파일 만들기



이 HTML은 웹 인터페이스가 됩니다.
$ vi index.html

◆index.html의 내용은 이하가 됩니다
<html lang="ja">
<head>
    <title>GetMember</title>
    <h1>Welcome to Jimbot3</h1><hr>
</head>
<body>
    <form action="/cgi-bin/getall.py" method="get">
        <input type="submit"  value="Select">
    </form>
</body>
</html>

1-3 html에서 호출되는 Python 실행 파일 만들기


$ sudo pip install PyMySQL
$ sudo pip install --upgrade pip
$ mkdir cgi-bin
$ cd cgi-bin/
$ vi getall.py

◆getall.py의 내용은 이하에 기재
#!/usr/bin/env python
# -*- coding:utf-8 -*-
print('Content-type: text/html; charset=UTF-8\r\n')
import pymysql.cursors

connection = pymysql.connect(host='localhost',
      user='root',
      password='',
      db='jimbot3',
      charset='utf8',
      cursorclass=pymysql.cursors.DictCursor)
with connection.cursor() as cursor:
    sql = "SELECT * FROM jimbot3"
    cursor.execute(sql)
    results = cursor.fetchall()
    for r in results:
        print(r)


실행 파일의 권한 변경 및 http 요청을 받을 수 있도록 명령 실행
$ chmod 755 getall.py
$ cd
$ python -m CGIHTTPServer
Serving HTTP on 0.0.0.0 port 8000 ...

1-4 웹 액세스



http://글로벌 IP : 8000으로 액세스하고 선택 버튼을 누르십시오


MySQL에 등록한 모든 건 검색 결과가 표시된다


만든 것② S3+APIGateway+Lambda+DynamoDB에서의 전건 검색



AWS 기사 "서버리스: 서버에 번거로움 없이 애플리케이션 구축, 실행"
에 있는 구성으로 서버리스 환경을 구축. 물론 이 구성이라면 서버 관리가 필요하지 않습니다.

2-1 S3에 다음 HTML 파일 배치



여기에 넣은 HTML이 웹 인터페이스가됩니다.


◆html의 내용은 이하가 됩니다
<html lang="ja">
<head>
    <title>GetMember</title>
    <h1>Welcome to Jimbot3</h1><hr>
</head>
<body>
    <form action="ここにはAPI Gatewayで作られた呼び出し用URLを記載" method="get">
        <input type="submit"  value="Select">
    </form>
</body>
</html>


2-2 DynamoDB에 다음 테이블 등록



DynamoDB에 서버형으로 MySQL내에 만든 테이블과 "거의"같은 테이블을 작성합니다.
이 "거의"라는 것은 Dynamo의 테이블내의 값에는 Date형이 없기 때문에 String형으로 생년월일의 입력을 했기 때문입니다.

테이블 내용



※데이터의 상세입니다만 Date형이 없습니다


2-3 Lambda 만들기



다음 람다를 만듭니다.
이 Lambda는 실행될 때 DynamoDB에서 전체 검색 결과를 반환합니다.



◆Lambda Dynamo_APIGateway의 내용은 다음과 같습니다
import boto3

dynamodb = boto3.resource('dynamodb') #AWSサービスでDynamoを利用します
table    = dynamodb.Table('jimbot3') #Dynamoでjimbot3テーブルを使います

def get_member():
    response = table.scan()
    return response['Items']

def lambda_handler(event, context):
    return get_member()

2-4 API Gateway 설정



API Gateway에서 GET 메소드를 작성하고 ↑로 만든 "Dynamo_APIGateway"의 Lambda 지정


스테이지 = 실행할 환경을 만듭니다.
예를 들어 dev (개발 환경)와 prod (프로덕션 환경)의 두 단계를 준비하고 dev에 최신 버전을 배포합니다.
prod는 dev에서 확인이 완료된 후 배포 할 수 있습니다.


dev의 스테이지용으로 배포된 URL을 S3의 html 파일에 기재


2-5 웹 액세스



S3 html 파일에 액세스하고 선택 버튼을 누르십시오.


전체 검색결과가 표시됨


끝에



서버형(EC2)과 서버리스형(S3+APIGateway+Lambda+DynamoDB)을 비교한 경우,
데이터를 어디에 두지만 다르지만 원시적인 생각은 그다지 변하지 않는다는 인상

예를 들어, S3 내이지만 EC2 내이지만 index.html은 있고,
Lambda이지만 EC2 내에 있지만 실행 프로그램이 있고,
DynamoDB이지만 MySQL이지만 테이블 데이터는 있습니다.

그러나 HTML 파일과 비교할 때 실행 프로그램이 크게 다르기 때문에,
프로그래밍 스킬은 닦지 않으면 안 된다고 느꼈다.

그리고 DynamoDB는 사용하기 쉽다. 단지, 좋든 나쁘든 버튼 포치포치로 테이블을 만들 수 버리기 때문에,
「앞으로는 DynamoDB!」등이라고 말해 DynamoDB로부터 들어가지 않고 RDS에서도 무엇이든 좋지만 제대로 DB의 기초는 붙이는 편이 좋다고 생각한다.

좋은 웹페이지 즐겨찾기