AWS
  • About
  • 수업준비
    • AWS 환경설정
  • 1주차 - EC2
    • 예습
    • 실습
    • AWS Skill Builder
    • 과제
  • 2주차 - ELB & Autoscaling
    • 예습
    • 실습
    • AWS Skill Builder
    • 과제
  • 3주차 - VPC
    • 예습
    • 실습
    • AWS Skill Builder
    • 과제
  • 4주차 - Database
    • 예습
    • 실습
    • AWS Skill Builder
    • 과제
  • 5주차 - Storage
    • 예습
    • 실습
    • AWS Skill Builder
    • 과제
  • 6주차 - IAM & Security
    • 예습
    • 실습
    • AWS Skill Builder
    • 과제
  • 7주차 - Monitoring & Ops
    • 예습
    • 실습
    • AWS Skill Builder
    • 과제
  • 8주차 - DevOps
    • 예습
    • 실습
    • 과제
  • EKS
    • 실습
    • 실습 (AWS Worshop Studio)
  • Serverless
    • 실습
  • FAQ
  • Archive
    • AWS CodeBuild로 애플리케이션 테스트 자동화 시스템 구축
    • AWS CodeDeploy로 애플리케이션 배포 자동화 시스템 구축
      • 배포 실패 수정 방법
Powered by GitBook
On this page
  • Overview
  • 리포지토리에 연결
  • HTTPS
  • SSH
  • Git 201 - Branching, Merging, Pull Request
  • Branching
  • Pull Request & Merging Branch
  • CloudWatch Events, Lambda, CodeBuild로 테스트 자동화 구성
  • Test Automation
  • 단위 테스트를 실행하는 CodeBuild 구성
  • CodeBuild를 실행하는 Lambda 구성
  • Pull Request 상태 변경 이벤트에 반응하는 규칙 생성
  • CodeBuild 결과를 전송하는 Lambda 구성
  • CodeBuild 상태 변경 이벤트에 반응하는 규칙 생성
  • 테스트 자동화 시스템 검증

Was this helpful?

  1. Archive

AWS CodeBuild로 애플리케이션 테스트 자동화 시스템 구축

PreviousArchiveNextAWS CodeDeploy로 애플리케이션 배포 자동화 시스템 구축

Last updated 3 years ago

Was this helpful?

완전 관리형 형상관리 또는 버전관리 서비스로 고가용성, 확장성 및 안정성을 내재한 Git 리포지토리를 제공합니다. 모든 소스코드는 암호화되어 전송 및 저장이 되고 리포지토리 크기는 무한대로 확장이 가능하며 어떤한 파일도 저장이 가능합니다. 다른 AWS 서비스들과 (AWS CodeBuild, CodeDeploy, CodePipeline, etc) 연계를 통해서 보다 나은 CI/CD 파이프라인을 구축할수 있습니다.

Overview

  1. Git 101 - 기본적인 Git 환경 구성 및 Commands 소개

  2. AWs CodeCommit 연동 방식 실습 (HTTP, SSH)

  3. Git 201 - Branching, Merging, Pull Request

  4. CloudWatch Events, Lambda, CodeBuild로 테스트 자동화 구성

리포지토리에 연결

HTTPS

1. 아래의 IAM 유저로 AWS 관리콘솔에 로그인

Username
Password

lead

Asdf!234

2. 로그인 후 AWS 관리콘솔 좌측 상단에 있는 [Services] 를 선택하고 검색창에서 IAM를 검색하거나 [Security, Identity, & Compliance] 카테고리에 있는 [IAM] 를 선택

3. IAM 대시보드에서 [Users] 클릭 → lead를 선택 → [Security credentials] → HTTPS Git credentials for AWS CodeCommit 밑에 있는 [Generate credentials] 를 클릭 후 User name과 Password를 메모합니다.

4. AWS Management Console 좌측 상단에 있는 [Services] 를 선택하고 검색창에서 ssm를 검색하고 [Systems Manager] 를 선택

5. Systems Manager Dashboard 왼쪽 패널 Node Management 섹션 아래에 있는 [Session Manager] 선택

6. [Start Session] → Target instances 탭에서 Instance name이 lead인 인스턴스를 선택 → [Start Session] 클릭 (Region 확인필수)

  • Home Directory로 이동

    cd
  • Git 설치

    sudo yum install git -y
  • Git 유저 설정

    git config --global user.email "you@example.com"
    git config --global user.name "Your Name"
  • CodeCommit 리포지토리를 로컬서버로 복제

    git clone https://git-codecommit.ap-northeast-2.amazonaws.com/v1/repos/guess
  • 위에서 만든 Git 자격증명 입력

    Username for 'https://git-codecommit.ap-northeast-2.amazonaws.com':
    Password for 'https://lead-at-xxxxxxxxx@git-codecommit.ap-northeast-2.amazonaws.com':
  • 해당 Github 리포지토리를 로컬서버로 복제

    git clone https://github.com/fitcloud/code-commit.git
  • 샘플 애플리케이션 구동

    python3 ./code-commit/main.py
  • 소스코드 복사

    cp code-commit/*.py guess/
  • Git 자격증명 저장을 원할경우 (Optional)

    git config credential.helper store
  • CodeCommit 리포지토리로 소스코드를 Push

    cd guess
    git add main.py test.py
    git commit -m "initial commit"
    git push

7. 해당 CodeCommit 리포지토리에 대한 쓰기 권한이 없기 때문에 403 에러가 발생합니다.

fatal: unable to access 'https://git-codecommit.ap-northeast-2.amazonaws.com/v1/repos/guess/': The requested URL returned error: 403

8. IAM 대시보드로 이동해서 [Users] 클릭 → lead를 선택 → [Permissions] 섹션 오른쪽에 있는 [➕ Add inline policy] 클릭후, Service = CodeCommit, Actions = GitPush, Resources 탭에 있는 [Add ARN] 클릭 → Region = ap-northeast-2, Repository name = guess → [Add]

9. [Review Policy] → Name = codecommit-lead-access → [Create Policy]

10. git push 명령어 재시도

SSH

1. AWS Systems Manager Session Manager를 통해서 dev 인스턴스로 연결

  • RSA Key Pair 생성 (기본값으로 생성 Enter 3번)

    ssh-keygen

    e.g.

    sh-4.2$ ssh-keygen
    Generating public/private rsa key pair.
    Enter file in which to save the key (/home/ssm-user/.ssh/id_rsa):
    Created directory '/home/ssm-user/.ssh'.
    Enter passphrase (empty for no passphrase):
    Enter same passphrase again:
    Your identification has been saved in /home/ssm-user/.ssh/id_rsa.
    Your public key has been saved in /home/ssm-user/.ssh/id_rsa.pub.
    The key fingerprint is:
    SHA256:uSIvQyR0pj6fpO16osvdkrGELcl5ZkUTzBj/g/tWgH4 ssm-user@ip-10-0-116-87.ap-northeast-2.compute.internal
    The key's randomart image is:
    +---[RSA 2048]----+
    |   .=..          |
    |  ..+=           |
    | . +..o          |
    |  o .oo. .       |
    |..=oo. oS        |
    | *oBo..E.o       |
    |  *B=oo o        |
    |. ++Oo.o         |
    |o+.*o+o.         |
    +----[SHA256]-----+
    sh-4.2$
  • RSA Public Key를 클립보드로 복사

    cat ~/.ssh/id_rsa.pub

2. IAM 대시보드로 이동해서 [Users] 클릭 → dev를 선택 → [Security credentials] → HTTPS Git credentials for AWS CodeCommit 밑에 있는 [Upload SSH public key] 클릭 → 클립보드 내용 붙여넣기 → [Upload SSH public key] → SSH key ID를 메모

3. 다시 EC2 세션으로 돌아와서

  • Home Directory로 이동

    cd
  • Git 설치

    sudo yum install git -y
  • Git 유저 설정

    git config --global user.email "you@example.com"
    git config --global user.name "Your Name"
  • 로컬 SSH 연결 설정

    vi ~/.ssh/config
    Host git-codecommit.*.amazonaws.com
    User Your-IAM-SSH-Key-ID-Here  // 복사한 SSH ID 넣어주세요
    IdentityFile ~/.ssh/id_rsa
    chmod 600 ~/.ssh/config
  • CodeCommit 리포지토리를 로컬서버로 복제

    git clone ssh://git-codecommit.ap-northeast-2.amazonaws.com/v1/repos/guess

4. 어플리케이션을 1 ~ 20까지의 숫자를 맞추는걸로 수정하고 Git 리포지토리에 변경사항 반영

5. 권한 부족으로 리포지토리에 변경사항을 반영할수 없으므로 다음 단계로 진행

Git 201 - Branching, Merging, Pull Request

Branching

1. Git Branch 생성 후 Origin으로 Push

git checkout -b feature-max20
git push -u origin feature-max20

2. 권한 부족으로 리포지토리에 변경사항을 반영할수 없으므로 다음 단계로 진행

3. IAM 대시보드로 이동해서 [Users] 클릭 → dev를 선택 → [Permissions] 섹션 아래 [Add permissions] → [Attach existing policies directly] → ✅ AWSCodeCommitPowerUser 선택 → [Next: Review] → [Add permissions]

4. [➕ Add inline policy] 클릭 → JSON 선택 후 아래 내용 붙여넣고 [Review policy]

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Deny",
      "Action": [
        "codecommit:GitPush",
        "codecommit:DeleteBranch",
        "codecommit:PutFile",
        "codecommit:MergePullRequestByFastForward"
      ],
      "Resource": "arn:aws:codecommit:ap-northeast-2:*:guess",
      "Condition": {
        "StringEqualsIfExists": {
          "codecommit:References": ["refs/heads/master"]
        },
        "Null": {
          "codecommit:References": false
        }
      }
    }
  ]
}

5. Name = DenyChangesToMaster → [Create policy]

6. 다시 EC2 세션으로 돌아와서 Git Branch를 Origin으로 Push 재시도

git push -u origin feature-max20

Pull Request & Merging Branch

1. 아래의 IAM 유저로 AWS 관리콘솔에 로그인

Username
Password

dev

Asdf!234

2. AWS Management Console에서 좌측 상단에 있는 [Services] 를 선택하고 검색창에서 CodeCommit을 검색하거나 [Developer Tools] 카테고리에 있는 [CodeCommit] 를 선택

3. 리포지토리 목록에서 guess를 선택 → 왼쪽 패널에서 [Branches] → [Create pull request] 클릭 → Destination = master, Source = feature-max20 → [Compare]

4. Title = NEW-01 최댓값 변경, Description = 사용자 XXX의 요청으로 최댓값을 20으로 변경 → [Create pull request]

5. lead IAM 유저로 AWS 관리콘솔에 로그인하고 AWSCodeCommitPowerUser 권한 부여

6. CodeCommit 대시보드에서 Pull requests 섹션으로 이동

7. NEW-01 최댓값 변경 Pull request를 선택 → [Approve] → [Merge] → [Merge pull request]

8. Master branch의 소스코드에 변경사항이 적용 됬는지 확인

CloudWatch Events, Lambda, CodeBuild로 테스트 자동화 구성

Test Automation

  1. Test 빌드의 상태를 Pull Request 댓글에 기록

  2. CloudWatch Events에서 Test 빌드의 상태변화를 인지하고 Lambda 실행

  3. Lambda function을 통해서 CodeBuild에 있는 Test 빌드 실행

  4. CloudWatch Events에서 Pull Request에 대한 이벤트를 인지하고 Lambda 실행

  5. 개발자가 Pull Requeust 생성

단위 테스트를 실행하는 CodeBuild 구성

1. 제공된 AWS 계정으로 로그인 합니다. AWS 관리콘솔 좌측 상단에 있는 [Services] 를 선택하고 검색창에서 CodeBuild를 검색하거나 [Developer Tools] 카테고리에 있는 [CodeBuild] 를 선택

2. [Create build proejct] 클릭하고

Project name = guess-unittest, Source provider = AWS CodeCommit, Repository = guess, Reference type = Branch

Environment image = Managed Image, Operating system = Amazon Linux 2, Runtime(s) = Standard, Image = aws/codebuild/amazonlinux2-x86_64-standard:3.0, Service role = New service role

Build specifications = Insert build commands → [Switch to editor] → 아래 커맨드블록을 Build commands에 붙여놓고 [Create build project] 클릭

version: 0.2

phases:
  install:
    runtime-versions:
      python: 3.8
  build:
    commands:
      - python3 -m unittest

CodeBuild를 실행하는 Lambda 구성

1. AWS 관리콘솔 좌측 상단에 있는 [Services] 를 선택하고 검색창에서 Lambda를 검색하거나 [Compute] 카테고리에 있는 [Lambda] 를 선택

2. Lambda 대시보드에서 [Create function] 클릭후, Function name = run_testbuild, Runtime = Python 3.8, [Create function] 클릭해서 Lambda 함수 생성

3. 생성된 Lambda 함수 설정에서 [Configuration] → [Permission] → Execution role 에서 run_testbuild-role-xxxx 를 선택

4. [Permissions] 섹션 오른쪽에 있는 [Add Permissions ] [Create inline policy] 클릭 후

Service = CodeBuild, Actions = StartBuild, Resources 탭에 있는 [Add ARN] 클릭 → Region = ap-northeast-2, Project name = guess-unittest → [Add]

5. [Review Policy] → Name = allow-lambda-run-codebuild → [Create Policy]

6. 아래 코드블록을 Lambda에 복사 후, [Deploy] 클릭

import json
import boto3

def lambda_handler(event, context):

    codebuild = boto3.client('codebuild')
    response = codebuild.start_build(
        projectName = 'guess-unittest',
        sourceVersion= event['detail']['sourceCommit'],
        environmentVariablesOverride=[
            {
                'name': 'pullRequestId',
                'value': event['detail']['pullRequestId'],
                'type': 'PLAINTEXT'
            },
            {
                'name': 'repositoryName',
                'value': 'guess',
                'type': 'PLAINTEXT'
            },
            {
                'name': 'destinationCommit',
                'value': event['detail']['destinationCommit'],
                'type': 'PLAINTEXT'
            }
        ]
    )

Pull Request 상태 변경 이벤트에 반응하는 규칙 생성

1. AWS 관리콘솔 좌측 상단에 있는 [Services] 를 선택하고 검색창에서 [Amazon EventBridge] 를 선택

2. EventBridge 대시보드에서 [Events] 섹션 아래에 있는 [Rules] → [Create rule] 클릭

Step 1: Define rule detail - Service Name = pull_request_made, Rule tpye= Rule with an event pattern

Step 2: Build event pattern - Event source - AWS services

Event source = CodeCommit - Event Type = CodeCommit Pull Request State Change, ✅ Specific resource(s) by ARN = CodeCommit Repository ARN 입력

CodeCommit Repository ARN은 CodeCommit -> Repositories -> settings -> General 에서 확인 가능합니다

Step 3: Select tartget(s) AWS service → Lambda function → Function = run_testbuild

Step 4: Configure tags - optional

Step 5: Review and create - create rule

CodeBuild 결과를 전송하는 Lambda 구성

1. AWS 관리콘솔 좌측 상단에 있는 [Services] 를 선택하고 검색창에서 Lambda를 검색하거나 [Compute] 밑에 있는 [Lambda] 를 선택

2. Lambda 대시보드에서 [Create function] 클릭후, Function name = post_test_result, Runtime = Python 3.8, [Create function] 클릭

3.생성된 Lambda 함수 설정에서 [Configuration] → [Permission] → Execution role에서 View the post_test_result-role-xxxx on the IAM console 를 선택

4. [Permissions] 섹션 오른쪽에 있는 [ Add permissions] - [Create inline policy] 클릭

Service = CodeCommit, Actions = PostCommentForPullRequest, Resources 탭에 있는 [Add ARN] 클릭 → Region = ap-northeast-2, Repository name = guess → [Add]

5. [Review Policy] → Name = allow-lambda-post-comment-on-pr → [Create Policy]

6. 아래 코드블록을 Lambda -post_test_result에 복사 후, [Deploy] 클릭

import json
import boto3
import re

def lambda_handler(event, context):
    envs = event['detail']['additional-information']['environment']['environment-variables']
    repositoryName = [var['value'] for var in envs if var['name'] == 'repositoryName'][0]
    pullRequestId = [var['value'] for var in envs if var['name'] == 'pullRequestId'][0]
    destinationCommit = [var['value'] for var in envs if var['name'] == 'destinationCommit'][0]
    buildStatus = event['detail']['build-status']
    buildArn = event['detail']['build-id']
    buildId = re.findall(r'(?<=\/)(.*)', buildArn)[0]
    sourceVersion = envs = event['detail']['additional-information']['source-version']

    codecommit = boto3.client('codecommit')
    response = codecommit.post_comment_for_pull_request(
        pullRequestId = pullRequestId,
        repositoryName = repositoryName,
        content = f'[BUILD](https://ap-northeast-2.console.aws.amazon.com/codesuite/codebuild/projects/guess-unittest/build/{buildId}): {buildStatus}',
        afterCommitId = sourceVersion,
        beforeCommitId = destinationCommit
    )

CodeBuild 상태 변경 이벤트에 반응하는 규칙 생성

1. AWS 관리콘솔 좌측 상단에 있는 [Services] 를 선택하고 검색창에서 [Amazon EventBridge] 를 선택

2. EventBridge 대시보드에서 [Events] 섹션 아래에 있는 [Rules] → [Create rule] 클릭

Step 1: Define rule detail - Service Name =test_build_run, Rule tpye= Rule with an event pattern

Step 2: Build event pattern - Event source = other

Event pattern에 아래 블록을 붙여넣기

{
  "source": ["aws.codebuild"],
  "detail-type": ["CodeBuild Build State Change"],
  "detail": {
    "build-status": ["IN_PROGRESS", "SUCCEEDED", "FAILED", "STOPPED"],
    "project-name": ["guess-unittest"]
  }
}

Step 3: Select tartget(s) AWS service → Lambda function → Function = post_test_result

Step 4: Configure tags - optional

Step 5: Review and create - create rule

테스트 자동화 시스템 검증

  1. 새로운 Git Branch를 생성 후, 어플리케이션을 1 ~ 30까지의 숫자를 맞추는걸로 수정하고 해당 Branch를 CodeCommit에 Push하고 Pull Request 생성

  2. CodeCommit 대시보드에서 방금 생성한 Pull request를 선택하고, Activity나 Changes 탭 밑에서 CodeBuild 테스트 결과 확인

  3. CodeBuild 테스트 빌드가 성공하도록 소스코드 수정