You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在EC2部署的MERN应用中使用AWS Parameter Store?是否需用Lambda?

如何在EC2部署的MERN应用中使用AWS Parameter Store的环境变量

不需要学习Lambda,直接用以下两种方法就能解决问题:


方法一:启动应用前拉取参数到EC2环境变量(推荐,无需修改原有代码)

这种方式和你开发时用.env的逻辑一致,只是把参数从Parameter Store提前拉到EC2的系统环境变量里,代码里依然用process.env.xxx调用,完全不用改业务代码。

  1. 给EC2实例配置IAM权限
    创建一个IAM策略,赋予EC2实例读取Parameter Store参数的权限,示例策略如下:

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": [
            "ssm:GetParameter",
            "ssm:GetParameters"
          ],
          "Resource": [
            "arn:aws:ssm:你的区域:你的账号ID:parameter/prod/*" // 限制到你的参数路径,遵循最小权限原则
          ]
        }
      ]
    }
    

    把这个策略附加到EC2实例的IAM角色上(如果没有实例角色,先创建一个再关联到EC2)。

  2. 编写启动脚本拉取参数
    在EC2上创建一个启动脚本(比如start-app.sh),用AWS CLI拉取参数并设置为环境变量,再启动Node应用:

    #!/bin/bash
    # 拉取单个参数,--with-decryption用于加密过的参数
    export DB_URI=$(aws ssm get-parameter --name "/prod/db/uri" --with-decryption --query "Parameter.Value" --output text)
    export JWT_SECRET=$(aws ssm get-parameter --name "/prod/jwt/secret" --with-decryption --query "Parameter.Value" --output text)
    
    # 启动你的Node应用,比如用npm start或者node server.js
    npm start
    

    给脚本加执行权限:chmod +x start-app.sh,之后用这个脚本启动应用即可。


方法二:在Node.js代码中直接调用AWS SDK获取参数

如果需要动态刷新参数(比如参数更新后不用重启应用),可以用这种方式,直接在代码里从Parameter Store拉取。

  1. 配置IAM权限
    和方法一的步骤1一致,确保EC2实例有读取参数的权限。

  2. 安装AWS SSM客户端
    在你的Node.js项目中安装AWS SDK v3的SSM包:

    npm install @aws-sdk/client-ssm
    
  3. 编写工具函数获取参数
    创建一个工具文件(比如aws-params.js),封装获取参数的逻辑:

    const { SSMClient, GetParameterCommand } = require("@aws-sdk/client-ssm");
    
    // 初始化SSM客户端,指定你的AWS区域
    const ssmClient = new SSMClient({ region: "cn-north-1" });
    
    /**
     * 获取Parameter Store中的参数
     * @param {string} paramName - 参数名称
     * @returns {Promise<string>} 参数值
     */
    async function getSSMParameter(paramName) {
      try {
        const command = new GetParameterCommand({
          Name: paramName,
          WithDecryption: true // 如果参数是加密的,必须开启这个
        });
        const response = await ssmClient.send(command);
        return response.Parameter.Value;
      } catch (err) {
        console.error(`获取参数${paramName}失败:`, err);
        throw err;
      }
    }
    
    module.exports = { getSSMParameter };
    
  4. 在应用启动时加载参数
    修改你的入口文件(比如server.js),在启动Express前先获取参数:

    const { getSSMParameter } = require("./aws-params");
    const express = require("express");
    
    async function startServer() {
      // 获取参数并挂载到process.env,保持原有代码调用方式不变
      process.env.DB_URI = await getSSMParameter("/prod/db/uri");
      process.env.JWT_SECRET = await getSSMParameter("/prod/jwt/secret");
    
      // 初始化Express应用
      const app = express();
      // ... 你的路由和中间件配置
    
      app.listen(3000, () => {
        console.log("服务器启动在3000端口");
      });
    }
    
    startServer();
    

关于Lambda的疑问

完全不需要学习Lambda,Parameter Store是独立的AWS服务,不仅支持Lambda,也支持EC2、ECS等多种资源。你的场景是EC2部署,和Lambda没有任何依赖关系,不用为了这个去学习Lambda。

内容的提问来源于stack exchange,提问作者user21115020

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 11:05:25