재미있는 부가 프로젝트로 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")