如何在AWS elasticbeanstalk中配置sonarqube 7.1

时间:2018-05-22 14:09:22

标签: sonarqube elastic-beanstalk terraform bitnami sonarqube-ops

我已经尝试了几种方法让我们的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环境将被清除。这一次,凭据,市场功能和一切。

有没有人遇到过这个问题并想出来了?

1 个答案:

答案 0 :(得分:1)

我使用ECS(Fargate)代替了Elastic Beanstalk容器解决了这个问题。

步骤:

  1. 在AWS中为声纳创建RDS mysql实例

  2. 为此实例打开一个mysql shell,并对其进行声纳配置,请参见:Sonar setup with MySql

  3. 使用您关心的插件创建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数据库进行本地测试。

  1. 验证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

  2. 创建一个名为 sonar 的新ECS存储库以存储Docker映像。

    AWS界面实际上告诉您如何发布docker映像,因此这不言而喻。

  3. 标记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

  4. 创建一个新的Fargate集群,称为 sonar

  5. 创建一个新的任务定义。

    对于您的容器,请使用ECS docker映像URI。我给了我6 GB内存和2 cpus,具有1024 cpu单位。在这里,我公开了端口9000和9092。我也在这里在Dockerfile中添加了环境变量。

  6. 创建ECS服务,并包含任务。运行它,验证日志cloudwatch。并点击端口9000上的公共端点,然后完成。

我主要是从此借来的:https://www.infralovers.com/en/articles/2018/05/04/sonarqube-on-aws-fargate/

我希望这对其他人有帮助。