【DevOps构筑篇】在AWS Fargate上创建SonarQube服务
@TOC
推荐超级课程:
SonarQube 是一个开源的代码质量检测工具。通常情况下,我们将其安装在一些中型实例上或在Docker中运行。在这里,我们使用的是无服务器模型,这也是具有成本效益的。我们使用公共Docker Hub镜像来创建这个服务。
先决条件
- AWS访问权限以创建ECS服务
- 用于存储数据的Postgres数据库
步骤1:创建ECR存储库
ECR存储库用于存储SonarQube的Docker镜像。在这里,我们使用了SonarQube lts-community 版本。我们从Docker Hub拉取这个Docker镜像,并将其放入ECR存储库中。我们也可以直接在ECS中使用Docker Hub镜像,但为了避免在Docker镜像更新时出现问题,我们使用了ECR。
我们创建了一个名为sonarqube的私有存储库
一旦我们有了ECR存储库,让我们从Docker Hub 拉取Docker镜像。
docker pull sonarqube:lts-community
拉取Docker镜像后,让我们将其推送到ECR存储库。为此,我们可以从ECR存储库获取推送命令
aws ecr get-login-password --region <region> | docker login --username AWS --password-stdin <account-id>.dkr.ecr.<region>.amazonaws.com
#since we already pulled docker image we can avoid docker build #command instead we proceed to tag image
docker tag sonarqube:lts-community <account-id>.dkr.ecr.<region>.amazonaws.com/sonarqube:latest
docker push <account-id>.dkr.ecr.<region>.amazonaws.com/sonarqube:latest
几分钟后,Docker镜像将出现在ECR存储库中
现在我们在ECR存储库中有了我们的Docker镜像,让我们继续创建任务定义。
步骤2:创建任务定义
在ECS控制台中,转到任务定义部分,可以点击创建开始创建任务定义。我们首先选择启动类型,这里是Fargate
现在,我们可以命名任务定义
接下来,为我们的任务分配vCPU和内存
接下来,我们转到设置容器定义,这里我们指定容器名称和镜像。我们在这里添加了端口9000,这是SonarQube的默认端口
为了消除一些问题,我们在命令部分添加了这个
-Dsonar.search.javaAdditionalOpts=-Dnode.store.allow_mmapfs=false
我们使用PostgreSQL数据库来存储SonarQube的数据。为了保护数据库密码,我们可以选择使用参数存储。如果使用参数存储,请确保您为ecs任务执行角色提供ssm:getParameter访问权限
现在其余部分可以设置为默认值并创建任务定义
步骤3:创建ECS集群
现在让我们创建一个仅网络的ECS集群。
步骤4:创建ECS服务
一旦我们创建了集群,让我们转到该集群中创建一个ECS服务。由于我们创建的是Fargate服务,所以在服务创建时选择启动类型为Fargate。还要选择我们创建的任务定义和集群
在下一部分指定任务数量和健康百分比。我们可以将任务数量设置为一个,并保持其他所有参数为默认值,然后转到下一步
在下一个阶段,设置服务的VPC。这里我们使用私有子网,并不会分配公共IP。请记住允许从ALB安全组到此服务安全组的流量进行健康检查。
下一步是设置负载均衡器。这里我们使用应用负载均衡器。
由于我们已经设置了HTTPS监听,因此我们将其添加到HTTPS监听器。也可以分配HTTP监听器,可以稍后通过负载均衡器进行编辑
其余部分可以保持为默认值,然后继续下一步。下一步将是该服务的自动扩缩。由于这只是一个POC,我们将这部分留空,继续下一步。最后一步是审核这个,并单击创建。
现在在负载均衡器中,我们可以将其路由指向我们的子域名
请确保您在DNS中将此添加为记录
几分钟后,服务将运行起来。
故障排除
- 如果您的服务未处于运行状态,则任务中可能存在一些错误。您可以在已停止的任务中查看这些错误。
- 如果服务在目标组中无法健康运行,请确保允许ALB sg在ECS sg中
- 检查日志以查看连接DB或其他问题的错误
- 由于SonarQube需要一些时间启动,最好允许300秒作为健康检查宽限期,在健康检查前等待300秒。