Я создал этот образ докера, который я буду запускать следующим образом.
docker run -e AWS_ACCESS_KEY_ID=<my-access-key> -e AWS_SECRET_ACCESS_KEY=<my-secret-access-key> -it --rm -p 9000:8080 etl_pipeline:latest
В основном смотрю на -e
параметры. Так что при локальном запуске этого образа все работает нормально. Но я запускаю это с помощью лямбда-функции, которая запускает образ ECR. Но я получаю ошибку запрещенного разрешения при чтении из моего ведра S3. Сначала я подумал, что что-то не так с моими разрешениями на мое ведро, но я изменил разрешения, и все должно быть в порядке. Но потом я забыл, что запускаю этот контейнер с этими параметрами. Итак, как я могу ввести эти параметры в свой образ ECR или мне следует изменить свой Dockerfile, мой Dockerfile теперь выглядит так.
ENV POETRY_VERSION=1.4.0
RUN pip install "poetry==$POETRY_VERSION"
WORKDIR ${LAMBDA_TASK_ROOT}
COPY . ${LAMBDA_TASK_ROOT}/
ENV AWS_ACCESS_KEY_ID=
ENV AWS_SECRET_ACCESS_KEY=
RUN poetry config virtualenvs.create false
RUN poetry install --only main --no-interaction --no-ansi
CMD [ "app.handler" ]
Поэтому я предполагаю, что, поскольку я запускаю его на AWS, есть какой-то способ включить туда мои ключи доступа. Вся помощь очень ценится!
Я запускаю его через лямбда-функцию. Так что я на самом деле не запускаю команду docker run сам, я думаю, у Lambda есть для этого значение по умолчанию? Я действительно новичок в AWS, так что извините, если я действительно не понимаю, что вы имеете в виду?
Тот факт, что вы запускаете его в Lambda, является важной информацией, которую вы полностью упустили из виду. Вы должны назначить роль IAM функции Lambda.
Эй, Марк, я упоминал, что запускал его на лямбда-функции, я только что решил свою проблему с добавлением политики к моей лямбда-функции, чтобы она могла получить доступ к моей корзине S3. Извините, если мой вопрос был не ясен, но спасибо за вашу помощь!
Крайне не рекомендуется использовать ключ доступа IAM и секретный ключ в контейнере IMAGE, что может привести к высокому риску.
Вместо этого вы можете использовать роли IAM с соответствующими политиками (разрешения, равные ключу доступа) во время подготовки контейнера через ECS или EKS.
Как указано в ответе @ctgopinaath, действительно нехорошо использовать ваши ключи доступа AWS в качестве переменных в вашем образе докера. Если вы, например, хотите, чтобы ваша лямбда-функция обращалась к вашей корзине s3, как мне нужно, перейдите в консоль IAM, создайте роль для доступа к вашей корзине s3, это может выглядеть так:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "ListObjectsInBucket",
"Effect": "Allow",
"Action": [
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::YOUR_BUCKET"
]
},
{
"Sid": "AllObjectActions",
"Effect": "Allow",
"Action": "s3:*Object",
"Resource": [
"arn:aws:s3:::YOUR_BUCKET/*"
]
}
]
}
Это гарантирует, что вы можете выполнять все необходимые действия в своей корзине s3 (если вам нужен только доступ для чтения, убедитесь, что вы не даете полных разрешений, как в приведенном выше примере). Затем вы можете просто прикрепить эту политику к роли выполнения вашей лямбда-функции AWS. Вы можете сделать это, сначала проверив, какая роль выполнения находится в вашей функции. Затем перейдите в консоль IAM, щелкните только что созданную политику -> Прикрепить и найдите свою роль исполнения. Теперь все должно работать.
Где вы запускаете команду
docker run
? На экземпляре EC2? Тот факт, что образ докера хранится в репозитории ECR, на самом деле не имеет значения, это все еще просто образ докера. Детали того, где вы запускаете образ (например, на сервере EC2?), более важны.