

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# AWS CodePipeline을 사용하여 Terraform 구성을 검증하는 CI/CD 파이프라인 생성
<a name="create-a-ci-cd-pipeline-to-validate-terraform-configurations-by-using-aws-codepipeline"></a>

*Aromal Raj Jayarajan, Vijesh Vijayakumaran Nair, Amazon Web Services*

## 요약
<a name="create-a-ci-cd-pipeline-to-validate-terraform-configurations-by-using-aws-codepipeline-summary"></a>

이 패턴은 AWS CodePipeline에서 배포한 지속적 통합 및 지속적 전달(CI/CD) 파이프라인을 사용하여 HashiCorp Terraform 구성을 테스트하는 방법을 보여줍니다.

Terraform은 코드를 사용하여 클라우드 인프라 및 리소스를 프로비저닝하고 관리하는 데 도움이 되는 명령줄 인터페이스 애플리케이션입니다. 이 패턴에서 제공하는 솔루션은 5가지 [CodePipeline 단계](https://docs.aws.amazon.com/codepipeline/latest/userguide/concepts.html#concepts-stages)를 실행하여 Terraform 구성의 무결성을 검증하는 데 도움이 되는 CI/CD 파이프라인을 생성합니다.

1. `"checkout"`은 테스트 중인 Terraform 구성을 AWS CodeCommit 리포지토리에서 가져옵니다.

1. `"validate"`는 [tfsec](https://github.com/aquasecurity/tfsec), [TFLint](https://github.com/terraform-linters/tflint), [checkov](https://www.checkov.io/)를 비롯한 코드형 인프라(IaC) 검증 도구를 실행합니다. 또한 스테이지는 `terraform validate` 및 `terraform fmt`와 같은 Terraform IAc 유효성 검사 명령어를 실행합니다.

1. `"plan"`은 Terraform 구성이 적용된 경우 인프라에 어떤 변경 사항이 적용되는지를 보여 줍니다.

1. `"apply"`는 생성된 계획을 사용하여 테스트 환경에 필요한 인프라를 프로비저닝합니다.

1. `"destroy"`는 `"apply"`단계에서 생성된 테스트 인프라를 제거합니다.

## 사전 조건 및 제한 사항
<a name="create-a-ci-cd-pipeline-to-validate-terraform-configurations-by-using-aws-codepipeline-prereqs"></a>

**사전 조건 **
+ 활성 상태의 AWS 계정
+ AWS Command Line Interface(AWS CLI), [설치](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html) 및 [구성됨](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-configure.html)
+ 로컬 머신에 설치 및 구성된 [Git](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git)
+ 로컬 머신에 설치 및 구성된 [Terraform](https://learn.hashicorp.com/collections/terraform/aws-get-started?utm_source=WEBSITE&utm_medium=WEB_IO&utm_offer=ARTICLE_PAGE&utm_content=DOCS)

**제한 사항 **
+ 이 패턴의 접근 방식은 AWS CodePipeline을 하나의 AWS 계정과 AWS 리전에만 배포합니다. 다중 계정 및 다중 리전 배포에는 구성을 변경해야 합니다.
+ 이 패턴이 제공하는 AWS Identity 및 Access Management(IAM) 역할(**codePipeline\$1iam\$1role**)은 최소 권한 원칙을 따릅니다. 파이프라인이 생성해야 하는 특정 리소스를 기반으로 이 IAM 역할의 권한을 업데이트해야 합니다.** **

**제품 버전**
+ AWS CLI버전 2.9.15 이상
+ Terraform 버전 1.3.7 이상

## 아키텍처
<a name="create-a-ci-cd-pipeline-to-validate-terraform-configurations-by-using-aws-codepipeline-architecture"></a>

**대상 기술 스택**
+ AWS CodePipeline
+ AWS CodeBuild
+ AWS CodeCommit
+ AWS IAM
+ Amazon Simple Storage Service(Amazon S3)
+ AWS Key Management Service (AWS KMS)
+ Terraform

**대상 아키텍처**

다음 다이어그램은 CodePipeline에서 Terraform 구성을 테스트하기 위한 예제 CI/CD 파이프라인 워크플로를 보여줍니다.

![\[AWS CI/CD 파이프라인을 사용하여 Terraform 구성을 테스트하는 아키텍처입니다.\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/images/pattern-img/4df7b1f8-8eef-4d85-a971-a7f158be9691/images/90b931c8-e745-4b52-92de-a367fb0f1f51.png)


이 다이어그램은 다음 워크플로를 보여줍니다.

1. CodePipeline에서 AWS 사용자는 AWS CLI에서 `terraform apply` 명령을 실행하여 Terraform 계획에 제안된 작업을 시작합니다.

1. AWS CodePipeline은 CodeCommit, CodeBuild, AWS KMS 및 Amazon S3에 액세스하는 데 필요한 정책을 포함하는 IAM 서비스 역할을 맡습니다.

1. CodePipeline은 `"checkout"` 파이프라인 단계를 실행하여 테스트를 위해 AWS CodeCommit 리포지토리에서 Terraform 구성을 가져옵니다.

1. CodePipeline은 CodeBuild 프로젝트에서 IAC 유효성 검사 도구를 실행하고 Terraform IAC 유효성 검사 명령을 실행하여 Terraform 구성을 테스트하는 `"validate"` 단계를 실행합니다.

1. CodePipeline은 Terraform 구성을 기반으로 CodeBuild 프로젝트에서 계획을 생성하는 `"plan"` 단계를 실행합니다. AWS 사용자는 변경 사항을 테스트 환경에 적용하기 전에 이 계획을 검토할 수 있습니다.

1. Code Pipeline은 CodeBuild 프로젝트를 사용하여 테스트 환경에 필요한 인프라를 프로비저닝함으로써 계획을 구현하는 `"apply"` 단계를 실행합니다.

1. CodePipeline은 CodeBuild를 사용하여 `"apply"` 단계 중에 생성된 테스트 인프라를 제거하는 `"destroy"` 단계를 실행합니다.

1. Amazon S3 버킷은 파이프라인 아티팩트를 저장하며, 이 아티팩트는 AWS KMS [고객 관리형 키](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk)를 사용하여 암호화되고 복호화됩니다.

## 도구
<a name="create-a-ci-cd-pipeline-to-validate-terraform-configurations-by-using-aws-codepipeline-tools"></a>

**도구**

*서비스*
+ [AWS CodePipeline](https://docs.aws.amazon.com/codepipeline/latest/userguide/welcome.html)은 소프트웨어 릴리스의 여러 단계를 신속하게 모델링하고 구성하고 소프트웨어 변경 내용을 지속적으로 릴리스하는 데 필요한 단계를 자동화합니다.
+ [AWS CodeBuild](https://docs.aws.amazon.com/codebuild/latest/userguide/welcome.html)는 소스 코드를 컴파일하고 유닛 테스트를 실행하며 배포할 준비가 완료된 아티팩트를 생성하는 완전 관리형 빌드 서비스입니다.
+ [AWS CodeCommit](https://docs.aws.amazon.com/codecommit/latest/userguide/welcome.html)은 나만의 소스 제어 시스템을 관리할 필요 없이 Git 리포지토리를 비공개로 저장하고 관리할 수 있는 버전 제어 서비스입니다.
+ [AWS Identity and Access Management(IAM)](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html)는 사용자에 대한 인증 및 권한 부여를 제어함으로써 AWS 리소스에 대한 액세스를 안전하게 관리할 수 있습니다.
+ [AWS Key Management Service(AWS KMS)](https://docs.aws.amazon.com/kms/latest/developerguide/overview.html)를 사용하면 암호화 키를 생성하고 제어하여 데이터를 보호할 수 있습니다.
+ [Amazon Simple Storage Service(S3)](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html)는 원하는 양의 데이터를 저장, 보호 및 검색하는 데 도움이 되는 클라우드 기반 객체 스토리지 서비스입니다.

*기타 서비스*
+ [HashiCorp Terraform](https://www.terraform.io/docs)은 코드를 사용하여 클라우드 인프라 및 리소스를 프로비저닝하고 관리하는 데 도움이 되는 명령줄 인터페이스 애플리케이션입니다.

**코드**

이 패턴의 코드는 [aws-codepipeline-terraform-cicdsamples](https://github.com/aws-samples/aws-codepipeline-terraform-cicd-samples) 리포지토리에서 사용할 수 있습니다. 리포지토리에는 이 패턴에 설명된 대상 아키텍처를 생성하는 데 필요한 Terraform 구성이 포함되어 있습니다.

## 에픽
<a name="create-a-ci-cd-pipeline-to-validate-terraform-configurations-by-using-aws-codepipeline-epics"></a>

### 솔루션 구성 요소 제공
<a name="provision-the-solution-components"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| GitHub 리포지토리를 복제합니다. | 터미널 창에 다음 명령을 실행하여 GitHub [aws-codepipeline-terraform-cicdsamples](https://github.com/aws-samples/aws-codepipeline-terraform-cicd-samples) 리포지토리를 복제합니다.<pre>git clone https://github.com/aws-samples/aws-codepipeline-terraform-cicd-samples.git</pre>자세한 내용은 GitHub 설명서의 [리포지토리 복제](https://docs.github.com/en/repositories/creating-and-managing-repositories/cloning-a-repository)를 참조하세요. | DevOps 엔지니어 | 
| Terraform 변수 정의 파일을 생성합니다. | 사용 사례 요구 사항에 따라 `terraform.tfvars` 파일을 생성합니다. 복제된 리포지토리에 있는 `examples/terraform.tfvars` 파일의 변수를 업데이트할 수 있습니다.자세한 내용은 Terraform 설명서의 [루트 모듈 변수에 값 할당](https://developer.hashicorp.com/terraform/language/values/variables#assigning-values-to-root-module-variables)을 참조하세요.리포지토리의 파일에는 필수 변수에 대한 자세한 정보가 포함되어 있습니다. | DevOps 엔지니어 | 
| AWS를 Terraform 공급자로 구성합니다. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/create-a-ci-cd-pipeline-to-validate-terraform-configurations-by-using-aws-codepipeline.html)자세한 내용은 Terraform 설명서의 [AWS 공급자](https://registry.terraform.io/providers/hashicorp/aws/latest/docs)를 참조하세요. | DevOps 엔지니어 | 
| Amazon S3 복제 버킷을 생성하기 위한 Terraform 공급자 구성을 업데이트합니다. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/create-a-ci-cd-pipeline-to-validate-terraform-configurations-by-using-aws-codepipeline.html)S3 복제를 활성화하면 Amazon S3 버킷 전체에 걸쳐 객체를 비동기식으로 자동 복사할 수 있습니다. | DevOps 엔지니어 | 
| Terraform 구성을 초기화합니다. | Terraform 구성 파일이 포함된 작업 디렉토리를 초기화하려면 복제된 리포지토리의 루트 폴더에서 다음 명령을 실행하세요.<pre>terraform init</pre> | DevOps 엔지니어 | 
| Terraform 플랜을 생성합니다. | Terraform 계획을 생성하려면 복제된 리포지토리의 루트 폴더에서 다음 명령을 실행하세요.<pre>terraform plan --var-file=terraform.tfvars -out=tfplan</pre>Terraform은 구성 파일을 평가하여 선언된 리소스의 목표 상태를 결정합니다. 그런 다음 목표 상태를 현재 상태와 비교하고 계획을 구성합니다. | DevOps 엔지니어 | 
| Terraform 계획을 검증합니다. | Terraform 계획을 검토하고 대상 AWS 계정에 필요한 아키텍처가 구성되어 있는지 확인합니다. | DevOps 엔지니어 | 
| 솔루션을 배포합니다. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/create-a-ci-cd-pipeline-to-validate-terraform-configurations-by-using-aws-codepipeline.html)Terraform은 구성 파일에 선언된 목표 상태를 달성하기 위해 인프라를 생성, 업데이트 또는 파괴합니다. | DevOps 엔지니어 | 

### 파이프라인을 실행하여 Terraform 구성 검증
<a name="validate-terraform-configurations-by-running-the-pipeline"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| 소스 코드 리포지토리를 설정합니다. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/create-a-ci-cd-pipeline-to-validate-terraform-configurations-by-using-aws-codepipeline.html) | DevOps 엔지니어 | 
| 파이프라인 단계를 검증합니다. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/create-a-ci-cd-pipeline-to-validate-terraform-configurations-by-using-aws-codepipeline.html)자세한 내용은 *AWS CodePipeline 사용 설명서*의 [파이프라인 세부 정보 및 기록 보기(콘솔)](https://docs.aws.amazon.com/codepipeline/latest/userguide/pipelines-view-console.html)를 참조하세요.소스 리포지토리의 메인 브랜치에 변경 사항이 커밋되면 테스트 파이프라인이 자동으로 활성화됩니다. | DevOps 엔지니어 | 
| 보고서 출력을 검증합니다. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/create-a-ci-cd-pipeline-to-validate-terraform-configurations-by-using-aws-codepipeline.html)`<project_name>-validate` CodeBuild 프로젝트는 `"validate"` 단계 중에 코드에 대한 취약성 보고서를 생성합니다. | DevOps 엔지니어 | 

### 리소스 정리
<a name="clean-up-your-resources"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| 파이프라인 및 관련 리소스를 정리합니다. | AWS 계정에서 테스트 리소스를 삭제하려면 복제된 리포지토리의 루트 폴더에서 다음 명령을 실행하세요.<pre>terraform destroy --var-file=terraform.tfvars</pre> | DevOps 엔지니어 | 

## 문제 해결
<a name="create-a-ci-cd-pipeline-to-validate-terraform-configurations-by-using-aws-codepipeline-troubleshooting"></a>


| 문제 | Solution | 
| --- | --- | 
| `"apply"` 단계 중에 **액세스 거부** 오류가 발생합니다. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/create-a-ci-cd-pipeline-to-validate-terraform-configurations-by-using-aws-codepipeline.html) | 

## 관련 리소스
<a name="create-a-ci-cd-pipeline-to-validate-terraform-configurations-by-using-aws-codepipeline-resources"></a>
+ [모듈 블록](https://developer.hashicorp.com/terraform/language/modules/syntax)(Terraform 설명서)
+ [CI/CD를 사용하여 Terraform으로 AWS 보안 서비스를 배포하고 구성하는 방법](https://aws.amazon.com/blogs/security/how-use-ci-cd-deploy-configure-aws-security-services-terraform/)(AWS Blog 게시물)
+ [서비스 연결 역할 사용](https://docs.aws.amazon.com/IAM/latest/UserGuide/using-service-linked-roles.html)(IAM 설명서)
+ [create-pipeline](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/codepipeline/create-pipeline.html)(AWS CLI 설명서)
+ [Amazon S3 for CodePipeline에 저장된 아티팩트에 대한 서버 측 암호화 구성](https://docs.aws.amazon.com/codepipeline/latest/userguide/S3-artifact-encryption.html)(AWS CodePipeline 설명서)
+ [AWS CodeBuild 할당량](https://docs.aws.amazon.com/codebuild/latest/userguide/limits.html)(AWS CodeBuild 설명서)
+ [AWS CodePipeline의 데이터 보호](https://docs.aws.amazon.com/codepipeline/latest/userguide/data-protection.html)(AWS CodePipeline 설명서)

## 추가 정보
<a name="create-a-ci-cd-pipeline-to-validate-terraform-configurations-by-using-aws-codepipeline-additional"></a>

**Terraform 모듈 사용자 지정**

다음 사항은 이 패턴에 사용되는 사용자 지정 Terraform 모듈 목록입니다.
+ `codebuild_terraform`은 파이프라인의 각 단계를 구성하는 CodeBuild 프로젝트를 만듭니다.
+ `codecommit_infrastructure_source_repo`는 소스 CodeCommit 리포지토리를 캡처하고 만듭니다.
+ `codepipeline_iam_role`은 파이프라인에 필요한 IAM 역할을 생성합니다.
+ `codepipeline_kms`는 Amazon S3 객체 암호화 및 복호화에 필요한 AWS KMS 키를 생성합니다.
+ `codepipeline_terraform`은 소스 CodeCommit 리포지토리에 대한 테스트 파이프라인을 생성합다.
+ `s3_artifacts_bucket`은 Amazon S3 버킷을 생성하여 파이프라인 아티팩트를 관리합니다.

**빌드 사양 파일**

다음 사항은 이 패턴이 각 파이프라인 단계를 실행하는 데 사용하는 빌드 사양(buildspec) 파일 목록입니다.
+ `buildspec_validate.yml`은 `"validate"` 단계를 실행합니다.
+ `buildspec_plan.yml`은 `"plan"` 단계를 실행합니다.
+ `buildspec_apply.yml`은 `"apply"` 단계를 실행합니다.
+ `buildspec_destroy.yml`은 `"destroy"` 단계를 실행합니다.

*빌드 사양 파일 변수*

각 buildspec 파일은 다음 변수를 사용하여 다양한 빌드별 설정을 활성화합니다.


| 
| 
| 변수 | 기본값  | 설명 | 
| --- |--- |--- |
| `CODE_SRC_DIR` | "." | 소스 CodeCommit 디렉터리 정의 | 
| `TF_VERSION` | "1.3.7" | 빌드 환경을 위한 Terraform 버전 정의 | 

`buildspec_validate.yml` 파일은 또한 다음과 같은 변수를 지원하여 다양한 빌드별 설정을 활성화합니다.


| 
| 
| 변수 | 기본값  | 설명 | 
| --- |--- |--- |
| `SCRIPT_DIR` | "./templates/scripts" | 스크립트 디렉터리 정의 | 
| `ENVIRONMENT` | "dev" | 환경 이름 정의 | 
| `SKIPVALIDATIONFAILURE` | "Y" | 실패 시 검증 생략 | 
| `ENABLE_TFVALIDATE` | "Y" | Terraform 검증 활성화  | 
| `ENABLE_TFFORMAT` | "Y" | Terraform 형식 활성화 | 
| `ENABLE_TFCHECKOV` | "Y" | checkov 스캔 활성화 | 
| `ENABLE_TFSEC` | "Y" | tfsec 스캔 활성화 | 
| `TFSEC_VERSION` | “v1.28.1" | tfsec 버전 정의 | 