Bash с AWS CLI - не удалось найти учетные данные

У меня есть сценарий оболочки, который должен загружать некоторые файлы с S3 и монтировать диск ebs. Тем не менее, я всегда получаю "Невозможно найти учетные данные".

Я указал свои учетные данные командой aws configure а команды работают вне сценария оболочки. Может ли кто-нибудь, пожалуйста, сказать мне (желательно подробно), как заставить его работать?

Это мой сценарий

#!/bin/bash

AWS_CONFIG_FILE="~/.aws/config"

echo $1

sudo mkfs -t ext4 $1
sudo mkdir /s3-backup-test
sudo chmod -R ugo+rw /s3-backup-test
sudo mount $1 /s3-backup-test

sudo aws s3 sync s3://backup-test-s3 /s3-backup/test

du -h /s3-backup-test
ipt (short version):

Спасибо за любую помощь!

Ответы

Ответ 1

sudo изменит каталог $HOME (и, следовательно, ~) на /root и удалит большинство переменных bash, таких как AWS_CONFIG_FILE, из среды. Убедитесь, что вы делаете все с помощью aws как root или как ваш пользователь, не смешивайте.

Убедитесь, что вы сделали sudo aws configure например. И попробовать

sudo bash -c 'AWS_CONFIG_FILE=/root/.aws/config aws s3 sync s3://backup-test-s3 /s3-backup/test'

Возможно, вы захотите удалить все sudo изнутри скрипта и просто sudo сам скрипт.

Ответ 2

Это не обязательно связано с исходным вопросом, но я натолкнулся на это, когда искал соответствующую проблему, поэтому я собираюсь написать ее на случай, если она может помочь кому-то еще. Я настроил aws на конкретного пользователя и протестировал его с помощью sudo -H -u thatuser aws..., но он не работал с awscli 1.2.9, установленным на Ubuntu 14.04:

  % sudo -H -u thatuser aws configure list
        Name                    Value             Type    Location
        ----                    -----             ----    --------
     profile                <not set>             None    None
  access_key                <not set>             None    None
  secret_key                <not set>             None    None
      region                us-east-1      config_file    ~/.aws/config

Мне пришлось обновить его, используя pip install awscli, в котором были pip install awscli новые версии awscli (1.11.93), boto и множество других вещей (awscli docutils botocore rsa s3transfer jmespath python-dateutil pyasn1), но это привело к вещам начиная работать правильно:

  % sudo -H -u thatuser aws configure list
        Name                    Value             Type    Location
        ----                    -----             ----    --------
     profile                <not set>             None    None
  access_key     ****************WXYZ shared-credentials-file
  secret_key     ****************wxyz shared-credentials-file
      region                us-east-1      config-file    ~/.aws/config

Ответ 3

Хотя у вас могут быть ваши учетные данные и файл конфигурации правильно расположенными в ~/.aws, он может не попасть в вашу учетную запись пользователя.

Запустите эту команду, чтобы проверить, установлены ли ваши учетные данные: aws configure list

Чтобы установить учетные данные, запустите эту команду: aws configure и введите учетные данные, указанные в файле ~/.aws/credentials.

Ответ 4

Ответ на случай, если кто-то наткнется на это, основываясь на названии вопроса.

У меня была та же проблема, когда по сообщениям CLI AWS unable to locate credentials.

Я удалил набор учетных credentials [default] из своего файла credentials как не использовал их и не думал, что они необходимы. Кажется, что они есть.

Я тогда преобразовал свой файл следующим образом, и это работало...

[default]
aws_access_key_id=****
aws_secret_access_key=****
region=eu-west-2

[deployment-profile]
aws_access_key_id=****
aws_secret_access_key=****
region=eu-west-2

Ответ 5

Глупый и предостерегающий хвост ржавого стропальщика:

Я определил переменную HOME в своем скрипте как место, где скрипт должен идти для построения платформы.

Эта переменная перезаписала env var, которая определяет пользователей оболочки $HOME. Таким образом, команда AWS не смогла найти ~/.aws/credentials поскольку ~ ссылался не на то место.

Ненавижу это признавать, но надеюсь, что это поможет кому-то сэкономить время.

Ответ 6

Если вы используете файл .aws/config с ролями, убедитесь, что ваш файл конфигурации правильно отформатирован. В моем случае я забыл поставить role_arn = перед arn. Профиль по умолчанию находится в .aws/credentials и содержит идентификатор ключа доступа и секретный ключ доступа идентификатора iam.

Файл конфигурации содержит детали роли:

[profile myrole]
role_arn = arn:aws:iam::123456789012:role/My-Role
source_profile = default
mfa_serial = arn:aws:iam::987654321098:mfa/my-iam-identity
region=ap-southeast-2

Вы можете быстро проверить доступ, позвонив

aws sts get-caller-identity --profile myrole

Если у вас включен MFA, как у меня, вам нужно будет ввести его при появлении запроса.

Enter MFA code for arn:aws:iam::987654321098:mfa/my-iam-identity:
{
    "UserId": "ARABCDEFGHIJKLMNOPQRST:botocore-session-15441234567",
    "Account": "123456789012",
    "Arn": "arn:aws:sts::123456789012:assumed-role/My-Role/botocore-session-15441234567"
}

Ответ 7

Эта ошибка возникала сегодня при запуске aws cli на EC2. В моих ситуациях я мог получить информацию об учетных данных при запуске aws configure list. Однако я работаю в корпоративной среде, которая требует таких вещей, как aws kms decrypt, PROXY. Как только я настрою прокси, информация об учетных данных aws исчезнет.

export HTTP_PROXY=aws-proxy-qa.cloud.myCompany.com:8099
export HTTPS_PROXY=aws-proxy-qa.cloud.myCompany.com:8099

Оказывается, мне также нужно установить NO_PROXY и иметь адрес метаданных ec2 в списке 169.254.169.254. Кроме того, поскольку вы должны проходить через конечную точку s3, у вас также должно быть .amazonaws.com в no_proxy.

export NO_PROXY=169.254.169.254,.amazonaws.com

Ответ 8

Я столкнулся с этим, пытаясь запустить команду aws-cli из root cron.

Поскольку учетные данные хранятся в $ HOME/.aws/credentials, а я инициализировал aws-cli через sudo, $ HOME по-прежнему/home/user/. При запуске из cron $ HOME - это /root/, поэтому cron не может найти файл.

Исправление состояло в том, чтобы изменить $ HOME для конкретной работы cron. Пример:

00 12 * * * HOME=/home/user aws s3 sync s3://...

(в качестве альтернативы можно переместить, скопировать или создать символическую ссылку .aws dir из /home/user/в /root/)