如何将AWS Parameter Store密钥导入EC2上的Docker化Node.js应用
无需修改代码从AWS Parameter Store注入环境变量到Docker化Node.js应用
下面是几种不用修改应用代码的实现方案:
方案1:启动容器前通过AWS CLI拉取参数并注入
这种方式直接在启动容器的脚本里拉取参数,然后通过docker run的-e参数传递环境变量:
前提条件
- 给EC2实例关联的IAM角色添加AmazonSSMReadOnlyAccess权限(或更精细的权限,比如仅允许
ssm:GetParameter操作目标参数) - EC2实例已安装AWS CLI(如果未安装,可通过
sudo yum install aws-cli(Amazon Linux)或sudo apt install awscli(Ubuntu)安装)
实现步骤
编写启动脚本(比如start-app.sh):
#!/bin/bash # 从Parameter Store拉取需要的参数(--with-decryption用于解密SecureString类型的参数) DB_PASSWORD=$(aws ssm get-parameter --name "/myapp/db/password" --with-decryption --query "Parameter.Value" --output text) API_KEY=$(aws ssm get-parameter --name "/myapp/api/key" --with-decryption --query "Parameter.Value" --output text) # 启动Docker容器,将参数作为环境变量传入 docker run -d \ -e DB_PASSWORD="$DB_PASSWORD" \ -e API_KEY="$API_KEY" \ --restart unless-stopped \ --name my-node-app \ my-node-app-image:latest
给脚本添加执行权限:chmod +x start-app.sh,运行脚本即可启动应用。
方案2:生成.env文件后用Docker Compose启动
如果需要管理较多环境变量,可先将参数写入.env文件,再通过Docker Compose加载:
前提条件
同方案1,确保EC2实例有SSM访问权限且安装了AWS CLI和Docker Compose。
实现步骤
- 编写生成.env文件的脚本(比如
generate-env.sh):
#!/bin/bash # 清空旧的.env文件(可选) > .env # 写入参数到.env文件 echo "DB_PASSWORD=$(aws ssm get-parameter --name "/myapp/db/password" --with-decryption --query "Parameter.Value" --output text)" >> .env echo "API_KEY=$(aws ssm get-parameter --name "/myapp/api/key" --with-decryption --query "Parameter.Value" --output text)" >> .env echo "REDIS_URL=$(aws ssm get-parameter --name "/myapp/redis/url" --query "Parameter.Value" --output text)" >> .env
- 创建
docker-compose.yml文件:
version: '3.8' services: node-app: image: my-node-app-image:latest env_file: - .env restart: unless-stopped container_name: my-node-app
- 执行脚本生成.env文件,再启动容器:
chmod +x generate-env.sh ./generate-env.sh docker-compose up -d
方案3:迁移到ECS(可选)
如果后续考虑容器编排,AWS ECS支持在任务定义中直接引用Parameter Store参数作为环境变量,无需任何代码修改:
- 在ECS任务定义的环境变量配置中,选择Value from parameter store,输入参数的ARN或名称
- ECS会自动拉取参数并注入到容器中,前提是ECS任务执行角色有SSM访问权限
内容的提问来源于stack exchange,提问作者Andrii Ch
相关产品推荐
相关产品推荐

