AWS SAMでサーバーレスアプリケーション!その2(DynamoDB)


前回の続き

前回の記事(https://qiita.com/futo_creid/items/82a4c25ccb7a55f6c514)で
SAMを使用して、ローカルで簡単なWEBAPIを作成しました。
ただこれだと、決まった結果しか返すことしかできないので、DBからデータを持ってきたいと思います。
なので今回はDB構築したいと思います。
構築するDBはサーバーレスアプリケーションでよくセットで使われるDynamoDBです。


1:実施環境

・Windows10 Home
・Docker Toolbox OR Docker for Windows
・Python
・AWS SAM CLI


2:構成

DynamoDB local


3:環境準備

1.APIGATEWAY&Lambda

前回の記事(https://qiita.com/futo_creid/items/82a4c25ccb7a55f6c514)
参照です。

以下の作業は

C:\Users\ユーザ名\samtest

フォルダ内で実施します。(ユーザ名はログインユーザ名で)

2.AWS設定

以下を実施し、AWSの初期設定を行います。
ローカルでの実施なので適当な値です。(東京リージョンにはしていますが)

aws configure
AWS Access Key ID [None]: ZipID
AWS Secret Access Key [None]: ZipSecret
Default region name [None]: ap-northeast-1
Default output format [None]: json

4:実装

DynamoDBを構築していきます!

1.コンテナ作成

PowerShellを開きます。
以下を実行して、DynamoDBを落としてきます。

docker pull amazon/dynamodb-local

以下を実行して、ネットワークを作成します。

docker network create api-network

以下を実行して、Dockerのコンテナを作成します。

docker run --network api-network --name dynamodb -p 8000:8000 amazon/dynamodb-local -jar DynamoDBLocal.jar -sharedDb
docker run --network api-network --name dynamodb -d -p 8000:8000 amazon/dynamodb-local -jar DynamoDBLocal.jar -inMemory -sharedDb

実行して以下の表示が出たら作成が終わっているので、ctrl+cで実行から離脱します。

・DynamoDBを起動する

再起動など、一度コンテナを停止した場合は以下でDynamoDBを起動します。

docker start dynamodb

2.テーブル作成

http://192.168.99.100:8000/shell/
にアクセスするとDynamoDBを操作できる画面が表示されます。

そこで1行目から以下を入力します。

var params = {
    TableName: 'ZipData',
    KeySchema: [ // The type of of schema.  Must start with a HASH type, with an optional second RANGE.
        { // Required HASH type attribute
            AttributeName: 'Zip',
            KeyType: 'HASH',
        }
    ],
    AttributeDefinitions: [ // The names and types of all primary and index key attributes only
        {
            AttributeName: 'Zip',
            AttributeType: 'S', // (S | N | B) for string, number, binary
        }
    ],
    ProvisionedThroughput: { // required provisioned throughput for the table
        ReadCapacityUnits: 1, 
        WriteCapacityUnits: 1, 
    },
};
dynamodb.createTable(params, function(err, data) {
    if (err) ppJson(err); // an error occurred
    else ppJson(data); // successful response
});

入力したら画面内の以下の▶のボタンを押下します。

すると画面右側にこんな画面が表示され、テーブルの作成が完了します!

3.データ追加

次は以下のコマンドを入力してデータを作成します。

var params = {
    TableName: 'ZipData',
    Item: {
        Zip: '1000006',
        Data: '東京都千代田区有楽町',
    },
    ReturnValues: 'NONE', // optional (NONE | ALL_OLD)
    ReturnConsumedCapacity: 'NONE', // optional (NONE | TOTAL | INDEXES)
    ReturnItemCollectionMetrics: 'NONE', // optional (NONE | SIZE)
};
docClient.put(params, function(err, data) {
    if (err) ppJson(err); // an error occurred
    else ppJson(data); // successful response
});

4.データ参照

データが追加されているはずなので、以下のコマンドで確認します。

var params = {
    TableName: 'ZipData',
};
docClient.scan(params, function(err, data) {
    if (err) ppJson(err); // an error occurred
    else ppJson(data); // successful response
});

以下のような結果が返ってくるはずです。

また、これだとデータすべてが返ってきてしまうので、
単体を指定する場合は以下を実行します。

var params = {
    TableName: 'ZipData',
    Key:{
         Zip: '1000006'
    }
};
docClient.get(params, function(err, data){
    if(err){
        console.log(err);
    }else{
        console.log(data.Item.Data);
    }
});

以下の結果が返ってきます。

終わりに

今回でDynamoDBがローカルに構築でき、また、データが操作できるようになりました。
次回はAPIからこのデータを操作したいと思います。