我已经尝试了几种方法让我们的AWS环境中的sonarQube成功运行。但是,SonarQube不稳定。每当Elastic beanstalk回收一个实例时,我的SonarQube环境就会消失。
以下是我的尝试:
尝试1: EC2实例。我从bitnami ami imageId创建EC2实例:ami-0f9cf81913a6dce27
这看起来非常简单。但我更喜欢弹性beanstalk环境来管理我们的sonarQube EC2实例。
尝试2:使用此dockerfile使用单个docker实例创建EB环境:
{
"AWSEBDockerrunVersion": "1",
"Image": {
"Name": "sonarqube:7.1"
},
"Ports": [{
"ContainerPort": "9000"
}]
}
这创造了EB环境。它创建一个RDS实例(使用mySql 5.x)来存储扫描数据(在名为ebdb的数据库中)。 sonarQube服务器在本地为其搜索数据托管一个内部弹性搜索实例。
然后我必须添加一些环境变量来支持RDS实例(jdbc用户名,密码,url端点等)。
然后我必须配置sonarQube安全端。
未安装任何市场功能。所以我添加了SonarJava,Groovy和SonarJS。
我为扫描添加了登录用户。一切都好。
除此之外,Elastic Beanstalk偶尔会出现运行状况问题并删除当前实例,并重新创建新实例。
在这种情况下,一切都仍然机智 - 安全:用户,密码等。除了市场功能已经消失。因此,代码扫描将失败,直到我手动添加它们为止。
单实例docker容器的架构非常稀疏,我没有看到任何方法来进一步自定义与docker文件。
尝试3:使用多实例泊坞窗容器。架构更健壮,也许我可以更明确地配置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分钟时停止。
在这种情况下,它创建了SonarQube,其中包含一个本地mysql数据库(没有RDS实例),而elasticsearch也是本地的。
除了Groovy之外,还包括SonarQube的市场功能。我添加了。但是,和以前一样。当EB删除实例并重新创建它时,sonarQube环境将被清除。这一次,凭据,市场功能和一切。
有没有人遇到过这个问题并想出来了?
答案 0 :(得分:1)
我使用ECS(Fargate)代替了Elastic Beanstalk容器解决了这个问题。
步骤:
在AWS中为声纳创建RDS mysql实例
为此实例打开一个mysql shell,并对其进行声纳配置,请参见:Sonar setup with MySql
使用您关心的插件创建dockerfile,例如:
FROM sonarqube:latest
ENV SONARQUBE_JDBC_USERNAME = [您的用户名] \
SONARQUBE_JDBC_PASSWORD = [您的密码] \
SONARQUBE_JDBC_URL = jdbc:mysql:// [您的RDS-ENDPOINT]:3306 / sonar?useSSL = false&useUnicode = true&characterEncoding = utf8&rewriteBatchedStatements = true&useConfigs = maxPerformance
RUN wget“ https://sonarsource.bintray.com/Distribution/sonar-java-plugin/sonar-java-plugin-5.7.0.15470.jar” \ && wget“ https://sonarsource.bintray.com/Distribution/sonar-javascript-plugin/sonar-javascript-plugin-4.2.1.6529.jar” \ && wget“ https://sonarsource.bintray.com/Distribution/sonar-groovy-plugin/sonar-groovy-plugin-1.4.jar” \ && mv * .jar $ SONARQUBE_HOME / extensions / plugins \ && ls -lah $ SONARQUBE_HOME / extensions / plugins
EXPOSE 9000
EXPOSE 9092
我公开了9092,以防我想注释掉mysql连接,并在某个时候使用内部h2数据库进行本地测试。
验证docker映像在本地运行
eval $(docker-machine env)
docker build -t sonar .
docker run -it -d --rm --name sonar -p 9000:9000 -p 9092:9092 sonar:latest
echo $DOCKER_HOST
打开浏览器访问此IP地址,端口9000。 http://192.x.x.x:9000
创建一个名为 sonar 的新ECS存储库以存储Docker映像。
AWS界面实际上告诉您如何发布docker映像,因此这不言而喻。
标记docker文件并将其推送到声纳存储库
$(aws ecr get-login --no-include-email --region [YOUR-AWS-REGION])
docker tag sonar:latest [YOUR-ECS-DOCKER-IMAGE-URI]/sonar:latest
docker push [YOUR-ECS-DOCKER-IMAGE-URI]/sonar:latest
创建一个新的Fargate集群,称为 sonar
创建一个新的任务定义。
对于您的容器,请使用ECS docker映像URI。我给了我6 GB内存和2 cpus,具有1024 cpu单位。在这里,我公开了端口9000和9092。我也在这里在Dockerfile中添加了环境变量。
创建ECS服务,并包含任务。运行它,验证日志cloudwatch。并点击端口9000上的公共端点,然后完成。
我主要是从此借来的:https://www.infralovers.com/en/articles/2018/05/04/sonarqube-on-aws-fargate/
我希望这对其他人有帮助。