Настройка переменных среды в скрипте Bash для использования с AWS CLI

#bash #environment-variables #aws-cli

#bash #переменные среды #aws-cli

Вопрос:

Я пытаюсь установить переменные среды, необходимые для отправки запросов в AWS через AWS CLI в терминале Ubuntu 18.04, запустив скрипт bash, вместо того, чтобы вручную устанавливать переменные среды с помощью экспорта в оболочке.

Я подтвердил, что учетные данные AWS, которые я использую, все еще активны, поскольку они работают, когда я устанавливаю переменные среды из командной строки, а также работают через файл учетных данных AWS. Итак, я полагаю, что, должно быть, что-то не так с тем, как я передаю значение переменной среды.

Я пробовал заключать в кавычки, но, поскольку я новичок в этом, я не знаю, куда идти дальше.

 #!/bin/bash
unset AWS_ACCESS_KEY_ID
unset AWS_SECRET_ACCESS_KEY
file="/path/to/accessKeys.csv"
cnt=0
 export AWS_DEFAULT_REGION=us-east-1
 export AWS_DEFAULT_OUTPUT=text
while IFS=, read var1 var2  
do 

      if [ $cnt = 1 ]
      then 
        echo $cnt
        export AWS_ACCESS_KEY_ID=$var1
        export AWS_SECRET_ACCESS_KEY=$var2
      fi

      cnt=$(($cnt   1))

done < $file
  

когда я запускаю AWS configure list, я получаю следующий вывод

 :~$ aws configure list
      Name                    Value             Type    Location
      ----                    -----             ----    --------
   profile                <not set>             None    None
access_key     ****************C4JA              env    
              env    **********6YS
    region                us-east-1              env    AWS_DEFAULT_REGION
  

Когда я запускаю env для просмотра переменных среды, AWS_SECRET_ACCESS_KEY кажется правильным, хотя вывод, который я ожидаю от AWS configure list (вывод, который я получаю, когда я вручную устанавливаю переменную с помощью экспорта в оболочке)

 ~$ aws configure list
      Name                    Value             Type    Location
      ----                    -----             ----    --------
   profile                <not set>             None    None
access_key     ****************C4JA              env    
secret_key     ****************j6YS              env    
    region                us-east-1              env    AWS_DEFAULT_REGION
  

Вывод из AWS configure list | tr -d 'r'

 :~$ aws configure list | tr -d 'r'
      Name                    Value             Type    Location
      ----                    -----             ----    --------
   profile                <not set>             None    None
access_key     ****************C4JA              env    
secret_key     ****************6YS              env    
    region                us-east-1              env    AWS_DEFAULT_REGION
  

но это приводит к ошибке SignatureDoesNotMatch.

Любая помощь или указания по этому вопросу были бы весьма признательны.

Комментарии:

1. Помогает ли это при запуске aws configure list | tr -d 'r' ?

2. Как вы запускаете скрипт? Вам понадобится source скрипт, чтобы иметь возможность устанавливать переменные среды в текущем сеансе командной строки.

3. Да, я выбираю скрипт для запуска в текущей оболочке, и переменные среды отображаются после того, как я запустил скрипт.

4. С поиском все в порядке, но вы можете помочь будущим пользователям, добавив эту строку: (return 0 2>/dev/null) || { printf "%sn" "Start in current shell with" " source $0" ; exit 1 ; }

5. при использовании aws configure list | tr -d 'r' результат выглядит почти корректно. (отредактирую вопрос, чтобы показать выходные данные) но я все еще получаю ошибку signature does not match при попытке запустить команды AWS CLI.

Ответ №1:

Ваш file="/path/to/accessKeys.csv" файл находится в формате Windows (с r ).
Для секретного ключа было установлено значение *****j6YSr .

Вы можете заменить последнюю строку done < $file на

 done < <(tr -d 'r' < "${file}" )
  

или получить только вторую строку с

 done < <(sed -n '2s/r*//p' "${file}" )
  

Вам не нужен цикл

 IFS=, read -d'' -r AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY < <(sed -n '2s/r*//p' "${file}" )
  

Комментарии:

1. Большое спасибо за это, работает отлично. Не хочу вас слишком беспокоить, но есть ли у вас какие-либо указания на то, где я мог бы прочитать, почему file находится в формате Windows, или как я могу это узнать? Еще раз спасибо за помощь.

2. Большинство файлов, создаваемых / редактируемых в Windows, имеют r, если вы не изменили настройки своего редактора. Вы можете использовать dos2unix или tr -d 'r' < infputfile для удаления символов или проверить с помощью grep -c "^M" file (вставьте ^M как один символ с помощью CTRL-V CTRL-M). Когда это сработает, вы можете принять ответ.