Я пытаюсь сделать 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 ошибку. Если это не так, установите секрет в локальный файл конфигурации. Если это так, напечатайте «Невозможно инициализировать настройки».
it doesn't seem to work
что это значит?
Это означает, что он выдает ошибку до того, как пройдет через if/else.
По какой-то конкретной причине вы используете command_output
в одном месте, а command
в другом?
Ой, хороший улов. Опечатка
Также ваш код запрашивает вывод текста, а затем передает вывод в jq
. Несмотря на то, что SecretsManager неуклюж и может на самом деле выводить что-то вроде JSON для --output text
, делает ли CLI это, если результатом является ошибка?
Наконец, документация указывает, что статус выхода должен в целом указывать, является ли результат ошибкой или нет. Есть ли какая-то причина, которая здесь бесполезна?
Основная проблема вашего скрипта заключается в том, что вы передаете вывод команды 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
глядя на вашу историю, похоже, вы хорошо знакомы с python. Имея около 10 лет опыта работы с aws cli, я настоятельно рекомендую вам использовать для этого
boto3
и python. boto3 не имеет никаких странных требований и находится всего вpip
от него. Это можно сделать вbash
, но это действительно больно по сравнению с python иboto3
.