【发布时间】:2018-11-01 08:22:21
【问题描述】:
我尝试了几种方法让 sonarQube 在我们的 AWS 环境中运行,都成功了。但是,SonarQube 不稳定。每当 Elastic beanstalk 回收实例时,我的 SonarQube 环境就会被清除。
这是我尝试过的:
尝试 1: EC2 实例。我使用 bitnami ami imageId 创建 EC2 实例:ami-0f9cf81913a6dce27
这似乎是一个非常简单的过程。但我更喜欢弹性 beanstalk 环境来管理我们的 sonarQube EC2 实例。
尝试 2: 使用单个 docker 实例创建 EB 环境,使用此 dockerfile:
{
"AWSEBDockerrunVersion": "1",
"Image": {
"Name": "sonarqube:7.1"
},
"Ports": [{
"ContainerPort": "9000"
}]
}
这创建了 EB 环境。它创建一个 RDS 实例(使用 mySql 5.x)来存储扫描数据(在一个名为 ebdb 的数据库中)。 sonarQube 服务器在本地托管一个内部 elasticsearch 实例,用于搜索数据。
然后我必须添加一些环境变量来支持 RDS 实例(jdbc 用户名、密码、url 端点等)。
然后我必须配置 sonarQube 安全端。
未安装任何市场功能。所以我添加了 SonarJava、Groovy 和 SonarJS。
我添加了一个用于扫描的登录用户。都很好。
除了,偶尔 Elastic Beanstalk 会出现运行状况问题并删除当前实例,然后重新创建一个新实例。
在这种情况下,一切都完好无损 - 安全性:用户、密码等。除了市场功能消失了。所以代码扫描将失败,直到我手动添加它们。
单实例 docker 容器的架构非常稀疏,我没有看到任何进一步自定义 docker 文件的方法。
尝试 3: 使用多实例 docker 容器。架构更健壮,也许我可以更明确地配置 sonarQube。例如可以传递环境变量、mysql设置等。
我无法让它工作。我确实知道我需要将内存设置为 2 GB 以上,才能启动弹性搜索。但我无法启动 sonarQube 环境。
我以后可能会重温。
尝试 4: 在弹性 beanstalk 中使用 AMI(使用 terraform aws 提供程序)
main.tf
resource "aws_elastic_beanstalk_application" "sonarqube" {
name = "SonarQube"
description = "SonarQube for nano-services"
}
resource "aws_elastic_beanstalk_environment" "nonprod" {
name = "${var.application-name}"
application = "${aws_elastic_beanstalk_application.sonarqube.name}"
solution_stack_name = "64bit Amazon Linux 2018.03 v2.10.0 running Docker 17.12.1-ce"
wait_for_ready_timeout = "30m"
setting {
namespace = "aws:autoscaling:updatepolicy:rollingupdate"
name = "Timeout"
value = "PT1H"
}
setting {
namespace = "aws:elasticbeanstalk:environment"
name = "ServiceRole"
value = "aws-elasticbeanstalk-service-role"
}
setting {
namespace = "aws:elasticbeanstalk:command"
name = "DeploymentPolicy"
value = "Rolling"
}
setting {
namespace = "aws:elasticbeanstalk:command"
name = "BatchSizeType"
value = "Fixed"
}
setting {
namespace = "aws:elasticbeanstalk:command"
name = "BatchSize"
value = "1"
}
setting {
namespace = "aws:elasticbeanstalk:command"
name = "IgnoreHealthCheck"
value = "true"
}
setting {
namespace = "aws:autoscaling:launchconfiguration"
name = "EC2KeyName"
value = "web-aws-key"
}
setting {
namespace = "aws:autoscaling:launchconfiguration"
name = "IamInstanceProfile"
value = "arn:aws:iam::<redacted>:instance-profile/aws-elasticbeanstalk-ec2-role"
}
setting {
namespace = "aws:autoscaling:launchconfiguration"
name = "instanceType"
value = "t2.xlarge"
}
setting {
namespace = "aws:elb:listener:443"
name = "ListenerProtocol"
value = "SSL"
}
setting {
namespace = "aws:elb:listener:443"
name = "InstanceProtocol"
value = "SSL"
}
setting {
namespace = "aws:elb:listener:443"
name = "SSLCertificateId"
value = "arn:aws:acm:<redacted>"
}
setting {
namespace = "aws:elb:listener:443"
name = "ListenerEnabled"
value = "true"
}
}
最初我包括了 sonarQube AMI:
setting {
namespace = "aws:autoscaling:launchconfiguration"
name = "imageId"
value = "ami-0f9cf81913a6dce27"
}
这确实创造了一切。但是,EC2 实例响应太慢,EB 进入灰色状态。即使 SonarQube 启动并运行,EB 也没有意识到这一点。所以我把这个注释掉了,手动修改了图片id作为一次性的。
wait_for_ready_timeout 确实对此有所帮助,因为这只是防止 terraform 超时。例如它在 22.5 分钟内完成,而不是在 20 分钟内硬停。
在这种情况下,它使用本地 mysql 数据库(无 RDS 实例)创建 SonarQube,其中 elasticsearch 也是本地的。
SonarQube 的市场功能也包括在内,但 Groovy 除外。我添加的。
但是,与以前相同的问题。当 EB 删除一个实例并重新创建它时,sonarQube 环境将被清除。这一次,凭证、市场功能和一切。
有没有人遇到过这个问题并解决了?
【问题讨论】:
标签: sonarqube amazon-elastic-beanstalk terraform bitnami sonarqube-ops