Information Security Study
240704 테라폼 개념과 환경설정, 테라폼 기본 사용법 본문
테라폼 개념과 환경설정
코드형 인프라(IaC)
: 콘솔에서 직접 조작해 구축하는 인프라 리소스를 코드로 구축할 수 있도록 도와주는 것
: 컴퓨터에서 읽을 수 있는 코드(실행할 수 있는 문서)로 인프라를 구축한다.
코드형 인프라의 장점
- 코드로 인프라를 배포하고 관리하기에 인적 오류가 줄어든다.
- 동일한 코드로 여러 환경에 동일한 인프라를 배포할 수 있어 환경 간의 일관성을 유지할 수 있다.
- 인프라 설정과 배포 속도가 향상된다.
- 확장 및 복제 작업이 간편하다.
- Git과 같은 버전 관리 시스템에서 인프라 코드를 관리할 수 있어 변경사항을 추적하고 롤백할 수 있다.
- 인프라 변경 이력을 코드로 기록할 수 있다.
- 인프라 코드를 모듈화 하여 재사용 가능한 구성요소로 만들 수 있다.
- 필요하지 않은 리소스를 자동으로 정리하거나 스케일링 비용을 최적화할 수 있다.
- 리소스 사용을 모니터링하고 로깅할 수 있다.
코드형 인프라의 장점
- 도구에 대한 학습이 필요하다.
- 기존 작업에 도입 시 자동화 코드가 추가로 작성되어야 한다.
- 코드형 인프라뿐만 아니라 대상이 되는 클라우드 플랫폼에 대한 이해도 필요하다.
클라우드 인프라를 활용해 일관적인 작업, 유지보수를 용이하게 할 수 있다.
테라폼 코어가 플러그인을 통해 API에 작성된 코드들을 이용해 요청을 넣는다.
테라폼 제공 유형
1) On-premise
2) Hosted SaaS
3) Private Install
On-premise
- On-premise 제공 유형은 조직이 자체적으로 인프라를 보유하고 관리하는 것을 의미한다.
- 모든 하드웨어(서버, 스토리지 등)와 소프트웨어를 조직 내부에서 구축하고 유지보수한다.
- 보안 및 규정 준수 요구사항을 충족하고 외부 인프라 공급자에 의존하지 않고 인프라를 제어할 수 있다.
Hosted SaaS
- Hosted SaaS는 서비스 제공자가 애플리케이션과 관련된 모든 인프라를 호스팅 하고 유지보수하는 유형이다.
- 사용자는 클라우드를 통해 해당 SaaS 소프트웨어에 접근하고 사용할 수 있다.
- 사용자는 소프트웨어의 기능과 업데이트에 대한 업데이트를 신경 쓸 필요가 없다.
- 초기 구축 및 유지보수 비용이 낮을 수 있다.
Private Install
- Private Install은 특정 조직이 자체적으로 소프트웨어를 설치하고 관리하는 유형이다.
- 일반적으로 클라우드나 호스팅 된 서비스가 아니라 조직의 내부 인프라나 데이터 센터에 소프트웨어를 배포하여 사용하는 방식이다.
- 보안 및 커스터마이징 요구사항을 충족하면서도 외부 호스팅에 대한 의존성을 줄일 수 있다.
테라폼 사용 시 주로 수행하는 작업
- 워크플로(Workflows)
- 자산화(Asset Management)
- 표준화(Standardization)
- 프로비저닝 자동화(Provisioning Automation)
워크플로
- 테라폼은 복잡한 인프라 구성을 코드로 작성하여 관리할 수 있어서 워크플로를 효율적으로 관리할 수 있다.
- ex) 개발 환경, 테스트 환경, 운영 환경 간의 일관성 있는 인프라 설정을 구축하고 유지할 수 있다.
자산화 (Asset Management)
- 테라폼은 클라우드 리소스 및 인프라 자원을 코드로 정의하고 문서화할 수 있다. 인
- 프라 자원의 투명성을 제공하며 어떤 리소스가 어디에 배포되어 있는지 명확하게 관리할 수 있다.
- 자산화는 비즈니스의 리소스 사용 및 비용 효율성을 개선하는 역할을 한다.
표준화 (Standardization)
- 테라폼을 사용하면 인프라 구성을 일관된 방식으로 관리할 수 있다.
- 코드로 인프라를 정의함으로써 표준화된 패턴과 가이드라인을 따를 수 있다.
- 인프라의 안정성과 보안성을 향상하는 데 기여한다.
- 여러 클라우드 환경에서 일관성 있는 배포와 관리가 필요한 경우 테라폼을 통해 표준화를 시킬 수 있다.
프로비저닝 자동화 (Provisioning Automation)
- 테라폼은 인프라 자원의 프로비저닝을 자동화하는 데 사용된다.
- 새로운 서버 인스턴스, 네트워크 구성 요소, 데이터베이스 등을 빠르게 배포하고 설정할 수 있다.
- 개발 및 운영 팀이 더 빠르게 새로운 인프라를 구축하고 비즈니스 요구에 신속하게 대응할 수 있다.
테라폼 환경설정
https://developer.hashicorp.com/terraform/install?product_intent=terraform
Install | Terraform | HashiCorp Developer
Explore Terraform product documentation, tutorials, and examples.
developer.hashicorp.com
바이너리 파일을 다운받는다.
압축을 풀어준다.
환경변수 -> 시스템 변수의 Path -> 새로 만들기
로 압축을 풀어놓은 경로를 추가한다.
powershell에서 terraform을 입력했을 때 위와 같이 뜨면 정상적으로 등록된 거다.
vscode에서 테라폼 코드를 쉽게 작성할 수 있게 hcl extentions을 추가한다.
https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html
Install or update to the latest version of the AWS CLI - AWS Command Line Interface
When updating from a previous version, the unzip command prompts to overwrite existing files. To skip these prompts, such as with script automation, use the -u update flag for unzip. This flag automatically updates existing files and creates new ones as ne
docs.aws.amazon.com
aws와 연동하기 위해 위 링크에서 aws cli를 설치한다.
버전 정보가 뜨면 설치가 잘 된 것이다.
설치가 되었으면 테라폼에서 aws를 제어하기 위해 aws cli와 계정을 연동할 것이다.
IAM 대시보드에서 사용자 탭으로 이동한다.
사용자를 생성한다.
실습을 하다 보면 생성, 삭제를 많이 해야 하기 때문에 AdministratorAccess 권한을 줬다.
생성한 뒤 계정명을 눌러 액세스 키를 만든다.
CLI를 선택하고 생성된 액세스 키는 잘 저장해 둔다.
액세스 키 파일에 있는
키와 시크릿 키값을 입력해 준다.
한 계정에 너무 큰 권한을 부여했기 때문에 MFA device를 등록할 것이다.
코드 입력 후 추가해 인증수단을 늘렸다.
그러고 나서 인증되지 않은 유저의 요청을 거부하도록 인라인 정책을 추가할 것이다.
json을 선택하고 기본 권한 구문을 위와 같이 수정했다.
Effect를 Allow에서 Deny로 변경했다.
이제 MFA 인증이 없는 경우 모든 동작, 자원에 대해 거부할 것이다.
정책명 입력 후 등록하면 권한이 2개가 된 것을 확인할 수 있다.
접근하려니 거부한다.
보안 자격 증명 탭에서 식별자를 복사해 위와 같이 입력하면 Credentials 정보가 나온다.
위 정보로 키, 시크릿 키, 토큰 값을 입력하면
접근할 수 있다.
셸을 껐다가 켜면 토큰 발급과 환경변수 입력을 다시 해야 한다.
테라폼 기본 사용법
테라폼은 특정 플랫폼에 프로비저닝을 하기 위해 주로 사용한다.
테라폼 코드는 .tf 확장자를 사용한다.
하단에서 plain text를 HCL로 바꿔 언어를 감지할 수 있도록 한다.
코드 저장 후 powershell이나 터미널을 사용한다.
terraform
명령어로 테라폼 오브젝트를 출력할 수 있다.(사용법)
help 옵션으로 특정 오브젝트에 대한 설명을 볼 수 있다.
init은 테라폼 파일이 있는 폴더를 초기화한다.
테라폼 작업 수행 시 루트 모듈이 필요하다. 이 init 명령으로 루트 모듈을 구성할 수 있다.
terraform plan으로 해당 테라폼 코드 실행 결과를 미리 확인할 수 있지만
init을 하지 않았다면 에러가 난다.
init을 하면
파일이 추가된다.
validate 명령으로 구성 파일의 유효성을 확인할 수 있다.
실습을 위해 3번 라인을 주석처리 하고
filename은 main.tf에서 필수요소이다.
확인하면 에러가 뜬다.
주석 제거 후 다시 확인하면 Success가 뜨는 것을 볼 수 있다.
실행 결과를 json 형태로 보고 싶다면 json 옵션을 입력하면 된다.
terraform plan
현재 작업폴더의 .tf 파일을 실행하면 어떻게 될지 미리 시뮬레이션해 보는 명령어다.
terraform apply
plan으로 나온 결과를 실제로 도출하는 명령어다.
plan 실행 시 위와 같이
생성될 리소스의 왼쪽에 +가 붙는다.
exitcode가 환경 변수로 구성되는 명령어이다.
결과를 숫자로 보여준다.
0은 변경사항 없이 성공, 1은 오류 존재, 2는 변경사항이 있으며 성공
을 의미한다.
결과로 예상되는 코드를 위 변수에 저장한다.
apply 시 yes를 입력해야 수행된다.
폴더를 생성했다.
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.0"
}
}
}
# Configure the AWS Provider
provider "aws" {
region = "리전"
}
# Create a VPC
resource "aws_vpc" "example" {
cidr_block = "대역"
}
작업폴더로 들어가 main.tf를 위와 같이 작성했다.
init 후 폴더구조를 확인하면 새로운 폴더가 생성된 것을 볼 수 있다.
main.tf에서 설정한 provider, resource를 참조해 생성되었다.
aws_vpc 자원이 example이라는 이름으로 추가될 것이라고 뜬다.
apply 후 yes를 입력하면
vpc가 하나 추가된다.
tags로 vpc의 Name을 변경할 것이다.
update가 있다고 뜬다.
변경 내역도 뜬다.
plan만으로는 실행되지 않는다.
apply 하고 yes를 입력하면
Name이 변경되었다.
resource "aws_subnet" "public_subnet1" {
vpc_id = aws_vpc.example.id
cidr_block = "대역"
tags = {
Name = "swu_public_subnet1"
}
}
resource "aws_subnet" "private_subnet1" {
vpc_id = aws_vpc.example.id
cidr_block = "대역"
tags = {
Name = "swu_private_subnet1"
}
}
subnet을 2개와 cidr블록도 추가로 작성했다.
example vpc에 소속된 서브넷 두 개가 생성된다.
vpc_id를 작성하지 않으면 서브넷은 vpc에 소속되지 않는다.
이름이 swu_vpc인 vpc 밑에
서브넷 swu_public_subnet1, swu_private_subnet1이 생긴다.
aws에서 직접 하나하나 요소들을 생성하지 않아도
위처럼 코드로 내부망을 구성할 수 있다.
이렇게 하면 재사용이나 마이그레이션 시 비교적 편리하다.
terraform plan, terraform apply 후 서브넷 탭을 확인하면
서브넷 두 개가 추가되어 있다.
자원 삭제를 하려면 .tf 파일에서 해당 요소를 지우고
terraform plan, apply를 하면 된다.
private subnet1을 지워볼 것이다.
apply 후 서브넷 탭에 들어가면
private_subnet1이 지워져 있다.
테라폼으로 생성한 요소는 이러한 방식으로 관리할 수 있지만
그렇지 않은 요소들은 data_source로 관리해야 한다.
(테라폼은 .git 폴더처럼 로컬에서 작업한 내역만 관리한다.)
실습을 위해 테라폼을 거치지 않고 서브넷을 직접 생성한다.
직접 생성했기 때문에 테라폼은 swu_private_subnet1을 인식하지 못한다.
resource "aws_subnet" "private_subnet1" {
vpc_id = aws_vpc.example.id
cidr_block = "대역"
tags = {
Name = "swu_private_subnet1"
}
}
그런데 만약 main.tf에 지웠던 private_subnet1을 다시 생성한다면
분명 중복자원인데도 불구하고 테라폼은 인식하지 못하고 있기 때문에 생성해 준다고 뜬다. (휴먼에러)
같은 대역(cidr_block)이라면 Name을 변경해도 중복 자원이다.
plan에서는 문제가 없다고 뜨지만 apply를 해보면 이미 사용중인 대역이기 때문에 에러가 뜬다.
aws에만 등록된 자원을 테라폼쪽에 등록하기 위해 위와 같이 작성한다.
data 자원을 설정한다. data명을 resource명과 똑같이 작성하고 서브넷 id 값을 적는다.
이후는 내일부터~~