# #amazon-web-services #gitlab #continuous-integration #command-line-interface #bucket
#amazon-веб-сервисы #gitlab #непрерывная интеграция #интерфейс командной строки #ведро
Вопрос:
Я получаю имя корзины S3 из переменной среды. Я хотел бы создать ведро, если оно еще не существует. Я написал эту работу:
check_s3_bucket: stage: create environment image: name: banst/awscli entrypoint: [''] script: - |- if aws s3api head-bucket --bucket "$BUCKET_NAME" 2gt;amp;1 | grep -q 'Not Found'; then echo "Creating S3 Bucket: $BUCKET_NAME in Region: $AWS_DEFAULT_REGION"; aws s3api create-bucket --bucket $BUCKET_NAME --region $AWS_DEFAULT_REGION --create-bucket-configuration LocationConstraint=$AWS_DEFAULT_REGION --acl public-read; else echo "Bucket already exists." fi
К сожалению, это всегда наталкивается на утверждение else. Я попытался подключить stderr к stdout, но все равно ничего не вышло.
Комментарии:
1. Сценарий мне кажется хорошим. Возможно, есть проблема с разрешением, и «Запрещено» возвращается?
2. Я заметил, что почти на все ваши вопросы были даны ответы, но ни один ответ не был принят. Принятие полезных ответов-это не только хорошая практика, но и уменьшает количество дубликатов и увеличивает вероятность того, что на ваши вопросы действительно будут даны ответы.
3. Как все прошло? Все еще не работает?
4. К сожалению, это все еще не работает. Я попробовал ваш новый код, но он все равно всегда наталкивается на утверждение «Ведро уже существует».
5. Мой код верен. Может быть, ты как-то это изменил?
Ответ №1:
Это grep
работает правильно, поэтому вы всегда переходите к другому. Было бы лучше сделать это следующим образом:
if grep "Not Found" lt;(aws s3api head-bucket --bucket "$BUCKET_NAME" 2gt;amp;1); then echo "Creating S3 Bucket: $BUCKET_NAME in Region: $AWS_DEFAULT_REGION"; aws s3api create-bucket --bucket $BUCKET_NAME --region $AWS_DEFAULT_REGION --create-bucket-configuration LocationConstraint=$AWS_DEFAULT_REGION --acl public-read; else echo "Bucket already exists." fi
Комментарии:
1. Спасибо за помощь. Да, я пробовал, и это работает, но моя проблема в том, что интерфейс командной строки aws может выдавать различные типы ошибок. Например, если корзина уже существует, но она мне не принадлежит. В этом случае я не хочу создавать корзину, потому что она также потерпит неудачу. Мне нужно отфильтровать вывод stderr и выполнить команду create-bucket только в том случае, если вывод ошибки содержит текст «Не найден».
2. @JociIvanics Никаких проблем. Если это сработает, то мы будем признательны за принятие ответа. Для новых ошибок и проблем было бы лучше задать новый вопрос.
3. конечно, я приму, если на этот вопрос будет дан ответ, но он еще не получил ответа. Я хочу создать ведро только в том случае, если оно еще не существует. Поскольку интерфейс командной строки aws может возвращать несколько кодов ошибок, я должен проверить ответ на ошибку и создать только корзину, если ошибка содержит текст «Не найдено». Вот почему мне нужен grep. Я уже выполнил эту работу без grep, и она работала хорошо, но проблема в том, что существует много различных типов ошибок, которые может возвращать aws cli.