#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']