如何在 AWS elasticbeanstalk 中配置 sonarqube 7.1

Posted

技术标签:

【中文标题】如何在 AWS elasticbeanstalk 中配置 sonarqube 7.1【英文标题】:How to configure sonarqube 7.1 in AWS elasticbeanstalk 【发布时间】: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 环境将被清除。这一次,凭证、市场功能和一切。

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

【问题讨论】:

【参考方案1】:

我通过使用 ECS (Fargate) 而不是 Elastic Beanstalk 容器解决了这个问题。

步骤:

    在 AWS 中为声纳创建一个 RDS mysql 实例

    为此实例打开一个 mysql shell,并将其配置为声纳,请参阅:Sonar setup with MySql

    使用您关心的插件创建一个 dockerfile,例如:

    FROM sonarqube:latest
    
    ENV SONARQUBE_JDBC_USERNAME=[YOUR-USERNAME] \   
        SONARQUBE_JDBC_PASSWORD=[YOUR-PASSWORD] \    
        SONARQUBE_JDBC_URL=jdbc:mysql://[YOUR-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

    创建一个名为 sonar

    的新 Fargate 集群

    创建一个新的任务定义。

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

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

我很大程度上是从这里借来的:https://www.infralovers.com/en/articles/2018/05/04/sonarqube-on-aws-fargate/

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

【讨论】:

获取插件的路径不再起作用。有谁知道从哪里获取插件? 另外,你设置了哪些环境变量(除了数据库参数?) 不久前就这样做了,并且该帐户上的 vpc 已被擦除。看起来只有 3 个环境变量设置到 fargate 环境中。但是,我可能会安装一个包含机密文件的卷,因此它们不容易访问。当我这样做时,我还很陌生,但我会尝试预算一些时间来使用 CDK 或 terraform 进行安装,然后将其放入 github,如果还没有其他人这样做的话。

以上是关于如何在 AWS elasticbeanstalk 中配置 sonarqube 7.1的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Elasticbeanstalk 环境中运行的 docker 容器中承担 AWS 角色?

如何在 AWS elasticbeanstalk 中配置 sonarqube 7.1

如何授予 ElasticBeanstalk 对 AWS CodeCommit 的访问权限

如何使用aws elasticbeanstalk中的钩子运行部署后脚本?

如何访问部署在 aws elasticbeanstalk 中的文件

如何将我的 DNS 指向 AWS ElasticBeanstalk 实例?