Создание корзины S3, если она не существует в Gitlab CI

# #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.