代码之家  ›  专栏  ›  技术社区  ›  Tim

如何在AWS ElasticBeanstack中配置SonarCube 7.1

  •  0
  • Tim  · 技术社区  · 8 年前

    我已经尝试了一些方法来让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环境将被清除。这一次,是凭证、市场功能和一切。

    有人遇到这个问题并解决了吗?

    1 回复  |  直到 8 年前
        1
  •  1
  •   Tim    7 年前

    我通过使用ecs(fargate)而不是弹性豆茎容器解决了这个问题。

    步骤:

    1. 在aws中为sonar创建一个rds mysql实例

    2. 为此实例打开mysql shell,并将其配置为sonar,请参见: Sonar setup with MySql

    3. 用你关心的插件创建一个dockerfile,例如:

      来自Sonarkube:最新

      env sonarkube_jdbc_username=[您的用户名]。\
      sonarkube_jdbc_password=[您的密码]。\
      sonarkube-jdbc-url=jdbc:mysql://[your-rds-endpoint]:3306/sonar?usessl=false&useunicode=true&characterEncoding=utf8&rewritebatchedStatements=true&useconfigs=maxperformance

      运行wget” https://sonarsource.bintray.com/Distribution/sonar-java-plugin/sonar-java-plugin-5.7.0.15470.jar “\” &工作组“ https://sonarsource.bintray.com/Distribution/sonar-javascript-plugin/sonar-javascript-plugin-4.2.1.6529.jar “\” &工作组“ https://sonarsource.bintray.com/Distribution/sonar-groovy-plugin/sonar-groovy-plugin-1.4.jar “\” &&mv*.jar$sonarkube_Home/扩展/插件\ &&ls-lah$sonarkube_主页/扩展/插件

      暴露9000

      暴露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. 创建一个名为 声纳 存储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集群,名为 声纳

    5. 创建新的任务定义。

      对于容器,使用ecs docker image uri。我给了我6 GB的内存和2个CPU,共有1024个CPU单元。在这里我暴露了端口9000和9092。我在dockerfile中也添加了环境变量。

    6. 创建一个ecs服务,包括任务。运行它,验证logs cloudwatch。然后点击端口9000上的公共端点,就完成了。

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

    我希望这能帮助别人。