3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

サーバ型(EC2)とサーバレス型(S3+APIGateway+Lambda+DynamoDB)で全件検索

Last updated at Posted at 2019-03-24

こんにちは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 webアクセス

http://グローバルIP:8000でアクセスしSelectボタンを押下
008.PNG

MySQLに登録した全件検索結果が表示される
009.PNG

作ったもの② S3+APIGateway+Lambda+DynamoDBでの全件検索

AWSの記事 "サーバーレス:サーバーに煩わされることなく、アプリケーションを構築、実行"
にある構成でサーバレス環境を構築。もちろんこの構成であればサーバーの管理が不要

2-1 S3に以下のhtmlファイルを配置

ここに配置したhtmlがウェブインターフェイスになります
013.PNG

◆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型で生年月日の入力をしたためです。

テーブルの中身

web_1_Qiita_DynamoDB.PNG

※データの詳細ですがDate型が無いです
010.PNG

2-3 Lambdaの作成

以下のLambdaを作成します。
このLambdaは実行されるとDynamoDBから全件検索結果を返すものです。

web_1_Qiita_Lambda.PNG

◆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を指定
005.PNG

ステージ=実行する環境を作成します。
例えばdev(開発環境) と prod(本番環境) の2つのステージを用意して、dev に最新バージョンのデプロイを行い、
prod はdevでの検証完了後にデプロイを行うことができます、
006.PNG

devのステージ向けにデプロイされたURLをS3のhtmlファイルに記載
007.PNG

2-5 webアクセス

S3のhtmlファイルにアクセスしSelectボタンを押下
011.PNG

全件検索結果が表示される
012.PNG

終わりに

サーバ型(EC2)とサーバレス型(S3+APIGateway+Lambda+DynamoDB)を比較した場合、
データをどこに置くがは違うけど原始的な考えはあまり変わらないといった印象

例えば、S3内だろうがEC2内だろうがindex.htmlはあるし、
LambdaだろうがEC2内だろうが実行プログラムはあるし、
DynamoDBだろうがMySQLだろうがテーブルデータはある。

ただ、htmlファイルと比較した場合に実行プログラムは大きく異なるため、
プログラミングスキルは磨かないといけないと感じた。

あと、DynamoDBは使いやすい。ただ、良くも悪くもボタンポチポチでテーブルが作れてしまうので、
「これからはDynamoDB!」などと言ってDynamoDBから入らずにRDSでも何でも良いけどちゃんとDBの基礎は付けたほうが良いと思う。

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?