我已经尝试了一些方法来让Sonarcube在我们的AWS环境中运行,都是成功的。然而,声纳管是不稳定的。每当弹性豆茎回收一个实例时,我的SonarCube环境就会消失。
以下是我的尝试:
尝试1:
EC2实例。我从bitnami-ami-imageid:ami-0f9cf81913a6dce27创建EC2实例
这看起来很简单。但我更喜欢弹性豆茎环境来管理我们的Sonarkube EC2实例。
尝试2:
使用单个Docker实例创建一个带有此DockerFile的电子商务环境:
{
"AWSEBDockerrunVersion": "1",
"Image": {
"Name": "sonarqube:7.1"
},
"Ports": [{
"ContainerPort": "9000"
}]
}
这创造了电子商务环境。它创建一个RDS实例(使用mysql 5.x)来存储扫描数据(在一个名为ebdb的数据库中)。Sonarkube服务器在本地托管一个内部ElasticSearch实例,以获取其搜索数据。
然后,我必须添加一些环境变量来支持RDS实例(JDBC用户名、密码、URL端点等)。
然后我必须配置声纳管安全侧。
未安装市场功能。所以我添加了sonarjava、groovy和sonarjs。
我添加了一个用于扫描的登录用户。一切都好。
但是,有时候弹性beanstalk会出现健康问题,并删除当前实例,然后重新创建一个新实例。
在这种情况下,除了市场功能外,所有东西都是战术安全的:用户、密码等。所以在我手动添加它们之前,代码扫描将失败。
单实例Docker容器的模式非常稀疏,我看不到任何进一步定制Docker文件的方法。
尝试3:
使用多实例Docker容器。这个模式更健壮,也许我可以更明确地配置sonarkube。例如,您可以传递环境变量、MySQL设置等。
我不能让这个工作。我知道我需要把内存设置在2GB以上,以便启动ElasticSearch。但我没能找到声纳管环境。
我以后可能会再看一遍。
尝试4:
在弹性豆茎中使用AMI(与Terraform AWS提供商一起使用)
主.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"
}
}
最初我包括了奏鸣曲AMI:
setting {
namespace = "aws:autoscaling:launchconfiguration"
name = "imageId"
value = "ami-0f9cf81913a6dce27"
}
这确实创造了一切。但是,EC2实例响应太慢,eb进入灰色状态。即使声纳管已经启动并运行,电子束却不知道。所以我把这个注释掉了,手动地一次性修改了图像ID。
wait_for_ready_timeout
确实有助于这一点,因为这只会让地形不至于超时。例如,它在22.5分钟内完成,而不是在20分钟内硬停。
在本例中,它创建了一个本地MySQL数据库(没有RDS实例)的sonarkube,其中还包含本地的ElasticSearch。
Sonarkube的市场定位功能也包括在内,除了groovy。我补充道。
不过,问题和以前一样。当eb丢弃一个实例并重新创建它时,SonarCube环境将被清除。这一次,是凭证、市场功能和一切。
有人遇到这个问题并解决了吗?