CloudShellでDynamoDB localが使えるようになったので試してみた

# はじめに
5/19(日本では5/20)に「DynamoDB local is now accessible on AWS CloudShell」というタイトルでアップデートがありました。
こちらはタイトルの通りCloudShell上でDynamoDB Localが使えるようになったとのことで、ものは試しで早速触ってみました。

https://aws.amazon.com/jp/about-aws/whats-new/2025/05/dynamo-db-local-accessible-aws-cloudshell/

# DynamoDB localとは
そもそもDynamoDB localってなんやねん、という話から。AWSではNoSQLデータベースサービスであるDynamoDBが利用できますが、そのDynamoDBをローカル環境（個人PC上など）にDynamoDBを模擬したものを構築することができる優れものです。

共用で使ってる開発環境のDynamoDBを触りたくないけど、作っているアプリケーションのテストはしたい...みたいな時にローカルで動作確認できる点が良いですね。ローカルで動くものなので、コストがかからないのもメリットです。

https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/DynamoDBLocal.html

# CloudShellで試す
:::note info
以下、デフォルトVPCのCloudShellで実施しています。
:::

というわけでCloudShellからDynamoDB localを試してみます。
CloudShellを立ち上げたら、アップデートの記事にも記載がある通り、`--endpoint-url`にlocalhost:8000を指定することで接続ができます。

記事によると、
> You can now start DynamoDB local just by using dynamodb-local alias in CloudShell

とあるので、aliasコマンドで確認してみました。

![スクリーンショット 2025-05-20 22.43.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2448259/97021e95-ecb0-4e6c-ab2a-53ca260c57fc.png)

一番上にある通り、dynamodb-localを叩くだけで起動ができそうです。

:::note warn
ちなみに、私のAWSアカウントでは5/20現在で東京リージョンにエイリアスは設定されていませんでした。バージニア北部しか勝たん。

DynamoDB local自体のjarファイルはあるので、起動自体はできそうです。

![スクリーンショット 2025-05-20 22.47.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2448259/c56daa7b-76ab-406e-a973-ccc26a6cc59b.png)
:::

dynamodb-localで起動すると、この状態になりました。

![スクリーンショット 2025-05-20 22.53.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2448259/ebdc0f9a-ca5f-457c-891c-bf70c4803fae.png)

コマンドを受け付ない（フォアグラウンドで立ち上がったままの）ようなので、別タブを立ち上げます。あとはaws cliコマンドを使ってDynamoDB localを操作します。（`--endpoint-url`を忘れずに！）

今はDynamoDBテーブルが存在しないので`list-tables`は空です。
![スクリーンショット 2025-05-20 22.56.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2448259/20962871-4ae3-4828-b274-1366c729dcf5.png)

テーブルを作成してみます。

```shell
~ $ aws dynamodb create-table --table-name Users --attribute-definitions AttributeName=UserId,AttributeType=S --key-schema AttributeName=UserId,KeyType=HASH --billing-mode PAY_PER_REQUEST --endpoint-url http://localhost:8000
{
    "TableDescription": {
        "AttributeDefinitions": [
            {
                "AttributeName": "UserId",
                "AttributeType": "S"
            }
        ],
        "TableName": "Users",
        "KeySchema": [
            {
                "AttributeName": "UserId",
                "KeyType": "HASH"
            }
        ],
        "TableStatus": "ACTIVE",
        "CreationDateTime": "2025-05-20T14:01:09.795000+00:00",
        "ProvisionedThroughput": {
            "LastIncreaseDateTime": "1970-01-01T00:00:00+00:00",
            "LastDecreaseDateTime": "1970-01-01T00:00:00+00:00",
            "NumberOfDecreasesToday": 0,
            "ReadCapacityUnits": 0,
            "WriteCapacityUnits": 0
        },
        "TableSizeBytes": 0,
        "ItemCount": 0,
        "TableArn": "arn:aws:dynamodb:ddblocal:000000000000:table/Users",
        "BillingModeSummary": {
            "BillingMode": "PAY_PER_REQUEST",
            "LastUpdateToPayPerRequestDateTime": "2025-05-20T14:01:09.795000+00:00"
        },
        "DeletionProtectionEnabled": false
    }
}
```

AWS CLIを使うことでテーブルが作成できました！せっかくなので、作ったテーブルに項目を追加するPythonコードを作成してみました。
```main.py
import boto3

dynamodb = boto3.resource('dynamodb', endpoint_url='http://localhost:8000')

table_name = 'Users'
table = dynamodb.Table(table_name)

item = {
    'UserId': '1',
    'Name': 'Ryotaro Harada'
}   

response = table.put_item(Item=item)
```

このコードを実行後、get-itemをしてみました。

```shell
~ $ python3 main.py 
~ $ aws dynamodb get-item --table-name Users --key '{ "UserId": { "S": "1" } }' --endpoint-url http://localhost:8000
{
    "Item": {
        "UserId": {
            "S": "1"
        },
        "Name": {
            "S": "Ryotaro Harada"
        }
    }
}
```

ちゃんと処理されていそうですね！

:::note warn
`--endpoint-url`を指定しないと、AWS上のリソースを操作をしてしまうので、同じテーブル名が存在する場合は注意が必要です。
:::

# まとめ
今回は簡単にDynamoDB localが使えるようになったCloudShellの紹介でした！

# 参考
https://docs.aws.amazon.com/cli/latest/reference/dynamodb/