在EC2安装SonarQube时如何从AWS SecretsManager获取sonar.jdbc.password
在Amazon Linux 2 EC2实例上用AWS Secrets Manager管理SonarQube 10的JDBC凭证
SonarQube支持通过环境变量、Java系统属性等方式覆盖配置文件里的参数,不用明文写密码到sonar.properties里。结合AWS Secrets Manager,有几种实用的实现方式:
方法一:用启动脚本注入环境变量(推荐)
SonarQube允许把配置项转成环境变量来传递——把配置里的.换成_,全大写再加前缀SONAR_,比如sonar.jdbc.username对应SONAR_JDBC_USERNAME,sonar.jdbc.password对应SONAR_JDBC_PASSWORD。
步骤:
- 写一个获取凭证并启动SonarQube的脚本
fetch-sonar-secrets.sh:
#!/bin/bash # 替换成你的Secrets Manager密钥名称或ARN SECRET_NAME="sonarqube-jdbc-credentials" # 拉取密钥并解析出用户名、密码 SECRET_VALUE=$(aws secretsmanager get-secret-value --secret-id $SECRET_NAME --query SecretString --output text) export SONAR_JDBC_USERNAME=$(echo $SECRET_VALUE | jq -r '.username') export SONAR_JDBC_PASSWORD=$(echo $SECRET_VALUE | jq -r '.password') # 启动SonarQube(替换成你的SonarQube安装路径) cd /opt/sonarqube/bin/linux-x86-64 ./sonar.sh start
- 给脚本加执行权限:
chmod +x fetch-sonar-secrets.sh
- 以后直接运行这个脚本启动SonarQube就行。如果要设开机自启,把这个脚本加到systemd服务里即可。
方法二:修改SonarQube启动脚本注入参数
直接修改SonarQube自带的启动脚本,在启动前从Secrets Manager拉取凭证,以Java系统属性的形式传递:
- 打开SonarQube启动脚本,比如
/opt/sonarqube/bin/linux-x86-64/sonar.sh - 在
exec "$JAVA_EXEC"那一行之前,添加以下代码:
# 替换成你的密钥名称 SECRET_NAME="sonarqube-jdbc-credentials" SECRET_VALUE=$(aws secretsmanager get-secret-value --secret-id $SECRET_NAME --query SecretString --output text) JDBC_USER=$(echo $SECRET_VALUE | jq -r '.username') JDBC_PASS=$(echo $SECRET_VALUE | jq -r '.password') # 把凭证加入Java启动参数 JAVA_OPTS="$JAVA_OPTS -Dsonar.jdbc.username=$JDBC_USER -Dsonar.jdbc.password=$JDBC_PASS"
- 保存修改后,直接运行
sonar.sh start就能自动拉取凭证启动。
方法三:集成到systemd服务(生产环境适用)
如果用systemd管理SonarQube服务,可以在service文件里集成密钥拉取逻辑:
- 创建或修改
/etc/systemd/system/sonarqube.service:
[Unit] Description=SonarQube service After=network.target [Service] Type=forking User=sonarqube Group=sonarqube # 启动前拉取密钥并写入临时环境文件 ExecStartPre=/bin/bash -c 'SECRET_VALUE=$(aws secretsmanager get-secret-value --secret-id sonarqube-jdbc-credentials --query SecretString --output text); echo "SONAR_JDBC_USERNAME=$(echo $SECRET_VALUE | jq -r '\''.username'\'')" > /opt/sonarqube/conf/secrets.env; echo "SONAR_JDBC_PASSWORD=$(echo $SECRET_VALUE | jq -r '\''.password'\'')" >> /opt/sonarqube/conf/secrets.env' EnvironmentFile=/opt/sonarqube/conf/secrets.env ExecStart=/opt/sonarqube/bin/linux-x86-64/sonar.sh start ExecStop=/opt/sonarqube/bin/linux-x86-64/sonar.sh stop Restart=always [Install] WantedBy=multi-user.target
- 重新加载systemd并启动服务:
systemctl daemon-reload systemctl start sonarqube
注意:提前用sudo yum install jq -y安装jq工具,确保sonarqube用户有权限执行AWS CLI和读取环境文件。
内容的提问来源于stack exchange,提问作者Rafiq
相关产品推荐
相关产品推荐

