Почему я получаю ошибку, что исходный профиль «по умолчанию» должен иметь учетные данные, использующие Boto3 в Docker?

#amazon-web-services #docker #boto3 #aws-cli

Вопрос:

У меня есть dockerfile :

 FROM apache/airflow:2.1.2-python3.8

ENV PYTHONPATH "${PYTHONPATH}:/"

ADD ./aws/credentials /home/airflow/.aws/credentials
ADD ./aws/config /home/airflow/.aws/config

RUN pip install -r requirements.pip
 

И docker-compose.yml :

 version: '3'
services:
  webserver:
    image: airflow2
    command: webserver
    ports:
      - 8080:8080
    healthcheck:
      test: [ "CMD", "curl", "--fail", "http://localhost:8080/health" ]
      interval: 10s
      timeout: 10s
      retries: 5
    restart: always
    build:
      context: .
      dockerfile: Dockerfile
    env_file:
      - ./airflow.env
    container_name: webserver
    volumes:
      - ./database_utils:/database_utils
  scheduler:
    image: sch-airflow2
    command: scheduler
    healthcheck:
      test: [ "CMD-SHELL", 'airflow jobs check --job-type SchedulerJob --hostname "${HOSTNAME}"' ]
      interval: 10s
      timeout: 10s
      retries: 5
    restart: always
    container_name: scheduler
    build:
      context: .
      dockerfile: Dockerfile
    env_file:
      - ./airflow.env
    volumes:
      volumes:
      - ./database_utils:/database_utils
    depends_on:
      - webserver
 

При запуске скрипта, который использует boto3 для подключения к s3, он работает нормально. Проблема здесь в том, что я добавляю учетные данные к изображению, что является плохой практикой. Затем я удаляю эту строку из dockerfile :

 ADD ./aws/credentials /home/airflow/.aws/credentials
 

И я добавляю это в раздел docker-compose тома:

 - ./aws:/home/airflow/.aws
 

Если я запущу сценарий сейчас, он завершится неудачей с:

 botocore.exceptions.InvalidConfigError: The source profile "default" must have credentials.
 

Я понимаю ошибку и проверил, что учетные данные указаны в контейнере docker:

 aws configure list
 

введите описание изображения здесь

Кажется, все в порядке, поэтому я не понимаю, почему он возвращает ошибку.
Я также попытался настроить переменные ENV в ./airflow.env :

 AWS_ACCESS_KEY_ID=XXXXXXXXX
AWS_SECRET_ACCESS_KEY=XXXXXXXXXXXX
 

Единственный способ, которым я добиваюсь его работы ADD , — это использовать файл в dockerfile.

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

1. Что у вас есть в вашем ~/.aws/config досье. Может быть, это ссылается на профиль в вашем файле учетных данных? Удалите файл конфигурации, если можете, и он должен использовать цепочку учетных данных по умолчанию

2. Это звучит так, как будто где-то в конфигурации вы жестко кодируете профиль под именем «по умолчанию». в противном случае переменные env должны работать нормально

3. @jordanm да в файле конфигурации, который у меня есть перед профилями: [по умолчанию] регион = ес-запад-1 вывод = json Цель состоит в том, чтобы установить базовый регион и формат вывода

Ответ №1:

Что-то где-то указывает используемый профиль по умолчанию.

Это может произойти потому, что:

  • Вы указываете --profile default в качестве параметра командной строки
  • У вас есть переменная окружения AWS_PROFILE со значением default
  • Ваш ~/.aws/credentials содержит [default]
  • Ваш ~/.aws/config файл содержит [default]

Вышеизложенное, упорядоченное с точки зрения приоритета, указывает AWS на использование default профиля.

Дважды проверьте, что профиль по умолчанию не упоминается ни в одном из вышеперечисленных (скорее всего, в файле конфигурации или учетных данных).

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

1. вы правы, в файле конфигурации используется значение по умолчанию. Проблема здесь в том, что я должен был указать регион и результат. Я должен использовать вместо этого переменные Env и удалить эти строки из конфигурации? [по умолчанию] регион = ес-запад-1 вывод = json

2. Да, используйте переменные ENV, так как это было бы проще 🙂

3. отлично, постараюсь 🙂 Спасибо!

4. Дайте мне знать, если это сработает 🙂

5. это не работает. Я удаляю его, и он выдает: Partial credentials found in assume-role, missing: source_profile or credential_source Затем я добавил source_profile с тем же именем, пример: [profile name] region=eu-west-1 role_arn=arn source_profile=name Он возвращает: Infinite loop in credential configuration detected. Attempting to load from profile name which has already been visited. Visited profiles: ['name']