0から始めるAWS × Python

知識ゼロから0から始めるAWS × PythonのWebサービス開発に到るまでの内容を書いたブログ

gunicorn入門 gunicornのオプション設定

こんにちは。今回はgunicornの設定で手こずったので、そちらについて書いていこうと思います。なおこの記事は筆者の理解度がかなり低い状態で書かれていますので、みなさんが行き詰まってしまった時に参考になれば程度ですので、解説は詳しい方に任せます。

 

gunicorn×nginxでWebサービスを開発していた時に、gunicornとnginx間の通信がうまくいっていない時がありました。

 

 

その際に色々と調べたところ、gunicornの設定に

gunicorn ~中略~ -k gevent

を設定することで解消することができました。こちらの解消法はStackOverFlowに載っていたものなのですが、投稿者の方もあまり説明がなかったです。そのため、ほぼ理解できていないので、あくまで参考程度にお願いします。

 

 

AWS DynamoDB×Python入門 PynamoDB

こんにちは。今日はAWSのDynamoDBについてまとめていきます。DynamoDBについてわかっていないところや知識があやふやな所もあるのですが、間違っている部分もあると思うので、お手柔らかにお願いします。

 

 

 

DynamoDBについて

(※使い方だけを知りたい方は以下へ。この箇所は誤りを含んでいる場合があります)

DynamoDBはNoSQLという従来のRDBとは異なるDBの形態です。従来のRDBでは行と列にデータが格納されていて、データのソートが非常にやりやすい状態となっていますが、拡張性がNoSQLと比べて低く、データが膨大化していく現代においてNoSQLが注目されるようになってきました。NoSQLではデータのソートはプライマリキーとソートキーという2つのキーを使用し、非常に検索が行いづらいのですが、拡張性が高いという特徴があります。今回はDynamoDBに挑戦してみました。

 

初期設定

テーブルの作成

最初のテーブルの作成はマネジメントコンソールで行うのが簡単です。

マネジメントコンソール→DynamoDBへと移動し、テーブルの作成をクリックします。

プライマリキーを設定します。ここではプライマリキーをEntityIDとして設定します。(名前は自由ですが、エンティティ(対象)のIDという意味でつけています)そしてテーブルの作成をクリックすればテーブルの作成が完了します。

GSIの作成

次にGSI(グローバルセカンダリインデックス)を設定します。これはインデックス(目次)なので検索をするときに使います。基本的にDynamoDBではScanとGetとQueryという検索方法があります。Scanは簡単にいうとデータベース全体をみます。なので検索に長い時間がかかりますし、Dynamoの料金もかさんでくるのであまり使用することはありません。次にGetですが、Getではプライマリキーとソートキーが必要となってきます。単純に1件を取得するときには有効です。最後にQueryですが、これを最も多く使います。Queryではプライマリキーを用いて検索ができます。その際にプライマリキーだけでは条件を絞り込めないので、GSIを用いて複合キーを作成し、絞り込み検索を行うことができます。ScanとGetとQueryという検索方法について、例をあげて説明します。

エンティティID アイテムID 名前 産地 個数
Fruits 001 りんご 長野 100
Fruits 002 りんご 青森 80
Vege 003 玉ねぎ 長野 60

 

というデータがあったとします。この中でプライマリキーをエンティティIDとしました。またソートキーをアイテムIDとします。Getを行う場合は(Fruits,001)と言ったようにプライマリキーとソートキーを指定して1つのアイテムを得ることができます。またQueryであればエンティティIDのみを用いてエンティティIDがFruitsとなるもの(つまり果物)のみを取得することができます。これによってりんごの総数を計算すると言ったことができるようになります。

PynamoDB

PynamoDBはDynamoDBをPythonで使いやすいようにしたモジュールです。https://dev.classmethod.jp/server-side/python/try-pynamodb/

にインストールの方法が載っていますが、

pip install pynamodb

でインストールすることができます。PynamoDBを使えば簡単にDynamoのデータを扱うことができます。

 

AWS CLI

次にpythonAWSを扱うにはaws cliコマンドラインインタフェース)を導入する必要があります。 

 awsCLI(Mac)のインストールについては

https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/install-cliv2-linux-mac.html#cliv2-linux-mac-install

こちらを参照してください。(Pythonのversionに注意)

 

上のチュートリアルを行うと

モデルの作成

次にモデルの作成を行います。マスターとなるモデルのサンプルは以下です。

 

from pynamodb.attributes import UnicodeAttribute, UTCDateTimeAttribute, NumberAttribute
from pynamodb.models import Model

class dynamoItemModel(Model):
    class Meta:
        table_name='hoge-table'
        region='ap-northeast-1'
    EntityID = UnicodeAttribute(hash_key=True, null=False)
    ItemID =  UnicodeAttribute(range_key=True, null=False)
    EntityCode =  UnicodeAttribute(null=False)
    ItemCode =  UnicodeAttribute(null=False)

    Keys = {
        "EntityCode": "",
        "ItemCode": ""
    }

 これを各アイテムを作成するときに継承します。

class ItemModel(dynamoItemModel):
    class Meta:
        table_name='hoge-table'
        region='ap-northeast-1'
    Keys = {
        "EntityCode": "FoodID",
        "ItemCode": "fruitsID"
    }

 

 

Query とGet

Getは以下のコードでGetできます。

 

item = ItemModel.get(EntityID,ItemID)

ここで得られるデータはItemModelのdictのようなものを得ることができます。もしこのItemModelにNameという属性があれば

 

item.Name

 でNameの値を得ることができます。

 

次にQueryについてですが、

 

items = ItemModel.query(EntityID)

  で取得することができます。しかしこの場合はitemsは複数のアイテムを所持しています。先ほどの表で言うのであれば、先ほどの表から果物だけが欲しい場合EntittyIDにFruitsを代入することで

 

items = ItemModel.query("Fruits")

 と言うようにすれば果物のアイテムの集合を得ることができます。一つ一つのアイテムについて処理を行う場合にはfor文を用いることでgetと同じように扱うことができます。

データ更新・登録・削除

データの更新、削除には

item = ItemModel.get(EntityID,ItemID)

 を用いてまずGetする必要があります。そして登録の際には

 

item.Name = "hogehoge"

 と言ったようにitemの値を更新し、

item.save()

 で更新することができます。

 

次に削除については

item.delte()

 を行うことで削除することができます。

 

データの新規登録についてはまず登録するアイテムのモデルを呼び出します。

 

item =ItemModel(
EntityID = "Fruits",
ItemID = "004",
EntityCode = "Fruits",
ItemCode = "004",
Name = "ぶどう"
)
item.save()

 と言ったような形で新規登録を行うことができます。(EntityCode,ItemCodeは検索しやすいように設定した値です)