[AWS WORKSHOP] CodeCommit - CodeDeploy 환경에서 Sonarqube 적용하기

J.LEE·2024년 1월 14일
0
  • 본 실습은 https://catalog.workshops.aws/clean-code/en-US 핸즈온의 진행 과정을 한국어로 실습 부분만 간단히 정리한 문서입니다.
    핸즈온에 대한 자세한 실습은 원문을 반드시 참조해주시기 바랍니다.

  • 핸즈온 문서에는 EKS 구축 부분이 생략되어있으므로 해당 내용에 익숙하지 않은 경우 EKS 구축 부분은 본 포스팅을 참고하여 주시기 바랍니다.

  • 실습 전에 아래와 같이 리전을 아일랜드 [EU-WEST-1] 으로 설정하여 주시기 바랍니다.
    워크샵이 해당 리전을 기준으로 생성되었기 때문에 원활한 진행을 위해 해당 리전으로 설정이 필요합니다.


STEP 1. CLOUD9 생성

CLOUD9 환경을 생성합니다.
환경 이름은 무관하고, 사양은 무관하나 본 실습에서는 t3.small로 합니다.


STEP 2. IAM ROLE 생성

실습을 위해 IAM ROLE을 생성합니다.
실 운영에서는 권한을 세부적으로 설정하여야 하나, 본 실습에서는 원활한 실습을 위해 Administrator 권한의 Policy를 연결한 임의의 Role을 생성합니다.


STEP 3. CLOUD 9에 IAM ROLE 연결

STEP 2에서 생성한 권한을 CLOUD9이 구동되고 있는 EC2에 연결해줍니다.


STEP 4. CLOUD 9에서 임시 자격증명 해제

CLOUD 9에서는 임시 자격증명 사용이 기본적으로 설정되어있는데, 해당 실습에서는 해제해주어야 합니다.


STEP 5. KUBECTL 설치

https://docs.aws.amazon.com/eks/latest/userguide/install-kubectl.html을 참고하여 아래 순서대로 설치합니다.

KUBECTL은 설치하는 클러스터의 버전에 맞게 설치해주면 되고, 본 실습에서는 쿠버네티스 1.28을 기준으로 합니다.

설치 후 아래 명령으로 버전이 정상적으로 출력되는지 확인합니다.

  • kubectl version --client

STEP 6. EKSCTL 설치

https://catalog.us-east-1.prod.workshops.aws/workshops/9c0aa9ab-90a9-44a6-abe1-8dff360ae428/ko-KR/30-setting/500-eksctl을 참고하여 아래 순서대로 설치합니다.

설치 후 아래 명령으로 버전이 정상적으로 출력되는지 확인합니다.

  • eksctl version

STEP 7. EKS 클러스터 생성

클러스터 생성을 위해 아래 내용을 실행하여 구성 YAML을 생성합니다.

cat << EOF > eks-sonar-cluster.yaml
---
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig

metadata:
  name: sonar-cluster # 생성할 EKS 클러스터명
  region: eu-west-1 # 클러스터를 생성할 리전
  version: "1.28"

vpc:
  cidr: "10.0.0.0/16" # 클러스터에서 사용할 VPC의 CIDR
  nat:
    gateway: HighlyAvailable

managedNodeGroups:
  - name: node-group # 클러스터의 노드 그룹명
    instanceType: m5.large # 클러스터 워커 노드의 인스턴스 타입
    desiredCapacity: 3 # 클러스터 워커 노드의 갯수
    volumeSize: 20  # 클러스터 워커 노드의 EBS 용량 (단위: GiB)
    privateNetworking: true
    iam:
      withAddonPolicies:
        imageBuilder: true # Amazon ECR에 대한 권한 추가
        albIngress: true  # albIngress에 대한 권한 추가
        cloudWatch: true # cloudWatch에 대한 권한 추가
        autoScaler: true # auto scaling에 대한 권한 추가
        ebs: true # EBS CSI Driver에 대한 권한 추가

cloudWatch:
  clusterLogging:
    enableTypes: ["*"]

iam:
  withOIDC: true
EOF

생성된 파일을 아래 명령으로 실행하여 클러스터를 구성합니다.
클러스터의 생성은 15분 내외가 소요됩니다.

  • eksctl create cluster -f eks-sonar-cluster.yaml

STEP 8. EKS 콘솔에서 애드온 설치

콘솔의 EKS 메뉴에서 추가 기능 가져오기를 통해 EBS-CSI 애드온을 설치해줍니다.


STEP 9. 기본 리전 설정 및 Kubeconfig 설정

아래 명령을 통해 이후 실습에서 참조할 기본 리전을 설정해주고, kubeconfig의 기본 클러스터 설정을 해줍니다.

  • export AWS_DEFAULT_REGION="eu-west-1"
  • aws eks update-kubeconfig --name sonar-cluster --region eu-west-1

STEP 10. Sonar Helm values 다운로드

실습에 사용되는 helm values 파일을 다운로드 합니다.

실습에 사용되는 네임 스페이스를 설정합니다.

  • kubectl create ns sonarqube-namespace로 네임스페이스를 생성합니다.

아래 명령을 통해 기본 네임스페이스를 변경해주면 이후 과정에서 네임 스페이스를 지정하지 않아도 됩니다. (이후 실습 내용은 본 설정과 무관하게 네임 스페이스 옵션을 명시하나, 본 설정 이후에는 해당 옵션은 생략 가능합니다.)

  • kubectl config set-context --current --namespace=sonarqube-namespace

STEP 10. HELM 설치 및 Sonarqube 설치

아래 과정을 통해 HELM을 설치합니다.

설치 이후 아래 명령을 통해 Sonarqube 접속 경로를 확인합니다.
로드밸런서가 배포되기 때문에 시간이 5분 내외로 소요될 수 있으며, 로드밸런서 구성 현황은 콘솔의 EC2 메뉴 중 로드밸런서 항목에서 확인할 수 있습니다.

  • kubectl get svc sonarqube-release-sonarqube -n sonarqube-namespace

STEP 11. sonarqube 테스트 프로젝트 생성

위에서 확인한 http://ALB주소:9000 의 경로로 접근하여 admin / admin으로 로그인 합니다. 패스워드 변경은 임의로 하면 됩니다.

아래 화면과 같이
Project display name: Web Services
Project Key: java-spring-example
Main branch name: main
으로 설정합니다.
이어지는 화면에서 Use the global setting 에 체크합니다.


STEP 12. sonarqube API KEY 생성

좌측 상단 A 클릭 후 Security 탭에서 토큰을 생성합니다.
토큰 명은 globalanalysis / 타입은 Global Type 으로 합니다.
이 토큰은 이후 연동 과정에서 사용되므로 별도로 메모해두어야 합니다.


STEP 13. GUIDE

이후 단계로 가기 전에 잠깐 아래 이미지를 통해 이후 구성되는 파이프라인에 대해 살펴봅니다.


STEP 14. CodeCommit 계정 생성

이후 사용되는 CodeCommit에서 사용하기 위한 인증키를 생성합니다.
IAM 콘솔의 본인 계정을 클릭하면 나오는 아래 화면에서 AWS CodeCommit에 대한 HTTPS Git 자격 증명 메뉴에서 계정과 패스워드를 생성 후 메모해둡니다.


STEP 15. Secret Manager 생성

Secret Manager 콘솔에서 아래와 같이,

  • 다른 유형의 보안 암호를 선택 후,
  • SONAR_HOST_URL
  • SONAR_TOKEN
    의 두가지 값을 설정해주고 이름은 prod/sonar 로 합니다.
    대소문자가 구분되며, 틀릴 경우 이후 실습에서 오류가 발생합니다.
    전자는 http://sonar 의 로드밸런서 주소:9000의 형태가 될 것이고,
    후자는 이전 과정의 sonarqube 콘솔에서 생성한 API 키를 입력해주시면 됩니다.



STEP 16. CodeCommit 구성

아래와 같이 sonar-sample-app 이름으로 CodeCommit을 구성하고 HTTPS URL을 복제해둡니다. 바로 다음 단계의 git remote add origin 으로 사용됩니다.


STEP 17. 테스트용 프로젝트 소스 다운

테스트 프로젝트가 구성될 레포지터리를 아래와 같이 생성합니다.

  • aws ecr create-repository --repository-name app-container-repo 

  • 아래 명령으로 테스트 프로젝트를 다운로드 합니다.

  • git clone https://github.com/SonarSource-Demos/sonar-aws-java-app.git

  • cd sonar-aws-java-app

  • git remote rename origin upstream

  • git remote add origin REPLACE_WITH_URL_OF_CODECOMMIT_REPO

  • git push origin

  • git checkout -t upstream/new-service

  • git push origin


STEP 18. CodeBuild 구성

clean-java-code-build 이름의 프로젝트 생성 후 소스 공급자는 AWS CodeCommit / 리포지토리는 sonar-sample-app 으로 설정합니다.
두번째 화면에서는 "권한이 있음" 부분에 체크해주고, 아래 세가지 환경변수를 설정해줍니다.

  • AWS_ACCOUNT_ID - 계정 ID로 모를 경우 계정 좌측 상단에 계정명 누르면 확인 가능
  • IMAGE_TAG - Latest 로 설정
  • IMAGE_REPO_NAME - app-container-repo


STEP 19. CodeBuild IAM ROLE 설정

IAM ROLE 콘솔에서 codebuild-clean-java 로 시작하는 ROLE을 찾아서 인라인 정책을 두가지 추가해줍니다.

Policy명 : ecr-policy로 합니다. 임의값이므로 변경되어도 무관합니다.
아래 arn 부분은 본인의 것에 맞게 변경해줍니다.

{
	"Version": "2012-10-17",
	"Statement": [
		{
			"Action": [
				"ecr:GetAuthorizationToken"
			],
			"Resource": "*",
			"Effect": "Allow"
		},
		{
			"Action": [
				"ecr:BatchCheckLayerAvailability",
				"ecr:CompleteLayerUpload",
				"ecr:InitiateLayerUpload",
				"ecr:PutImage",
				"ecr:UploadLayerPart"
			],
			"Resource": "arn:aws:ecr:REPLACE_WITH_REGION:REPLACE_AWS_ACCOUNT_ID:repository/app-container-repo",
			"Effect": "Allow"
		}
	]
}

Policy명 : secrets-policy로 합니다. 임의값이므로 변경되어도 무관합니다.

{
	"Version": "2012-10-17",
	"Statement": [
		{
			"Effect": "Allow",
			"Action": [
				"secretsmanager:GetResourcePolicy",
				"secretsmanager:GetSecretValue",
				"secretsmanager:DescribeSecret",
				"secretsmanager:ListSecretVersionIds"
			],
			"Resource": [
				"REPLACE_WITH_SECRETS_MANAGER_ARN"
"
			]
		},
		{
			"Effect": "Allow",
			"Action": "secretsmanager:ListSecrets",
			"Resource": "*"
		}
	]
}

STEP 20. ROLE 매핑

이전 단계에서 생성된 role을 매핑해줍니다.

  • eksctl create iamidentitymapping --cluster sonar-cluster --arn $(aws iam get-role --role-name codebuild-clean-java-code-build-service-role --query Role.Arn --output text | sed -r 's/\/service-role//') --group system:masters --username admin

STEP 21. CodePipeline 생성

app-main 이름으로 CodePipeline을 생성합니다.
소스 공급자는 AWS CodeCommit으로 하고, 리포지터리는 sonar-sample-app으로 합니다.

빌드 스테이지에서는 빌드 공급자를 AWS codeBuild로 정의하고 환경변수에 이름 : SourceBranch / 값: #{SourceVariables.BranchName} 을 정의해줍니다.

배포 스테이지는 건너뜁니다.


STEP 22. CloudFormation 구성에 필요한 파라미터 확인

아래 두 명령어를 실행하여 각각의 arn 부분을 메모해둡니다.

  • aws codecommit get-repository --repository-name sonar-sample-app
  • aws codebuild batch-get-projects --names clean-java-code-build

STEP 23. CloudFormation 스택 구성

아래 파일을 내려받고 PC에 저장 후 CloudFormation 에서 템플릿 파일 업로드를 통하여 스택을 구성합니다.

스택 구성 과정에서 앞 단계에서 확인한 arn을 파라미터로 주입합니다.


여기까지 진행하면 파이프라인 구성이 완료되고, CodeCommit 화면에서 PR을 생성하면 CodeBuild에서 트리거가 실행되면서 Sonarqube가 검사를 수행합니다.

검사 수행 내역은 Sonarqube 콘솔에서 확인할 수 있습니다.

profile
어딘가의 그 누군가.

0개의 댓글