Next JS serverless deployment on AWS ECS/Fargate: 环境变量问题

Next JS serverless deployment on AWS ECS/Fargate: environment variable issue

所以我的目标是在 ECS/Fargate 上部署无服务器 Docker 化的 NextJS 应用程序。 因此,当我 docker 使用命令 docker build . -f development.Dockerfile --no-cache -t myapp:latest 构建我的项目时,一切都 运行 成功,除了 Docker 构建不考虑我项目根目录中的 env 文件。构建完成后,我将 Docker 图像推送到 Elastic Container Repository (ECR),我的 Elastic Container Service (ECS) 引用该 ECR。

所以很自然地,我构建的映像没有 ENV 文件(包含 API 密钥和数据库凭据),因此我的应用程序已部署,但所有依赖这些凭据的服务都没有失败,因为我的容器中没有 ENV 文件,所有变量都变为未定义或 null。

为了解决这个问题,我查看了这个 AWS doc 并实施了一个解决方案,将我的 .env 文件存储在 AWS S3 中,并且 S3 ARN 在存储 .env 文件的容器服务中被引用。然而,这并没有奏效,我认为这是因为我设置我的方式 next.config.js 在我的本地代码库中引用我的环境文件。在我的任务定义中配置容器时,我还尝试手动设置我的环境变量(非常不安全,下面的屏幕截图),但这也没有用。

我的next.confg.js

const dotEnvConfig = { path: `../../${process.env.NODE_ENV}.env` };

require("dotenv").config(dotEnvConfig);

module.exports = {
  serverRuntimeConfig: {
    // Will only be available on the server side
    xyzKey: process.env.xyzSecretKey || "",
  },
  publicRuntimeConfig: {
    // Will be available on both server and client
    appUrl: process.env.app_url || "",
  },
};

所以在根目录的本地代码库中,我有两个文件 development.env(本地 api 键)和 production.env(实时 api 键)和我的 next.config.js 位于 /packages/app/next.config.js

您应该在 ECS 任务定义中设置环境变量。为了防止在任务定义中存储敏感值,您应该使用 AWS Parameter Store 或 AWS Secrets Manager,如记录 here.

很明显,这只是 NextJS 处理环境变量的一种普通方式。

next.config.js

module.exports = {
  env: {
    user: process.env.SQL_USER || "",
// add all the env var here
  },

};

并在应用程序中调用环境变量 user 您所要做的就是调用 process.env.user 并且 user 将在我的本地 [=16] 中引用 process.env.SQL_USER =] 文件,它将存储为 SQL_USER="abc_user"