AWS CLI 명령에 ISO 8601 날짜/시간을 추가합니다.

AWS CLI 명령에 ISO 8601 날짜/시간을 추가합니다.

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

관련 정보