> For the complete documentation index, see [llms.txt](https://aws.youngwjung.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://aws.youngwjung.com/archive/aws-codebuild.md).

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

완전 관리형 형상관리 또는 버전관리 서비스로 고가용성, 확장성 및 안정성을 내재한 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 |

<div align="left"><img src="https://3129222069-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQJ-0VExB6WAovylp1S%2Fuploads%2FowmRudLu3KwUyb4NJr65%2Fimage.png?alt=media&amp;token=2dc2298e-cd87-42a3-90b2-29db7844af6f" alt=""></div>

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

![](https://3129222069-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQJ-0VExB6WAovylp1S%2Fuploads%2F7t8MocPbE9iKhtuTmEyr%2FScreen%20Shot%202022-03-31%20at%2012.59.52%20PM.png?alt=media\&token=2e33493f-707f-4299-ad49-20958d325c18)

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

![](https://3129222069-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQJ-0VExB6WAovylp1S%2Fuploads%2FVrTHw8qdu5MkwrBoc4re%2Fimage.png?alt=media\&token=0db7a146-6695-47bd-9378-227813a7de4c)

![](https://3129222069-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQJ-0VExB6WAovylp1S%2Fuploads%2FBuugQn4njLcw9Y36pLQL%2Fimage.png?alt=media\&token=d4a46803-b778-4ecb-a625-6de5dff2455c)

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

![](https://3129222069-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQJ-0VExB6WAovylp1S%2Fuploads%2FTzaoJfTaBnqFG1xNpMV5%2FScreen%20Shot%202022-03-31%20at%201.03.02%20PM.png?alt=media\&token=49ac3dd2-0cd6-47de-819f-58fbb890217c)

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

![](https://3129222069-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQJ-0VExB6WAovylp1S%2Fuploads%2FRKVTDetRJmISYLcH2CBd%2FScreen%20Shot%202022-03-31%20at%201.04.48%20PM.png?alt=media\&token=d1d517db-d7af-4693-be26-a8a70d195e57)

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

![](https://3129222069-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQJ-0VExB6WAovylp1S%2Fuploads%2F25xWJtxltpUggFiB4Vd1%2FScreen%20Shot%202022-03-31%20at%201.08.12%20PM.png?alt=media\&token=2c45e778-ceb7-49a1-ba10-050833f8c113)

![](https://3129222069-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQJ-0VExB6WAovylp1S%2Fuploads%2Fg3eKY1HZ9D3iNKhiOoEA%2FScreen%20Shot%202022-03-31%20at%201.23.30%20PM.png?alt=media\&token=54c7ec7f-b08d-4850-a1ac-ae21846480ed)

* 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 리포지토리를 로컬서버로 복제&#x20;

  ```
  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 리포지토리를 로컬서버로 복제&#x20;

  ```
  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]**

![](https://3129222069-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQJ-0VExB6WAovylp1S%2Fuploads%2F7y5gimNvKP99kbUEf28A%2FScreen%20Shot%202022-03-31%20at%201.39.11%20PM.png?alt=media\&token=4f79ff56-ddfa-4ead-9239-2164ec08ba10)

![](https://3129222069-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQJ-0VExB6WAovylp1S%2Fuploads%2FE0TOTLYk8ilDHBxfR4yn%2FScreen%20Shot%202022-03-31%20at%201.43.01%20PM.png?alt=media\&token=7deb0358-4409-420f-bbf5-d9979268e4f9)

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

![](https://3129222069-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQJ-0VExB6WAovylp1S%2Fuploads%2FgeiDVJ6R4XRdvUbgAXFF%2FScreen%20Shot%202022-03-31%20at%201.49.02%20PM.png?alt=media\&token=0234a44f-e06b-48ee-942e-d82e378896a0)

10\. `git push` 명령어 재시도 &#x20;

### **SSH**

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

![](https://3129222069-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQJ-0VExB6WAovylp1S%2Fuploads%2FReOkOk2W6MNYTNBD31r2%2Fimage.png?alt=media\&token=7f6675f9-eef7-42e8-a08d-bc1447ecd500)

* RSA Key Pair 생성  (기본값으로 생성 Enter 3번) &#x20;

  ```
  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를 메모

![](https://3129222069-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQJ-0VExB6WAovylp1S%2Fuploads%2FT5F160qlMkBcAluVYJd2%2Fimage.png?alt=media\&token=850b4fd9-a0fb-44d0-863f-b8f3704b1329)

![](https://3129222069-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQJ-0VExB6WAovylp1S%2Fuploads%2FqH28c6L6W1XPp6MZUsFe%2Fimage.png?alt=media\&token=bc97b41b-f086-4e25-994e-b8d52dfd75a1)

<div align="left"><img src="https://3129222069-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQJ-0VExB6WAovylp1S%2Fuploads%2FGW4n8KPGDqjF4NgNLEHf%2Fimage.png?alt=media&amp;token=d7bcbf02-316a-47f3-97ce-c76cee4ba19d" alt=""></div>

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]**

![](https://3129222069-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQJ-0VExB6WAovylp1S%2Fuploads%2FQ8k9BDQJIInVLY1joEF5%2Fimage.png?alt=media\&token=2a63265d-16e2-418d-b22c-6eb778149e3f)

![](https://3129222069-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQJ-0VExB6WAovylp1S%2Fuploads%2FaXjhGo4UrowMskwqfWvw%2Fimage.png?alt=media\&token=b18f2f22-233d-4eb2-aff7-a277a55558ce)

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
        }
      }
    }
  ]
}
```

![](https://3129222069-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQJ-0VExB6WAovylp1S%2Fuploads%2FyYiGATEvyJUrU7FC0Zj0%2Fimage.png?alt=media\&token=315464bc-f1bd-4bf8-958a-681550261499)

5\. **Name** = DenyChangesToMaster → **\[Create policy]**

![](https://3129222069-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQJ-0VExB6WAovylp1S%2Fuploads%2FuEo2XSHR1d5FNTj1VAmi%2Fimage.png?alt=media\&token=1fe0450f-f77c-436a-85ea-66e008939492)

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

```
git push -u origin feature-max20
```

### Pull Request & Merging Branch

1\. 아래의 IAM 유저로 AWS 관리콘솔에 로그인&#x20;

| Username | Password |
| -------- | -------- |
| dev      | Asdf!234 |

![](https://3129222069-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQJ-0VExB6WAovylp1S%2Fuploads%2FTZSKxElK4BA9ZppSkPTY%2Fimage.png?alt=media\&token=f9c8c2f5-9f15-436e-a74c-72cf7364abdf)

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

![](https://3129222069-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQJ-0VExB6WAovylp1S%2Fuploads%2FJK0YsCe8RziKUY7cI176%2FScreen%20Shot%202022-03-31%20at%202.47.34%20PM.png?alt=media\&token=58b09759-7e56-4d0f-a817-6b2ae5dcab5b)

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

![](https://3129222069-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQJ-0VExB6WAovylp1S%2Fuploads%2FoDWJnkEg3KNP5vR2TSFy%2Fimage.png?alt=media\&token=e581e96d-4195-4973-bf7f-7186b21b10df)

![](https://3129222069-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQJ-0VExB6WAovylp1S%2Fuploads%2FNthg2pGLbmAFqwX8kxjj%2Fimage.png?alt=media\&token=179a50ba-5993-4d31-8aca-81e9718d930f)

![](https://3129222069-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQJ-0VExB6WAovylp1S%2Fuploads%2FEFWjCsFyR2ULNXutUQZR%2Fimage.png?alt=media\&token=cecadce0-1310-409a-95b1-6f13e1cc3fcb)

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

![](https://3129222069-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQJ-0VExB6WAovylp1S%2Fuploads%2FgiaaxUaMakTXVGHL8OIh%2Fimage.png?alt=media\&token=d469a444-8a7a-46d4-9602-392003196c34)

![](https://3129222069-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQJ-0VExB6WAovylp1S%2Fuploads%2FpKtQEUpGXcSeT4bYzzML%2Fimage.png?alt=media\&token=ead30027-2817-4cad-969f-18e856d0b7cb)

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

![](https://3129222069-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQJ-0VExB6WAovylp1S%2Fuploads%2FmZOWPd42QOSnruBSfhqu%2Fimage.png?alt=media\&token=ee92d687-9c6e-4c8c-9935-6d0e35d2bebb)

![](https://3129222069-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQJ-0VExB6WAovylp1S%2Fuploads%2FYfSZpR1NYUMDZeWR8i7h%2Fimage.png?alt=media\&token=043ac114-2b41-4002-ad15-0528b5967478)

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

![](https://3129222069-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQJ-0VExB6WAovylp1S%2Fuploads%2F21jwGAehogGAycIXp8Vj%2Fimage.png?alt=media\&token=330f1eba-48fc-479a-a046-c1ed27c04fc7)

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

![](https://3129222069-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQJ-0VExB6WAovylp1S%2Fuploads%2FUNEM5zCFVxtPvIBF1RWx%2Fimage.png?alt=media\&token=6bc9cf1f-606d-46e7-aa98-a6bf54d3eac7)

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

![](https://3129222069-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQJ-0VExB6WAovylp1S%2Fuploads%2FciBCwymg6Luw6cWFQoWY%2Fimage.png?alt=media\&token=b7b7df15-0cd2-4e48-8a44-5ecda3339292)

![](https://3129222069-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQJ-0VExB6WAovylp1S%2Fuploads%2Ft6DTqSApS3lCgGeTq8Xy%2Fimage.png?alt=media\&token=e7b35edb-eddb-4e3b-90b2-c5fea15a4660)

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

### Test Automation

![](https://3129222069-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQJ-0VExB6WAovylp1S%2Fuploads%2FZRRRvcZY9veAzRTipE3n%2Fimage.png?alt=media\&token=edb1bf3b-c8d0-4021-ac8d-a0ea71c9bdd6)

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**] 를 선택

![](https://3129222069-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQJ-0VExB6WAovylp1S%2Fuploads%2FXWjJfRCrBr0GNsqTJ1kU%2FScreen%20Shot%202022-03-31%20at%203.43.05%20PM.png?alt=media\&token=217c0e68-97cb-4cbc-a4ef-0673da9e62a6)

2\. \[**Create build proejct**] 클릭하고&#x20;

![](https://3129222069-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQJ-0VExB6WAovylp1S%2Fuploads%2FQTWXaYEAXlShSY8f6XG4%2Fimage.png?alt=media\&token=4cf2429c-9fe6-4070-8620-8113169ef403)

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

![](https://3129222069-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQJ-0VExB6WAovylp1S%2Fuploads%2FfGMvVswf26FEg25w0GbG%2Fimage.png?alt=media\&token=0e0646dd-7c36-4a76-a874-04bca01552a6)

**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

<div align="left"><img src="https://3129222069-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQJ-0VExB6WAovylp1S%2Fuploads%2FiLEMwYNaLRgd7XtPLOcV%2Fimage.png?alt=media&amp;token=35f3a3d6-6b07-43a0-9cb4-c998a7411982" alt=""></div>

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

```
version: 0.2

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

<div align="left"><img src="https://3129222069-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQJ-0VExB6WAovylp1S%2Fuploads%2F6RlsWOjOGBRh9cf1Rq3v%2Fimage.png?alt=media&amp;token=f8e82efa-fb27-4a42-b278-7d4a05baf54d" alt=""></div>

![](https://3129222069-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQJ-0VExB6WAovylp1S%2Fuploads%2F1F3HKrH5DxoamdkwbOAQ%2FScreen%20Shot%202022-03-31%20at%203.48.39%20PM.png?alt=media\&token=625b06bb-f7e9-42f6-aa68-c5897f5c551a)

### CodeBuild를 실행하는 Lambda 구성

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

![](https://3129222069-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQJ-0VExB6WAovylp1S%2Fuploads%2FhA65JGIGIUUdPCOeBBWr%2FScreen%20Shot%202022-03-31%20at%203.52.13%20PM.png?alt=media\&token=749df5c8-eb2b-4172-9754-92396f59db7e)

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

![](https://3129222069-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQJ-0VExB6WAovylp1S%2Fuploads%2FpmH3syjeyW3z9ZxZZWh4%2Fimage.png?alt=media\&token=a7f305e6-7876-476a-b89e-c0a1fc5b5845)

![](https://3129222069-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQJ-0VExB6WAovylp1S%2Fuploads%2FzyrHCYVKpVEgfJafyzsf%2Fimage.png?alt=media\&token=97e215a3-1624-4572-af31-3bf0f6f08cf5)

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

![](https://3129222069-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQJ-0VExB6WAovylp1S%2Fuploads%2FePlczdOuNIAq0mSiPkpP%2Fimage.png?alt=media\&token=7e6ecb92-4709-407f-a43f-4e868b0722e8)

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

![](https://3129222069-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQJ-0VExB6WAovylp1S%2Fuploads%2FEILcy4O09JiGRNXWZ7xl%2Fimage.png?alt=media\&token=52347768-772f-40d8-97d3-dd3b56058da9)

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

![](https://3129222069-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQJ-0VExB6WAovylp1S%2Fuploads%2FFXHLe6BxONeBZfWu12mF%2Fimage.png?alt=media\&token=1ff3bae6-7f66-481e-9590-cd21fdeef248)

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

![](https://3129222069-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQJ-0VExB6WAovylp1S%2Fuploads%2F0JnIFeWwYMasxyPiTVkn%2Fimage.png?alt=media\&token=5078015c-7771-415d-a3f4-1b176d37bc2c)

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'
            }
        ]
    )
```

![](https://3129222069-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQJ-0VExB6WAovylp1S%2Fuploads%2FScNhcmOLgP8WOl2HGgoO%2Fimage.png?alt=media\&token=30750243-c72c-4e1b-900b-bd958264feda)

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

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

![](https://3129222069-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQJ-0VExB6WAovylp1S%2Fuploads%2FpJ5Od83lK16J4aFi3mrh%2FScreen%20Shot%202022-03-31%20at%204.55.28%20PM.png?alt=media\&token=0aa12616-0b4f-4cea-94cc-a9fe7405a5ae)

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

![](https://3129222069-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQJ-0VExB6WAovylp1S%2Fuploads%2FLGle2s991RRWJI2bjBir%2Fimage.png?alt=media\&token=f03b4b48-38af-4fcd-9663-65eda371c2de)

**Step 1: Define rule detail** - **Service Name** = pull\_request\_made, **Rule tpye**= Rule with an event pattern

![](https://3129222069-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQJ-0VExB6WAovylp1S%2Fuploads%2FmTKIAsPor2fAmaaE6FMD%2Fimage.png?alt=media\&token=38cc8be8-cdc5-4583-b84a-1f9ab2f7cebb)

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

![](https://3129222069-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQJ-0VExB6WAovylp1S%2Fuploads%2FTAv5VZ0OeMEFVQ0YicoW%2Fimage.png?alt=media\&token=b9fd6e1e-d152-4ca7-a2b8-5ebbb922a9f1)

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

![](https://3129222069-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQJ-0VExB6WAovylp1S%2Fuploads%2F986rmgpicYAscjm8hfmc%2Fimage.png?alt=media\&token=29aa18f1-8c84-4ae8-8c14-3e00ddeed917)

{% hint style="info" %}
CodeCommit Repository ARN은 CodeCommit -> Repositories -> settings -> General 에서 확인 가능합니다
{% endhint %}

![](https://3129222069-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQJ-0VExB6WAovylp1S%2Fuploads%2FRYo0hQ5UvziNOYABqIFW%2Fimage.png?alt=media\&token=fe98f3db-a07a-473c-ac4d-b01fa0fb8f25)

**Step 3: Select tartget(s)** AWS service → **Lambda function** → **Function** = run\_testbuild

![](https://3129222069-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQJ-0VExB6WAovylp1S%2Fuploads%2F4yoqh1USJMhqSikVvxjv%2Fimage.png?alt=media\&token=17d6b911-dc71-4e8c-b63c-585ffaaa5c32)

**Step 4: Configure tags -** optional

![](https://3129222069-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQJ-0VExB6WAovylp1S%2Fuploads%2FqftrSYAfmxTxQJTmQiNQ%2FScreen%20Shot%202022-03-31%20at%2010.00.51%20PM.png?alt=media\&token=1a34dbba-4ca1-4f43-b3a2-942006ec8c9e)

**Step 5: Review and create -** create rule

![](https://3129222069-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQJ-0VExB6WAovylp1S%2Fuploads%2FPqXzVohTb2kmBYtWpdZS%2FScreen%20Shot%202022-03-31%20at%2010.03.14%20PM.png?alt=media\&token=951c4835-5853-483d-ae86-f8749d05f055)

### CodeBuild 결과를 전송하는 Lambda 구성

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

![](https://3129222069-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQJ-0VExB6WAovylp1S%2Fuploads%2FmSRRJQwNHr1jB5JhFwhw%2Fimage.png?alt=media\&token=93f6eed2-0017-49c6-b295-c01d2c10ca02)

2\. Lambda 대시보드에서 **\[Create function]** 클릭후, **Function name** = post\_test\_result, **Runtime** = Python 3.8, **\[Create function]** 클릭

![](https://3129222069-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQJ-0VExB6WAovylp1S%2Fuploads%2F9CfBguEApakgM46lCv6a%2Fimage.png?alt=media\&token=1ae899c3-1cac-49fe-a8bf-e7b7619d29b9)

![](https://3129222069-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQJ-0VExB6WAovylp1S%2Fuploads%2FYe2YPVjEsdaZHI3Qfqz4%2Fimage.png?alt=media\&token=067aedf1-c043-4b6c-9e24-5618b4d37cec)

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

![](https://3129222069-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQJ-0VExB6WAovylp1S%2Fuploads%2FwDvdWgLBi4YMvaIYaNVZ%2Fimage.png?alt=media\&token=e7c2634c-f785-4529-b28b-651b2bfc78c0)

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

![](https://3129222069-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQJ-0VExB6WAovylp1S%2Fuploads%2FMkQjUiwH1uSDC1RIwfmR%2Fimage.png?alt=media\&token=f13417e0-5667-4603-8ead-a5dc11ae57b4)

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

![](https://3129222069-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQJ-0VExB6WAovylp1S%2Fuploads%2FDmeslnDgDVfwwNLAZ3NW%2Fimage.png?alt=media\&token=34640876-15ef-4b4d-b345-98cc4962b127)

<div align="left"><img src="https://3129222069-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQJ-0VExB6WAovylp1S%2Fuploads%2FbhlpmTfu4NuyKtyQZAhq%2Fimage.png?alt=media&amp;token=49d65b6c-f6b2-483b-a195-0668f7fdd489" alt=""></div>

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

![](https://3129222069-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQJ-0VExB6WAovylp1S%2Fuploads%2FxZuKguIZaSrlxXkpG20M%2Fimage.png?alt=media\&token=c76a71ea-42aa-4100-adf5-163841c08caa)

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
    )
```

![](https://3129222069-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQJ-0VExB6WAovylp1S%2Fuploads%2FVIavdEpFo5W0oE51A7oc%2Fimage.png?alt=media\&token=61307c37-6963-4b6b-b1cb-b497118d4a19)

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

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

![](https://3129222069-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQJ-0VExB6WAovylp1S%2Fuploads%2FpJ5Od83lK16J4aFi3mrh%2FScreen%20Shot%202022-03-31%20at%204.55.28%20PM.png?alt=media\&token=0aa12616-0b4f-4cea-94cc-a9fe7405a5ae)

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

![](https://3129222069-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQJ-0VExB6WAovylp1S%2Fuploads%2FNhKXJbz2HvWGpL6dDWNI%2Fimage.png?alt=media\&token=78b23634-889a-4120-b0c8-eb407fa13b48)

**Step 1: Define rule detail** - **Service Name** =test\_build\_run, **Rule tpye**= Rule with an event pattern

![](https://3129222069-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQJ-0VExB6WAovylp1S%2Fuploads%2F3DTO5XbpvZkEDfaNqBgb%2Fimage.png?alt=media\&token=4724198c-e187-44d3-8b07-b97c2b9efb92)

**Step 2: Build event pattern** - **Event source =** other&#x20;

![](https://3129222069-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQJ-0VExB6WAovylp1S%2Fuploads%2FFdlIo8kCZb73pwxzJYa4%2Fimage.png?alt=media\&token=b644d59c-d826-49e2-98a5-b051753cf08b)

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

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

![](https://3129222069-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQJ-0VExB6WAovylp1S%2Fuploads%2F4yY2Hz6J4oYOeDihpRtR%2Fimage.png?alt=media\&token=48750ccb-2851-4bde-a9bb-a408e39b9029)

**Step 3: Select tartget(s)** AWS service → **Lambda function** → **Function** = post\_test\_result

![](https://3129222069-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQJ-0VExB6WAovylp1S%2Fuploads%2F2iMNT2vhcWBCPe8mSfuh%2Fimage.png?alt=media\&token=e2a4993a-4779-4154-a367-1d9b89c6251c)

**Step 4: Configure tags -** optional

![](https://3129222069-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQJ-0VExB6WAovylp1S%2Fuploads%2FOYWIjk8stUzOJQ59XFdj%2Fimage.png?alt=media\&token=d0de4bb0-5425-4907-b385-4627ead4767f)

**Step 5: Review and create -** create rule

![](https://3129222069-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQJ-0VExB6WAovylp1S%2Fuploads%2F243s7KWFDy57hyMnArmk%2Fimage.png?alt=media\&token=07a446d5-a27b-442a-8194-c807cb82de3d)

### 테스트 자동화 시스템 검증

1. 새로운 Git Branch를 생성 후, 어플리케이션을 1 \~ 30까지의 숫자를 맞추는걸로 수정하고 해당 Branch를 CodeCommit에 Push하고 Pull Request 생성
2. CodeCommit 대시보드에서 방금 생성한 Pull request를 선택하고, Activity나 Changes 탭 밑에서 CodeBuild 테스트 결과 확인
3. CodeBuild 테스트 빌드가 성공하도록 소스코드 수정
