___ ______ ____ _ _ ___
/ \ \ / / ___| / ___| | ___ _ _ __| |/ _ \
/ _ \ \ /\ / /\___ \ | | | |/ _ \| | | |/ _` | (_) |
/ ___ \ V V / ___) | | |___| | (_) | |_| | (_| |\__, |
/_/ \_\_/\_/ |____/ \____|_|\___/ \__,_|\__,_| /_/
- Cloud9 (IDE)
- Slack 채널의 Web Hook URL
설정 → AWS Settings → Credentials → AWS managed temporary credentials 체크 해제
aws configure
AWS IAM → 사용자 → 보안 자격 증명탭을 확인하면 액세스 키를 발급 받을 수 있다.
#aws configure --profile [name]
aws configure --profile noose
위 aws configure 설정값과 동일하게 입력한다.
sudo yum install -y jq
export ACCOUNT_ID=$(aws sts get-caller-identity --output text --query Account)
export AWS_REGION=$(curl -s 169.254.169.254/latest/dynamic/instance-identity/document | jq -r '.region')
echo "export ACCOUNT_ID=${ACCOUNT_ID}" | tee -a ~/.bash_profile
echo "export AWS_REGION=${AWS_REGION}" | tee -a ~/.bash_profile
aws configure get default.region # region 확인
curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.17.0/bin/linux/amd64/kubectl
chmod +x ./kubectl
sudo mv ./kubectl /usr/local/bin/kubectl
kubectl help
sudo yum install -y npm
npm install -g aws-cdk@1.30.0 --force
npm install -g typescript@latest
git clone https://github.com/n00s3/aws_devsecops
cd aws_devsecops/cdk
cdk init
npm install
npm run build
cdk ls
cdk synth --profile [name]
cdk bootstrap aws://$ACCOUNT_ID/$AWS_REGION --profile [name]
cdk deploy --profile [name]
스택 생성을 하는데 클러스터 생성 과정이 포함되어 있어 15~20분 정도 소요된다.
명령어 | 설명 |
---|---|
cdk synth | AWS CDK 애플리케이션을 AWS CloudFormation 템플릿으로 컴파일합니다. (cdk.out 디렉터리에 출력) |
cdk bootstrap | AWS CDK 앱을 환경 (계정/리전)에 배포하기 위해서는 먼저 bootstrap stack이라는 것을 설치해야 한다. |
cdk deploy | CDK 배포 |
- CdkStackDevops : 배포된 스택
- CDKToolkit : 부트스트랩 스택
AWS::EKS::Cluster는 Kubernetes 리소스에 대한 기본 제어 권한이 없다.
그렇기 때문에 Lambda 함수나 IAM 역할 등이 포함된 중첩 스택이 별도로 설치된다.
Cloud9 환경의 쿠버네티스와 EKS와 매핑하는 작업이다.
Cloudformation → 스택 선택 → 출력
CdkStackDevops 스택의 출력값을 확인하면 ClusterConfigCommand의 값을 복사 후 실행한다.
aws eks update-kubeconfig --name <Cluster_NAME> --region ap-northeast-2 --role-arn <ROLE_ARN>
kubectl get nodes
자신의 도메인에 맞게 yaml파일의 호스트를 수정한다.
cd ../docker-app/k8s/k8s_backup
vi devopsALBIngress_query1.yaml
cd ..
chmod +x setup2.sh
INSTANCE_ROLE=$(aws cloudformation describe-stack-resources --stack-name CdkStackDevOps | jq .StackResources[].PhysicalResourceId | grep CdkStackDevOps-ClusterDefaultCapacityInstanceRol | tr -d '["\r\n]')
CLUSTER_NAME=$(aws cloudformation describe-stack-resources --stack-name CdkStackDevOps | jq '.StackResources[] | select(.ResourceType=="Custom::AWSCDK-EKS-Cluster").PhysicalResourceId' | tr -d '["\r\n]')
echo "INSTANCE_ROLE = " $INSTANCE_ROLE
echo "CLUSTER_NAME = " $CLUSTER_NAME
./setup2.sh $AWS_REGION $INSTANCE_ROLE $CLUSTER_NAME
setup2.sh 스크립트를 통해 Blue, Green, ARX_API서버, Sonarqube 컨테이너가 생성되고 로드밸런서가 생성된다.
- ALB의 DNS 주소를 복사한다.
- Route53의 레코드를 CNAME 유형으로 리스너 규칙에 맞게 등록한다.
도메인이 없는 경우 쿼리 파라미터를 기반으로 라우팅 한다.
kubectl apply -f devopsALBIngress_query.yaml
ClusterDefaultCapacityInstanceSecurityGroup의 인바운드에 80포트(HTTP)를 열어준다.
SCA, SAST, DAST 보고서를 받을 수 있도록 대시보드에서 활성화 한다.
Cloud9 → Tools → Preview Running Application → 브라우저
브라우저에 주소 입력
Cloud9_URL/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/
# 토큰 확인
kubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get secret | grep admin-user | awk '{print $1}')
빌드를 하기에 앞서 자신의 환경에 맞게 몇가지를 수정해야 한다.
Cloudformation의 CdkStackDevOps 스택 출력값 확인
- S3Bucket
- lambdaSecurityHub
- lambdaSlack
lambdaSecurityHub, lambdaSlack 함수명을 확인하고 각 AWS Lambda에서 함수를 수정한다.
### import_findings_security_hub.py
#s3bucket = "myfirstbucket"
s3bucket = cdkstackdevops-myfirstbucketb8884501-1wki5u8hkln10 #S3Bucket 출력값으로 수정한다.
### slack.py
#url = "https://hooks.slack.com/services/"
url = 'Slack 채널의 Web Hook URL'
Sonarqube 프로젝트에 맞게 환경변수 값을 세팅해야 한다.
- 자신의 sonarqube 주소로 접속
- admin/admin 로그인
- 'Create new project' 클릭
- 'Project Key' 입력
환경변수 SonarQube_Project의 값과 같아야 한다.
만약 Sonarqube Project Key를 'test'로 만들었다면 SonarQube_Project 값도 'test'로 동일하게 변경한다. - token을 생성하고 제공되는 token값을 복사 한다.
- 복사한 token 키값을 SonarQube_Access_Token 값에 입력한다.
- SonarQube_URL 값은 자신의 sonarqube URL로 입력한다.
동적분석 수행 대상을 설정해야 한다.
- AWS CodeBuild 접속
- DAST 프로젝트 선택 후 편집
- 환경 클릭
- hostname 값을 자신의 테스트 서버 URL로 수정한다.
git remote add codecommit https://git-codecommit.$AWS_REGION.amazonaws.com/v1/repos/CdkStackDevOps-repo
git push codecommit master
Push시 unable to access 에러가 발생하는 경우 아래와 같은 명령어를 입력한다.
git config --global --unset credential.helper
CodeCommit Access key는 AWS IAM → 사용자 → 보안 자격 증명탭에서 발급 받을 수 있다.
kubectl delete svc/devops-svc-alb-blue svc/devops-svc-alb-green svc/devops-svc-alb-api svc/devops-svc-alb-sonarqube -n devops-alb
kubectl delete deploy/devops-deploy-alb-blue deploy/devops-deploy-alb-api deploy/devops-deploy-alb-sonarqube deploy/devops-deploy-alb-green -n devops-alb
kubectl delete ingress alb-ingress -n devops-alb
kubectl delete deploy alb-ingress-controller -n kube-system
kubectl delete deployment,service kubernetes-dashboard -n kube-system
cdk destroy --profile [name]
cd cdk/lib
vi cdk-stack.ts # stack 수정
# 재배포
cd ..
npm run build
cdk synth --profile [name]
cdk diff --profile [name]
cdk deploy --profile [name]
cdk diff 명령어를 수행하면 삭제/추가 되는 리소스를 확인 가능하다.
- 전체적인 인프라를 구성하는 스택을 변경하고 싶다면 cdk-stack.ts을 수정
- 자신의 빌드 환경에 맞게 구성하고 싶으면 buildspec.yaml 파일을 수정