Help us understand the problem. What is going on with this article?

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で実行から離脱します。
image.png

・DynamoDBを起動する

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

docker start dynamodb

2.テーブル作成

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

そこで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
});

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

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

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
});

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

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

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

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

終わりに

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

denkosha
ITコンサルティングからソフト開発・運用保守まで、 教育・出版・通信事業など様々な大手企業様のシステムに携わっています。 私たち電巧社は、時代に合わせた進化でお客様のニーズにお応えするため挑戦を続けます。
http://www.de-denkosha.co.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした