23. 09. 05
[CJ Olivenetworks - Cloud Wave] CGV Fast Order 시스템 인프라 구축 2. Terraform / Terraform Cloud 를 활용한 Cloud Infra 구축 자동화
Terraform 을 통한 Cloud Infra 자동화
- IaC(Infrastructure as Code)는 수동 작업 대비 일관성 유지, 재사용성, 자동화 측면 향상.
- 테라폼은 cloudformation, pulumi와 같은 IaC 방법론을 실현하는 도구 중 하나.
- IaC 이전의 Cloud Infra 관리는 웹 콘솔이 주류로 사용.
- 콘솔로도 작업은 가능하지만 대규모 / 반복적 작업을 수행하는 경우 매우 비효율적.
- 테라폼은 cloudformation, pulumi와 같은 IaC 방법론을 실현하는 도구 중 하나.
- 가령 필요에 따라 dev 환경의 생성 및 제거 작업이 반복적으로 필요한 경우
- 해당 dev VPC에는 각 3개의 퍼블릭/프라이빗 서브넷을 갖고, 퍼블릭엔 서비스 확인을 위한 접근용 ALB / 프라이빗엔 WEB, WAS 서버 및 RDS가 구성되어야 하고, 각 ALB와 EC2에 대하여 쉬운 접근을 위해 Route53 도메인을 붙이는 것이 필요 조건.
- 해당 과정을 수동으로 진행한다면 리소스 tag 규칙등의 과정에서 입력 실수로 인해 누락/오입력이 발생하고, 일관성의 훼손 가능성 증가.
- 생성 및 재생성 과정을 일일히 생성하면 시간도 오래 걸리고, 비효율적이다. 그러나 코드로 구성되어, 필요할때마다 복제하고 재생성 한다면 매우 효율적.
작성한 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 설치하기
-
tfenv clone 설치
$ git clone https://github.com/tfutils/tfenv.git ~/.tfenv
-
Terraform 특정 버전 설치
-
Terraform 특정 버전 설치 확인
$ tfenv list
- 특정 버전의 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 구축 영상
목차