
面白い追加プロジェクトとして、AWSでサーバーレスTodoアプリケーションを構築しています。私は端末で多くのことをしていますが、私の知識は非常に基本的です。
AWS CLI(v2.3.4)を介してDynamoDBテーブルにエントリを追加するコマンドは次のとおりです。
aws dynamodb put-item \
--table-name tasks \
--item \
'{"task_id": {"S": "3495353e-726f-4e0e-b290-8014c03be971"}, "user_id": {"S": "aae30f8e-aabe-4e38-918f-0f5a2223f589"}, "created_at": {"S": "2022-09-09T12:51:05Z"}, "content": {"S": "Clean car"}, "is_done": {"BOOL": false}}' \
--profile personal
created_at
ISO-8601日付を文字列として手動で入力しました。
LinuxでISO-8601形式のUTC日付/時刻を取得するには、次のことを実行する必要があることがわかりました。
date -u +"%Y-%m-%dT%H:%M:%SZ"
私の質問は、Linuxシステムからput-item
自動/動的にインポートするようにDynamoDBコマンドにこれを入力する方法です。created_at
私が試したこと:
date
次の値を使用して、DynamoDBコマンドにコマンドを挿入してみましたcreated_at
。
aws dynamodb put-item \
--table-name tasks \
--item \
'{"task_id": {"S": "3495353e-726f-4e0e-b290-8014c03be971"}, "user_id": {"S": "aae30f8e-aabe-4e38-918f-0f5a2223f589"}, "created_at": {"S": date -u +"%Y-%m-%dT%H:%M:%SZ"}, "content": {"S": "Clean car"}, "is_done": {"BOOL": false}}' \
--profile personal
しかし、これはうまくいきません。コマンドエラーが発生し、以下が返されます。
Error parsing parameter '--item': Invalid JSON: Expecting value: line 1 column 138 (char 137)
JSON received: {"task_id": {"S": "3495353e-726f-4e0e-b290-8014c03be971"}, "user_id": {"S": "aae30f8e-aabe-4e38-918f-0f5a2223f589"}, "created_at": {"S": date -u +"%Y-%m-%dT%H:%M:%SZ"}, "content": {"S": "Clean car"}, "is_done": {"BOOL": false}}
修正する:
私はMarcusが提案した方法を試しましたが、$(command)
まだ間違ったJSONエラーが発生します。
aws dynamodb put-item \
--table-name tasks \
--item \
'{"task_id": {"S": "3495353e-726f-4e0e-b290-8014c03be971"}, "user_id": {"S": "aae30f8e-aabe-4e38-918f-0f5a2223f589"}, "created_at": {"S": "$(date -u +"%Y-%m-%dT%H:%M:%SZ")"}, "content": {"S": "Clean car"}, "is_done": {"BOOL": false}}' \
--profile personal
答え1
jq
以下を使用して、jsonオブジェクトに日付を挿入できます。
aws dynamodb put-item \
--table-name tasks \
--item "$(
jq -c '.created_at.S=(now|todate)' << 'EOF'
{
"task_id": {
"S": "3495353e-726f-4e0e-b290-8014c03be971"
},
"user_id": {
"S": "aae30f8e-aabe-4e38-918f-0f5a2223f589"
},
"created_at": {"S":""},
"content": {
"S": "Clean car"
},
"is_done": {
"BOOL": false
}
}
EOF
)" --profile personal
また、以下を呼び出さずにzshで日付形式を指定することもできますdate
。
${(%):-%D{%FT%TZ}}
この形式の現在時刻に拡張されますが、TZ=UTC0
実際のZulu時間を取得するには設定する必要があります。モジュールstrftime
には組み込み関数もありますzsh/datetime
。
答え2
エラーメッセージが強調表示されている場合、JSONは無効です。
したがって、期待どおりに実行したいコマンドは実行されません。コマンドラインで変更なしで渡す部分と実行したい部分をシェルがどのように知ることができますか?
コマンドの出力を置き換えるには、を使用します$(command)
。たとえば、次のようになります。$(date -u +"%Y-%m-%dT%H:%M:%SZ")