Bash: как отловить ошибку команды AWS Cli?

Я пытаюсь сделать try/except в своем скрипте bash. По сути, я просто хочу получить секрет из SecretsManager и проверить, не вызывает ли команда cli ошибку.

Я пробовал что-то вроде этого, но он выдает ошибку, прежде чем он пройдет через if/else

  command=$(aws secretsmanager get-secret-value --secret-id ${secret_name} --query SecretString --output text | jq . 2>&1)
  if [[ "${command}" =~ "An error occurred (ResourceNotFoundException)" ]]; then
    echo "Configuration does not exist in SecretsManager. Unable to initialize Metaflow settings"
  else
    echo "Configuration exists in SecretsManager. Initializing Metaflow settings"
    echo ${command} > ~/.metaflowconfig/config.json
  fi

Желаемым результатом будет проверка, возвращает ли команда cli ошибку. Если это не так, установите секрет в локальный файл конфигурации. Если это так, напечатайте «Невозможно инициализировать настройки».

глядя на вашу историю, похоже, вы хорошо знакомы с python. Имея около 10 лет опыта работы с aws cli, я настоятельно рекомендую вам использовать для этого boto3 и python. boto3 не имеет никаких странных требований и находится всего в pip от него. Это можно сделать в bash, но это действительно больно по сравнению с python и boto3.

erik258 03.04.2023 19:40
it doesn't seem to work что это значит?
Paolo 03.04.2023 19:46

Это означает, что он выдает ошибку до того, как пройдет через if/else.

Riley Hun 03.04.2023 19:49

По какой-то конкретной причине вы используете command_output в одном месте, а command в другом?

kojiro 03.04.2023 19:53

Ой, хороший улов. Опечатка

Riley Hun 03.04.2023 19:56

Также ваш код запрашивает вывод текста, а затем передает вывод в jq. Несмотря на то, что SecretsManager неуклюж и может на самом деле выводить что-то вроде JSON для --output text, делает ли CLI это, если результатом является ошибка?

kojiro 03.04.2023 20:00

Наконец, документация указывает, что статус выхода должен в целом указывать, является ли результат ошибкой или нет. Есть ли какая-то причина, которая здесь бесполезна?

kojiro 03.04.2023 20:00
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
7
111
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Основная проблема вашего скрипта заключается в том, что вы передаете вывод команды CLI напрямую в jq, что мешает вашей логике работать правильно. Вот как бы я это сделал:

#!/bin/bash
secret_name = "..."
command_output=$(aws secretsmanager get-secret-value --secret-id $secret_name --query SecretString --output text 2>&1)
command_exit_code=$?

if [[ "$command_exit_code" -ne 0 ]]; then
  if [[ "${command_output}" =~ "An error occurred (ResourceNotFoundException)" ]]; then
    echo "Configuration does not exist in SecretsManager. Unable to initialize Metaflow settings"
  fi
  # other error cases you might want to deal with
else
    echo "Configuration exists in SecretsManager. Initializing Metaflow settings"
    echo "${command_output}" | jq '.' > ~/.metaflowconfig/config.json
fi

Другие вопросы по теме