AWS Cloud9 + Python3 の環境からDynamoDBを利用する

#概要
AWS Cloud9 + Python3 の環境からDynamoDBを利用するサンプルプログラムです。
DynamoDBに保存されているToDoリストをPython3で表示させます。
※本プログラムを実行するにはIAMにてDynamoDBへのアクセス権限が必要になります。

#GitHub
サンプルのプログラムのリポジトリは下記のURLになります。
https://github.com/acecrc/dynamodb_python3_sample


#開発環境
開発環境にはAWS Cloud9を利用しています。
pythonとpipのバージョンは下記の通りです。

```
$ python -V
Python 3.6.5

$ pip -V
pip 18.0 from /home/ec2-user/environment/dynamodb_python3_sample/venv/lib64/python3.6/dist-packages/pip (python 3.6)
```

#IAMの権限確認
AWS Cloud9の開発環境からDynamoDBに接続する場合には、DynamoDBへのアクセス権限が必要になります。AWS Cloud9上で動作するアプリケーションの権限は、ユーザーアカウントの権限に紐付いているので下記の手順で確認を行ってください。

AWSのトップページでIAMで検索を行ってください。

![01_IAMの権限確認.png](https://qiita-image-store.s3.amazonaws.com/0/131520/25ccc251-927c-d3fa-46e3-cdf610243544.png)

画面左からユーザーへのリンクをクリックしてください。

　![02_IAMの権限確認.png](https://qiita-image-store.s3.amazonaws.com/0/131520/2307709d-bced-505c-2a60-5c87f5233ef4.png)

自分のアカウントのユーザー名をクリックしてください。

![03_IAMの権限確認.png](https://qiita-image-store.s3.amazonaws.com/0/131520/49763b2a-2f59-92ad-5010-e8e45eabe58f.png)

アクセス権限に「AWSDynaomDBFullAccess」を追加する必要があります。
「アクセス権限の追加」を選択して、以降の手順で権限を付与してください。

![04_IAMの権限確認.png](https://qiita-image-store.s3.amazonaws.com/0/131520/82d73771-937f-76a8-b24a-b73c33219420.png)


「既存のポリシーを直接アタッチ」を選択し、「AWSDynaomDBFullAccess」を選択してDBへのアクセス権限を付与してください。

![05_IAMの権限確認.png](https://qiita-image-store.s3.amazonaws.com/0/131520/00647e28-ddb1-5c2e-b948-f6424554c653.png)

#仮想環境の構築
下記のコマンドで仮想開発環境を構築してください。

```
$ python -m venv venv
$ source venv/bin/activate
```

#パッケージのインストール
まず「requirements.txt」というファイル名で下記の内容を保存してください。

```:requirements.txt
boto3==1.7.71
botocore==1.10.71
docutils==0.14
jmespath==0.9.3
python-dateutil==2.7.3
s3transfer==0.1.13
six==1.11.0
```

次に下記のコマンドでパッケージをインストールできます。

```
$ pip install -r requirements.txt
$ pip freeze
```

#DynamoDBの作成
下記のコマンドでDynamoDBに「todos」テーブルを作成してください。

```
aws dynamodb create-table \
    --table-name todos \
    --attribute-definitions \
        AttributeName=id,AttributeType=N \
    --key-schema AttributeName=id,KeyType=HASH \
    --provisioned-throughput ReadCapacityUnits=1,WriteCapacityUnits=1
```

#DynamoDBのドキュメント追加
下記のコマンドで「todos」テーブルにドキュメントを追加してください。

```
aws dynamodb put-item \
    --table-name todos  \
    --item \
        '{"id": {"N": "1"}, "done": {"BOOL": false}, "task": {"S": "タスク1"}}'

aws dynamodb put-item \
    --table-name todos  \
    --item \
        '{"id": {"N": "2"}, "done": {"BOOL": false}, "task": {"S": "タスク2"}}'

aws dynamodb put-item \
    --table-name todos  \
    --item \
        '{"id": {"N": "3"}, "done": {"BOOL": false}, "task": {"S": "タスク3"}}'
```
#プログラムの作成
下記のようにプログラムを作成してください。
プログラムの内容はDynamoDBからtodosテーブルを指定して一覧を取得するものになります。

```Python3:dynamodb_python3_sample.py
import boto3
from boto3.session import Session

# DynamoDBを利用するための準備
session = Session()                         #セッションの作成
dynamodb = session.resource('dynamodb')     #リソースにDynamoDBを選択
table = dynamodb.Table('todos')             #テーブルにtodosを指定

# DynamoDBからtodosの一覧を取得
def dynamodb_scan():
    try:
        results = table.scan()  #todosの一覧を取得
    except:
        raise
    return results

# メイン関数
def main():
    results = dynamodb_scan()   #dynamodb_scan()関数を実行
    print(results)              #取得した結果を表示

if __name__ == '__main__':
    main()                      #メイン関数を実行
```

#プログラムの実行
下記のコマンドでプログラムを実行してください。
正常に動作していればtodosテーブルから情報の一覧を取得し表示されます。

```
$ python dynamodb_python3_sample.py
{'Items': [
{'id': Decimal('3'), 'task': 'タスク3', 'done': False}, 
{'id': Decimal('2'), 'task': 'タスク2', 'done': False}, 
{'id': Decimal('1'), 'task': 'タスク1', 'done': False}], 
'Count': 3, 'ScannedCount': 3, 
'ResponseMetadata': {'RequestId': 'UJ75MEPDEA9M4237TSK0VUE4JFVV4KQNSO5AEMVJF66Q9ASUAAJG', 'HTTPStatusCode': 200, 'HTTPHeaders': {'server': 'Server', 'date': 'Mon, 10 Sep 2018 01:56:46 GMT', 'content-type': 'application/x-amz-json-1.0', 'content-length': '233', 'connection': 'keep-alive', 'x-amzn-requestid': 'UJ75MEPDEA9M4237TSK0VUE4JFVV4KQNSO5AEMVJF66Q9ASUAAJG', 'x-amz-crc32': '994443345'}, 'RetryAttempts': 0}}
```

以上です。