/ #cdk #python 

CDK(Python)でDynamoDBのテーブルを作る

もくじ

CDKを使ってDynamoDBのテーブルをデプロイしてみます。のサンプルコードですね

全体だとこんなイメージ(↓)になると思います

前提

cdkのシリーズの続き。

公式のドキュメントはこのあたり、

https://docs.aws.amazon.com/cdk/api/latest/docs/aws-dynamodb-readme.html

では 作っていきましょう👻

と、Dynamoの実装から細かい設定を省いたら、記事にするのも憚られるくらいのコード量になってしまったという😅

requirements.txt

リソースはDynamoだけなので、必要なモジュールは下記の通りです👍

aws-cdk.core==1.72.0

aws-cdk.aws_dynamodb==1.72.0

スタックファイル

from aws_cdk import core
from aws_cdk.aws_dynamodb import Attribute, AttributeType, Table


class DynamoTableStack(core.Stack):
    def __init__(self, scope: core.Construct, id: str, **kwargs) -> None:
        super().__init__(scope, id, **kwargs)

        # DynamoDB
        table = Table(
            self,
            "DynamoTableTable",
            partition_key=Attribute(name="pk", type=AttributeType.NUMBER),  # パーテーションキー
            sort_key=Attribute(name="sk", type=AttributeType.STRING),  # ソートキー
            removal_policy=core.RemovalPolicy.DESTROY,  # Stackの削除と一緒にテーブルを削除する(オプション)
        )

いや、これでdynamoがデプロイされるなんて、本当にすごいですね😊

removal_policyが最低限の設定に含まれるかは、好みですが、、、

※ S3とかもそうなんですけどね😅

エントリーポイントへ追記

...
from stacks.dynamo_table_stack import DynamoTableStack
...
DynamoTableStack(app, "dynamo-table-stack", env=env)
...

デプロイ🚀

$ cdk deploy dynamo-table-stack

動作確認

CRUD系の処理をさせてみます。(CDKの本題とは結構ずれる感ありますが😅)

定番ですが、まずデプロイしたテーブル名をコンソールなり、下記なりでとってきます。

$ aws dynamodb list-tables | grep dynamo-table-stack

今回はdynamo-table-stack-DynamoTableTable529948A5-14M0X7W8UAS0Bこんな名前でデプロイされました

可読性向上のために、dynamoのテーブル名下記のような変数に入れさせていただきます🙇

$ TABLE_NAME=dynamo-table-stack-DynamoTableTable529948A5-14M0X7W8UAS0B

Createのようなもの(put)

$ aws dynamodb put-item --table-name $TABLE_NAME --item '{"pk":{"N":"1234"},"sk":{"S":"hogehoge"}}'

Readのようなもの(scan)

動作確認のため、全アイテム取得のscanを叩きます。

$ aws dynamodb scan --table-name $TABLE_NAME
{
    "Items": [
        {
            "pk": {
                "N": "1234"
            },
            "sk": {
                "S": "hogehoge"
            }
        }
    ],
    "Count": 1,
    "ScannedCount": 1,
    "ConsumedCapacity": null
}

Update👍

$ aws dynamodb update-item --table-name $TABLE_NAME --key '{"pk":{"N":"1234"},"sk":{"S":"hogehoge"}}' --update-expression 'SET new_key = :hoge' --expression-attribute-values '{":hoge":{"S":"new_hogehoge"}}'

# ちなみに私はcliを改行したものをshellで叩くのが、、じつは好きじゃありません、
# が、流石にこれは可読性が悪いので↑のやつを改行したのを↓に書きます

$ aws dynamodb update-item --table-name $TABLE_NAME \
    --key '{"pk":{"N":"1234"},"sk":{"S":"hogehoge"}}' \
    --update-expression 'SET new_key = :hoge' \
    --expression-attribute-values '{":hoge":{"S":"new_hogehoge"}}'

確認

$ aws dynamodb scan --table-name $TABLE_NAME
{
    "Items": [
        {
            "pk": {
                "N": "1234"
            },
            "sk": {
                "S": "hogehoge"
            },
            "new_key": {
                "S": "new_hogehoge"
            }
        }
    ],
    "Count": 1,
    "ScannedCount": 1,
    "ConsumedCapacity": null
}

Delete💣

デレてアイテム🥰

$ aws dynamodb delete-item --table-name $TABLE_NAME --key '{"pk":{"N":"1234"},"sk":{"S":"hogehoge"}}'

確認

% aws dynamodb scan --table-name $TABLE_NAME
{
    "Items": [],
    "Count": 0,
    "ScannedCount": 0,
    "ConsumedCapacity": null
}

まとめ

CDKでDynamoDBのテーブルを最低限の設定でデプロイしていました。

その後aws-cliでCRUD的な処理をして動作確認をしました。

今回のリポジトリはこちら

https://github.com/sisi100/cdk-my-template/tree/20201112.0

Author

Sisii

インフラが好きなエンジニアぶってるなにか