CarefreeLife98's Tech Blog
< Build Carefree Life >
23. 09. 05

[CJ Olivenetworks - Cloud Wave] CGV Fast Order 시스템 인프라 구축 2. Terraform / Terraform Cloud 를 활용한 Cloud Infra 구축 자동화

Cloud-Wave
AWS
Terraform

Terraform 을 통한 Cloud Infra 자동화

terraform2_Procdess
사진 출처: Hashicorp

  • IaC(Infrastructure as Code)는 수동 작업 대비 일관성 유지, 재사용성, 자동화 측면 향상.
    • 테라폼은 cloudformation, pulumi와 같은 IaC 방법론을 실현하는 도구 중 하나.
      • IaC 이전의 Cloud Infra 관리는 웹 콘솔이 주류로 사용.
      • 콘솔로도 작업은 가능하지만 대규모 / 반복적 작업을 수행하는 경우 매우 비효율적.
  • 가령 필요에 따라 dev 환경의 생성 및 제거 작업이 반복적으로 필요한 경우
    • 해당 dev VPC에는 각 3개의 퍼블릭/프라이빗 서브넷을 갖고, 퍼블릭엔 서비스 확인을 위한 접근용 ALB / 프라이빗엔 WEB, WAS 서버 및 RDS가 구성되어야 하고, 각 ALB와 EC2에 대하여 쉬운 접근을 위해 Route53 도메인을 붙이는 것이 필요 조건.
    • 해당 과정을 수동으로 진행한다면 리소스 tag 규칙등의 과정에서 입력 실수로 인해 누락/오입력이 발생하고, 일관성의 훼손 가능성 증가.
    • 생성 및 재생성 과정을 일일히 생성하면 시간도 오래 걸리고, 비효율적이다. 그러나 코드로 구성되어, 필요할때마다 복제하고 재생성 한다면 매우 효율적.

terraformCode_Procdess
작성한 Terraform code - main.tf 중 일부분.



Terraform 기본 Command

# 현재 디렉토리 초기화
$ terraform init

# Terraform 이 어떤 작업을 하게 될 지 Dry-Run
$ terraform plan

# 해당 코드를 apply하여 적용하고 Build.
$ terraform apply

# Terraform 으로 구축된 것 삭제
$ terraform destroy

# state file 새로고침
$ terraform refresh

# Terraform output 보기
$ terraform output

# Dot-formatted graph 생성
$ terraform graph



tfenv 를 사용하여 Terraform 설치하기

  1. tfenv clone 설치

    $ git clone https://github.com/tfutils/tfenv.git ~/.tfenv
    
  2. Terraform 특정 버전 설치 tfenv1_Procdess

  3. Terraform 특정 버전 설치 확인

$ tfenv list

tfenv2_Procdess

  1. 특정 버전의 Terraform 사용하기
$ tfenv use (버젼 명시)
$ terraform --version
>    ```
> <img src="/assets/images/CloudWave/project/tfenv3.png" alt="tfenv3_Procdess"><br><br>

5. 특정 버전의 Terraform 삭제하기
>
>    ```bash
>    $ tfenv uninstall (버전 명시)
>    ```
> <img src="/assets/images/CloudWave/project/tfenv4.png" alt="tfenv5_Procdess"><br><br>

<br><br>

# [Terraform Cloud] Terraform 및 Terraform Cloud 사용해보기

- **UI integration**
- **버전 관리 시스템 (VCS)**
- **API Driven Workflows**
- **중앙 관리형**
- **Private Module Registry 제공**
- **Sentinel Policy Ensforcement**
- IAM Policy?
- **Single Sign-on**
- 사용자가 여러 웹 애플리케이션 또는 서비스에 대해 단일 인증을 사용하여 한 번의 로그인으로 여러 서비스에 액세스할 수 있는 인증 메커니즘
- 이는 사용자 경험을 향상시키고 비밀번호 관리의 어려움을 줄이는 것에 도움.
- SSO 시스템은 일반적으로 중앙 인증 서비스를 사용하여 여러 애플리케이션 간의 인증을 처리.
- **Secure API credentials**

<br><br>

<h1>[Terraform Cloud] 시작하기</h1>

<img src="/assets/images/CloudWave/project/tfstart.png" alt="tfstart_Procdess"><br>`terraform 시작하기`<br>

- Terraform Cloud 에서 제공하는 Sample 을 이용해서 시작해보자.

<br><br>

1. Terraform login
>    ```shell
>    $ terraform login
>    ```
>    
>    <img src="/assets/images/CloudWave/project/tflogin.png" alt="tflogin_Procdess"><br>`terraform login`<br><br>
>    <img src="/assets/images/CloudWave/project/tflogin2.png" alt="tflogin2_Procdess"><br>`terraform login 시 자동으로 웹 창으로 이동하게 된다.`<br><br>
>    <img src="/assets/images/CloudWave/project/tflogin3.png" alt="tflogin3_Procdess"><br>`Token 발급 후 로그인이 되는 것을 볼 수 있다.`<br><br>

2. Terraform Sample repository 클론
>    ```bash
>    $ git clone https://github.com/hashicorp/tfc-getting-started.git
>    ```
>
>  - 인프라 자원을 Provisionning 하기 위한 Configuration 파일.
>  - infra 자원은 `fake web service` 사용 (AWS-ec2 와 비슷한 가짜 자원을 생성)<br>
>    [링크: registry.terraform.io/providers/hashicorp/fakewebservices/latest](https://registry.terraform.io/providers/hashicorp/fakewebservices/latest)

3. setup script 실행
>    <img src="/assets/images/CloudWave/project/tfstart2.png" alt="tfstart2_Procdess"><br>작업 시작 전 Local PC에 `jq` 가 설치되어 있는 지 확인 할 것. (없다면 설치) <br>
>
>    ```bash
>    $ cd tfc-getting-started
>    $ ./scripts/setup.sh
>    ```
>
>    - configuration 초기화

<br><br>

# [Terraform Cloud] Example Configuration

1. Workspace
- Name: getting-started
- URL : [https://app.terraform.io/app/example-org-1b7e9c/workspaces/getting-started](https://app.terraform.io/app/example-org-1b7e9c/workspaces/getting-started)<br><br>

2. Terraform init
> <img src="/assets/images/CloudWave/project/tfconf.png" alt="tfconf_Procdess"><br>`Terraform init`<br>

3. Terraform plan
> <img src="/assets/images/CloudWave/project/tfconf2.png" alt="tfconf2_Procdess"><br>`Terraform plan`<br>
> - Terraform Plan 은 Local의 내 맥북에서 init 되었지만, Terraform Cloud에서 실행되고 있음.
>
>> `Terraform Cloud runs Terraform on disposable virtual machines in its own cloud infrastructure.`
>
- 테라폼 클라우드 내 클라우드 환경의 VM에서 테라폼이 실행됨.
>
>> `This 'remote execution' helps provide consistency and visibility for critical provisioning operations.`
>
- 위와 같은 Cloud 환경에서의 원격 실행은 Provisioning 작업에 관해 일관성과 가시성을 제공.
>
>> `It also enables notifications, version control integration, and powerful features like Sentinel policy enforcement and cost estimation (shown in the output above).`
>
- 또한 원격 실행은 알림 및 버전 컨트롤 (VCS) 기능, 보안 및 비용 관리를 수월하게 해줌.

4. Terraform apply
> <img src="/assets/images/CloudWave/project/tfconf3.png" alt="tfconf3_Procdess"><br>`Terraform apply`<br>
>   - Apply 하게 되면 Team&Governance 기능을 사용할 수 있는 30일 무료 체험 organization이 생성됨.<br>
>     → 무료체험 기간이 끝나면 자동으로 Free tier로 변경되니 걱정 안해도 된다.<br><br>
>
> <img src="/assets/images/CloudWave/project/aftertfapply.png" alt="aftertfapply_Procdess"><br>`Terraform apply 후 모습`<br>
>- Terraform Cloud 는 여러 Infrastructure 들을 directory 대신 workspace로 관리함.
>  - 링크 : [https://app.terraform.io/app/example-org-1b7e9c/workspaces/getting-started](https://app.terraform.io/app/example-org-1b7e9c/workspaces/getting-started)
>  <br><br>
>  - **Remote State Management**
>    - workspace 간의 output 공유 가능함.
>    - 다른 workspace 에서 'terraform_remote_state' data source 를 참조 가능
>    - 생성된 example configuration 에 관해 더 알고 싶다면 :
>      - https://app.terraform.io/fake-web-services

5. Next Steps:
>  - [main.tf](http://main.tf) 파일 수정을 통한 Server 추가
>
>      ```bash
>      resource "fakewebservices_server" "server-3" {
>        name = "Server 3"
>        type = "t2.macro"
>      }
>      
>      resource "fakewebservices_server" "server-4" {
>        name = "Server 4"
>        type = "t2.macro"
>      }
>      ```
>
>    - 위 코드를 [main.tf](http://main.tf) 파일에 추가하여 추가적인 서버 생성 가능.
>    - `terraform apply` 를 통해 적용한 후 확인하기.
>
>- 실제 Cloud 환경에서 실행하기
>  - Workspace 의 variables 메뉴에서 해당 Cloud Service provider 에 관한 Credentials 로 변경.
>  - `terraform apply` 하여 적용.

<br><br>

# [Terraform Cloud] GIT 연동하기

> <img src="/assets/images/CloudWave/project/tfvcs.png" alt="tfvcs_Procdess"><br>`Terraform Cloud Git 연동하기`<br>
> <img src="/assets/images/CloudWave/project/tfvcs2.png" alt="tfvcs2_Procdess"><br>`Terraform Cloud Git 연동하기`<br>
>- Version Control 탭에서 설정.
>  - Terraform working directory 를 설정하여 API를 날릴 git repository를 정할 수 있다.
>    - 설정하지 않으면 Terraform Cloud 의 default working directory 로 설정됨.
>    - 여러 Infra 환경이 존재 할 수 있기 때문에. 따로 설정해주는 것이 좋아 보임.
>  - GIT에서 코드 변동이 생기면 Trigger를 통해 자동으로 Terraform Cloud에서 실행할 수 있다.
>    - Trigger의 조건
>      - 항상 실행
>      - GIT repo 내 특정 directory 변경 (ex. /modules) 되면 실행
>      - GIT tag 반영 시 실행

<br><br>

# [Terraform Cloud] VCS 연동 후 CI / CD 환경에서 Cloud Infra 구축하기

## 1. Terraform Cloud 가입 및 Organization 참가 / 생성

1. Terraform Cloud 가입
2. Organization 참가 / 생성
3. VCS Workflow 옵션으로 Workspace 생성
4. Github Repository 연동

## 2. Workspace 설정 및 Provider Credential Variable 추가

## Workspace → Settings → Version Control 이동

<img src="/assets/images/CloudWave/project/tfc1.png" alt="tfc1_Procdess"><br>
<img src="/assets/images/CloudWave/project/tfc2.png" alt="tfc2_Procdess"><br><br>

## Terraform Working Directory

<img src="/assets/images/CloudWave/project/tfc3.png" alt="tfc3_Procdess"><br>
- TFC가 현재 Workspace와 연동된 VCS에서 WebHook 하여 수정/추가 된 Terraform Code를 수행할 경로를 지정.
- VCS Repository 에서 테라폼 코드가 존재하는 경로를 명시 (Git)

<br><br>

## Variables 설정 (현재 Provider : AWS)

<img src="/assets/images/CloudWave/project/tfc4.png" alt="tfc4_Procdess"><br>
**AWS_ACCESS_KEY_ID 및 AWS_SECRET_ACCESS_KEY 추가**
- Git에 Push 한 Terraform Code - `main.tf` 및 `variables.tf` 에 임의로 지정된 AWS_ACCESS_KEY, AWS_SECRET_KEY 변수를 TFC 에서 Hook 해오며 TFC에 위 사진처럼 저장되어 있는 Variable 로 Overwrite 해준 후 해당 AWS Credentials / TFC의 VM을 사용해 개발자의 AWS 계정에 접근, terraform code를 사용해 배포해준다.
- `주의 : Value 값은 String 이므로 “ ” 안에 포함해줄것.`
- Variables 설정 옵션
- Terraform Code에 Overwrite할 용도이기 때문에 `HCL` 선택.
- Credential 에 관한 정보이므로 `Sensitive` 옵션 선택하여 암호화 보관.

<br><br>

## 3. [CI] Local 에서 Terraform Code 개발 및 Commit / Push

<img src="/assets/images/CloudWave/project/tfc5.png" alt="tfc5_Procdess"><br>
<img src="/assets/images/CloudWave/project/tfc6.png" alt="tfc6_Procdess"><br>
- Terraform 코드 개발 후 VCS(Git) 에 Push 하게 되면 위처럼 자동으로 TFC가 해당 Github repository를 web hook 하여 TFC의 Variable에 저장된 AWS Credential을 Overwrite하고, 계정에 접근하여 Terraform 코드에 기반해 자동 Infra 구축 및 배포를 해주게 된다.

<br><br>

## 4. Terraform Destroy

<img src="/assets/images/CloudWave/project/tfc7.png" alt="tfc7_Procdess"><br>
- 위 사진처럼 Local 에서 terraform destory 는 먹히지 않는다.
- VCS Workflow 로서만 추가 / 수정 / 삭제 가 이루어져야 각 작업에 대해 혼란이 생기지 않으므로 막아둔 것으로 보인다.

<br><br>

<img src="/assets/images/CloudWave/project/tfc8.png" alt="tfc8_Procdess"><br>
- TFC의 Workspace → Settings 에서 Terraform Destroy가 가능함. (유저 권한에 따라서)

<br><br>

# [Terraform Cloud] 실제 프로젝트 Cloud Infra 구축 영상


<iframe width="560" height="315" src="https://www.youtube.com/embed/PIq4U9E6PfM" frameborder="0" allowfullscreen></iframe>



**[CJ Olivenetworks - Cloud Wave 1기] 활동 중 진행한 팀 프로젝트입니다.** <br>
**무단 복제 및 게시는 삼가주시기 바랍니다.** <br>



<br><br>



### Task Lists

>

- [x] Terraform 을 통한 Cloud Infra 자동화
- [x] Terraform 기본 Command
- [x] tfenv 를 사용하여 Terraform 설치하기
- [x] [Terraform Cloud] Terraform 및 Terraform Cloud 사용해보기
- [x] [Terraform Cloud] Example Configuration
- [x] [Terraform Cloud] GIT 연동하기
- [x] [Terraform Cloud] VCS 연동 후 CI / CD 환경에서 Cloud Infra 구축하기
- [x] [Terraform Cloud] 실제 프로젝트 Cloud Infra 구축 영상
목차