如何安全地传递我的 API 密钥和我的 python 功能所需的电子邮件凭据?

How can I safely pass my API-key and email credentials needed for my python function?

我创建了一个简单的应用程序,它只向我发送一封关于我选择的位置的天气的电子邮件。它在本地按预期工作,但现在我需要弄清楚如何安全地传递我的 API-Key 和电子邮件登录凭据。目前,我将它们放在一个 .env 文件中,我不希望它在 GitHub 上公开。由于我使用 Azure DevOps 作为我的 CI/CD 管道,我是否将它们传递到那里?我正在让我的管道构建 docker 图像,但不确定如何将变量传递到 docker 文件构建中。这是我的 docker 文件:


# Copy function code
COPY app.py ${LAMBDA_TASK_ROOT}

# Avoid cache purge by adding requirements first
COPY requirements.txt ${LAMBDA_TASK_ROOT}

RUN pip install --no-cache-dir -r requirements.txt

ARG WEATHER_API_KEY
ARG EMAIL_USER
ARG EMAIL_PASSWORD
ARG AWS_ACCESS_KEY_ID
ARG AWS_SECRET_ACCESS_KEY
ARG AWS_DEFAULT_REGION

ENV WEATHER_API_KEY $WEATHER_API_KEY
ENV EMAIL_USER $EMAIL_USER
ENV EMAIL_PASSWORD $EMAIL_PASSWORD
ENV AWS_ACCESS_KEY_ID $AWS_ACCESS_KEY_ID
ENV AWS_SECRET_ACCESS_KEY $AWS_SECRET_ACCESS_KEY
ENV AWS_DEFAULT_REGION $AWS_DEFAULT_REGION

# Set the CMD to your handler (could also be done as a parameter override outside of the Dockerfile)
CMD [ "app.handler" ]

您既不应源代码控制机密,也不应将它们添加到图像中。这两种方式都不安全。

一种常见的做法是在 运行 时读取环境变量。您在 运行安装您的容器时提供这些。

export API_KEY="$(some-cli get-key mykey)"
docker run -e API_KEY myimage

或者直接设置,虽然你在历史中有它。

docker run -e API_KEY="foobar" myimage

那么您的代码需要从 os.environ 而不是 .env 文件中读取变量。

根据您运行您的容器,这可能看起来不同,但总体思路保持不变。