1
테라폼 사용 환경 만들기 = 명령서버에 테라폼 설치
테라폼으로 서버생성(EC2)
2
https://gasidaseo.notion.site/gasidaseo/CloudNet-Blog-c9dfa44a27ff431dafdd2edacc8a1863
3
총 3시간씩 진행됩니다.
1시간 이론 설명
2시간 실습
4
AWS 환경에서 실습합니다.
AWS 계정 하나 만들어 오세요~
2
4
스터디는 브런치로 진행합니다.
5
테라폼 구성되는 형태 3가지?
On-premise : Terraform . 사용자의 컴퓨트 환경에 오픈소스 바이너리 툴인 테라폼 설치로 사용
Hosted SaaS : Terraform Cloud라고 불린다. SaaS로 제공되는 구성환경으로 하시코프가 관리하는 서버 환경이 제공된다.
Private Install : Terraform Enterprise로 불리는 서버 설치형 구성환경. 기업의 사내 정책에 따라 관리. 외부 네트워크와 격리. 링크
1
사용 환경 설명
사용자 -- 명령서버 -- 명령들 ------- aws api들 --- 서버 생성
2
사전 작업
명령서버 1대를 만들어야 한다.
cloudformation으로 만들거나, 수동으로 ec2 1개를 만든다.
aws console login 하자.
https://console.aws.amazon.com/console/home
4
AWS 클라우드포메이션으로 자동으로 설치하는 법
ec2 keypair 필요
access-key / secret-key 필요
5
아래 클라우드포메이션 파일로 테라폼 명령서버 만들자.
aws cli , 테라폼이 모두 설치가 된다.
6
vpc1개
public subnet 1개
ec2 1개
ec2에 툴 설치
위에서 자동으로 만들었으면 필요 없다.
수동으로 만드는 방법도 가능하다고 알려주는 것이다.
수동으로 만드는법
명령서버 EC2 1대를 만든다.
aws ec2에 로그온하려면 ec2 키가 필요하다.
aws에 리소스 만들라고 명령을 내리려면 access-key, secret-key가 필요하다.
테라폼으로 만들기 위해 테라폼 CLI가 필요하다.
명령를 내리기 위해 AWS CLI로 설치가 필요하다.
EC2 로그인 , 테라폼 수동으로 설치한다.!!
1)
---------------------------
Terraform v1.5.2
on linux_amd64
2)
# tfenv 설치
brew install tfenv
# 설치 가능 버전 리스트 확인
tfenv list-remote
# 테라폼 1.5.1 버전 설치
tfenv install 1.5.1
# 테라폼 1.5.1 버전 사용 설정
tfenv use 1.5.1
# tfenv로 설치한 버전 확인
tfenv list
# 테라폼 버전 정보 확인
terraform version
# 자동완성
terraform -install-autocomplete
## 참고 .zshrc 에 아래 추가됨
cat ~/.zshrc
autoload -U +X bashcompinit && bashcompinit
complete -o nospace -C /usr/local/bin/terraform terraform
# centos terraform install
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://rpm.releases.hashicorp.com/RHEL/hashicorp.repo
sudo yum -y install terraform
yum -y install tree jq git htop go
# jq download
curl -L https://github.com/stedolan/jq/releases/download/jq-1.6/jq-linux64 -o /usr/local/bin/jq
chmod a+x /usr/local/bin/jq
jq -V
(선택) mac 사용자
Vs code에서 확장 프로그램 설치
좌측 [Extentions] 아이콘을 클릭
HashiCorp에서 릴리즈한 HashiCorp HCL 을 검색 후 설치
8)
(권장) 자동저장 설정 : 설정 → 일반적으로 사용되는 설정 ⇒ Files: Auto Save 값을 afterDelay 선택
access-key , secret-key 생성 ?
AWS
access-key , secret-key 생성
(centos 경우)
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install
aws s3 ls
권한이 없으므로 안됨.
권한 부여 ?
aws configure
AWS Access Key ID [None]:
aws s3 ls
aws의 디폴트 vpc로 사용함.
삭제 하지 않았다면 디폴트 VPC는 있습니다.
AWS 콘솔에서 디폴트 vpc 생성가능함.
AWS CLI 로 디폴트 vpc 생성 가능함.
콘솔에서 디폴트 네트워크 생성법 ?
aws 콘솔 로그인
https://console.aws.amazon.com/
VPC > Your VPCs > 오른쪽위 ACTION > CREATE DEFAULT VPC 클릭
3
# 디폴트 vpc 있는지 확인
aws ec2 describe-vpcs --filter 'Name=isDefault,Values=true' | jq
aws ec2 describe-vpcs --filter 'Name=isDefault,Values=true' | jq '.Vpcs[0].VpcId'
# default vpc 없다면 생성
aws ec2 create-default-vpc
aws ec2 describe-vpcs --filter 'Name=isDefault,Values=true' | jq '.Vpcs[0].VpcId'
4
서버 이미지 id로 만듭니다.
aws ec2 describe-images --owners self amazon --query 'Images[*].[ImageId]' --output text
aws ssm get-parameters-by-path --path /aws/service/ami-amazon-linux-latest --query "Parameters[].Value"
ami-0a0064415cdedc552
콘솔상에서도 서버 이미지 id 확인가능
# 별도 [터미널1]
EC2 생성 모니터링
export AWS_PAGER=""
while true; do aws ec2 describe-instances --query "Reservations[*].Instances[*].{PublicIPAdd:PublicIpAddress,InstanceName:Tags[?Key=='Name']|[0].Value,Status:State.Name}" --filters Name=instance-state-name,Values=running --output text ; echo "------------------------------" ; sleep 2; done
cat <<EOT > main.tf
provider "aws" {
region = "ap-northeast-2"
}
resource "aws_instance" "example" {
ami = "ami-0a0064415cdedc552"
instance_type = "t2.micro"
}
EOT
terraform apply -auto-approve
(생성 1분)
또는
Enter a value: yes
모니터링 터미널에서 ec2 생성 확인 ?
cli로 확인
aws ec2 describe-instances --output table
서버 이름을 넣어보자. = 태그 정보로 넣는다.
cat <<EOT > main.tf
provider "aws" {
region = "ap-northeast-2"
}
resource "aws_instance" "example" {
ami = "ami-0a0064415cdedc552"
instance_type = "t2.micro"
tags = {
Name = "t101-study"
}
}
EOT
terraform apply -auto-approve
삭제 ?
terraform destroy -auto-approve
참고
이미지 이름을 몰라도, 데이터 소스로 가져와서 사용할수도 있다.
# 방법1
data "aws_ssm_parameter" "amzn2_latest" {
name = "/aws/service/ami-amazon-linux-latest/amzn2-ami-kernel-5.10-hvm-x86_64-gp2"
}
# 방법2
data "aws_ami" "linux" {
owners = ["amazon"]
most_recent = true
filter {
name = "name"
values = ["amzn2-ami-hvm*"]
}
}
resource "aws_instance" "aaaaaaaa" {
ami = data.aws_ami.amazonlinux2.id
//...
lifecycle {
ignore_changes = [ami]
}
}
# 방법3
data "aws_ami" "ubuntu" {
most_recent = true
filter {
name = "name"
values = ["ubuntu/images/hvm-ssd/ubuntu-*-*-amd64-server-*"]
}
filter {
name = "virtualization-type"
values = ["hvm"]
}
owners = ["099720109477"] # Canonical
}
https://www.andreagrandi.it/2017/08/25/getting-latest-ubuntu-ami-with-terraform/
1
cd
mkdir workspace
cd workspace
[root@myeks2-bastion-EC2 workspace]# vi main.tf
resource "local_file" "abc" {
content = "abc!"
filename = "${path.module}/abc.txt"
}
# abc.txt 파일을 만들자.
# abc.txt 파일 안에 내용에 abc! 를 넣자.
2
vs code 사용하자.
3
시작해보자~
terraform plan
[root@myeks2-bastion-EC2 workspace]# terraform plan
╷
│ Error: Inconsistent dependency lock file
│
│ The following dependency selections recorded in the lock file are inconsistent with the current configuration:
│ - provider registry.terraform.io/hashicorp/local: required by this configuration but no version is selected
│
│ To make the initial dependency selections that will initialize the dependency lock file, run:
│ terraform init
╵
배포하기 전에 계획.
어떤 것을 생성할지 검토해 주는 단계.
실제 반영은 하지 않는다.
설명 중 +는 create이다.
파일과 디렉터리 퍼미션도 기본으로 추가된다.
terraform apply
yes
[root@myeks2-bastion-EC2 workspace]# ls
abc.txt main.tf terraform.tfstate
[root@myeks2-bastion-EC2 workspace]# more abc.txt
abc!
7
실습 2
[root@myeks2-bastion-EC2 workspace]# vi main.tf
resource "local_file" "abc" {
content = "abc!"
filename = "${path.module}/abc.txt"
}
resource "local_file" "dev" {
content = "def!"
filename = "${path.module}/def.txt"
}
8
terraform apply
yes
# def.txt 파일을 만들어 준다.
[root@myeks2-bastion-EC2 workspace]# ls
abc.txt def.txt main.tf terraform.tfstate terraform.tfstate.backup
9
def.txt 파일을 지우도 싶으면 ?
main.tf 에서 코드를 지우면 된다.
[root@myeks2-bastion-EC2 workspace]# more main.tf
resource "local_file" "abc" {
content = "abc!"
filename = "${path.module}/abc.txt"
}
terraform apply
[root@myeks2-bastion-EC2 workspace]# ls
abc.txt main.tf terraform.tfstate terraform.tfstate.backup
11
terraform destroy
yes
모든 개체를 제거하는 명령어이다.
일부 리소스만 제거 하지 않는다.
terraform state list
ls *.txt
12
테라폼 파일을 포맷팅 (정렬)해주는 명령어.
terraform fmt
[root@myeks2-bastion-EC2 workspace]# more main.tf
resource "local_file" "abc" {
content = "abc!"
filename = "${path.module}/abc.txt"
}
[root@myeks2-bastion-EC2 workspace]# terraform fmt
main.tf
[root@myeks2-bastion-EC2 workspace]# more main.tf
resource "local_file" "abc" {
content = "abc!"
filename = "${path.module}/abc.txt"
}
13
테라폼 사용 환경 만들기 = 명령서버에 테라폼 설치
테라폼으로 서버생성(EC2)
https://brunch.co.kr/@topasvga/3345
참고자료
2023 자료 - 몰아 보기
https://brunch.co.kr/@topasvga/3347
참고 서적