LoginSignup
3
1

More than 3 years have passed since last update.

DynamoDB の値を気軽に参照する with Bash

Last updated at Posted at 2019-08-01

株式会社オズビジョンのユッコ (@terra_yucco) です。
8 月になったので、ぼちぼち Qiita を再開しますが、前のように無理に連日更新とかはしない方針で行きます。

DynamoDB の値を気軽に参照する with Bash

とある機能を本番リリースしました。
大半の結果の整合性は SQL で RDS を確認すればいいのですが、一か所だけ DynamoDB へ書き込んでいる場所があり、一括して確認するのには何か処理を作る必要があったので、以下のようなものを作成しました。

Tips:1 複数データを確認したい

以前に自分の別エントリでも書きましたが、最近は簡単なものであれば以下のようにしてリストを取り扱うようにしています。

リストを差し替えて何度も実行したりするような場合には、以下コードの data 変数に全データを持つのではなく、ファイルを指定して読み込ませれば良いかと思います。

#!/bin/bash -u

data=$( cat << EOD
datum1
datum2
 :
datumN
EOD
)

while read datum
do
  # 繰り返したい処理 with ${datum}
done << EOI
${list}
EOI

Tips:2 Hash Key と Range Key を定義しているテーブルを Hash Key だけで参照する

構造

$ aws dynamodb describe-table --table-name user

{
    "Table": {
        "TableArn": "arn:aws:dynamodb:ap-northeast-1:xxxxxxxxxxxx:table/user",
        "AttributeDefinitions": [
            {
                "AttributeName": "uid",
                "AttributeType": "N"
            },
            {
                "AttributeName": "regdate",
                "AttributeType": "S"
            }
        ],
        "ProvisionedThroughput": {
            "NumberOfDecreasesToday": 0,
            "WriteCapacityUnits": 5,
            "LastIncreaseDateTime": 1564653110.831,
            "ReadCapacityUnits": 6,
            "LastDecreaseDateTime": 1564394555.257
        },
        "TableSizeBytes": 15141093,
        "TableName": "user",
        "TableStatus": "ACTIVE",
        "TableId": "3716aad2-26c8-4152-8401-cd4fac53fff4",
        "KeySchema": [
            {
                "KeyType": "HASH",
                "AttributeName": "uid"
            },
            {
                "KeyType": "RANGE",
                "AttributeName": "regdate"
            }
        ],
        "ItemCount": 230666,
        "CreationDateTime": 1334625921.678
    }
}

利用スクリプト

getDataFromDynamo.sh

aws dynamodb query --table-name user \
  --key-condition-expression "uid = :name" \
  --expression-attribute-values  "{\":name\":{\"N\":\"12345678\"}}"

トラブルシュート1: query で KeyCondition を指定しない

aws dynamodb query --table-name user \
  --expression-attribute-values  "{\"uid\":{\"N\":\"12345678\"}}"

以下のようなエラーになります。

An error occurred (ValidationException) when calling the Query operation: ExpressionAttributeValues can only be specified when using expressions: FilterExpression and KeyConditionExpression are null

Query 呼び出しの場合には ExpressionAttributeValues には特定の表現しか使えない、要するに FilterExpressionKeyConditionExpression を付ける必要があるようです。

トラブルシュート2: Hash Key のみの指定で get-item を使う

aws dynamodb get-item --table-name user --key "{\"uid\":{\"N\":\"12345678\"}}"

以下のようなエラーになります。

An error occurred (ValidationException) when calling the GetItem operation: The provided key element does not match the schema

以下のようにして Range Key も指定すると、データが取れるようになります。

aws dynamodb get-item --table-name user --key "{\"uid\":{\"N\":\"12345678\"}, \"regdate\":{\"S\":\"1408612723\"}}" 

作成スクリプト

getDataFromDynamo.sh
#!/bin/bash -u

data=$( cat << EOS
12345678
12345679
12345680
22345678
22345679
22345680
EOS
)

date

while read uid
do
  echo -n "${uid} : "
  aws dynamodb query --table-name user \
    --key-condition-expression "uid = :name" \
    --expression-attribute-values  "{\":name\":{\"N\":\"${uid}\"}}" | jq .Items[].status[]
done << EOI
${list}
EOI

date

無事に状況の確認ができました。

Conclusion

DynamoDB は SDK 経由で PHP などから取り扱うのが便利ではありますが、aws cli を利用すればコマンドラインから簡易に参照するのもそこまで大変ではありません。
ぜひ、気軽に使いこなしていただければと思います。

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1