ad-hoc이란
- 라틴어, 특별한 이유를 위해
- CLI에서 명령어로 작업을 하는 것을 의미한다.
- 클릭으로 만드는것이 더욱 간편하지만, 코드를 복사-> 붙혀넣기로 똑같은 작업을 반복할 수 있어서, 클릭보다 편한점이 있었다.
특이사항
- 각 서비스의 ID를 변수로 만들어서 사용했다.
- 처음 생성한 VPC부터 서브넷, 인터넷게이트웨이, 보안그룹, 인스턴스등. 각각의 ID를 변수로 저장해서 만들고, Attach하고, 삭제할때도 사용했다.
- Azure Resource Manager, GCP Deployment Manager
1. Resource (생성)
- AWS 인프라의 실질적인 리소스 생성하는 섹션.
- EC2인스턴스, S3, ELB등, 클라우드 포메이션을 이용해 AWS 웹 콘솔에서 실행하는 것으로, 거의 모든 리소스 유형을 생성할 수 있다.
- 그러나 신규 또는 최첨단의 AWS 리소스는 즉시 제공되지 않는 경우가 종종 있다.
- 리소스에는 기본 반환값이 있다.
- Ref를 이용해 이 반환값을 얻어올 수 있고, 템플릿의 다른 위치에 사용할 수 있다.
- 예를들어 AWS::EC2::VPC 리소스 유형은 기본 반환값을 가지고 있고 이 값은 VPC의 Id이다.
2. Parameters(입력)
- 명령줄 도구에 입력하는 매개변수와 동일하게 스택을 만들거나, 업데이트할 때 정의하는 입력값
- 파라미터는 템플릿의 변경 없이도 스택을 커스터마이즈 할 수 있게 한다.
- 예를 들어 ELB의 퍼블릭 URL이나 EC2의 퍼블릭 IP를 출력할 수 있다.
3. Output(출력)
- 스택이 완료된 후에 결과물을 출력하려고 할때 유용합니다.
- 예를 들어 ELB의 퍼블릭 URL이나 EC2의 퍼블릭 IP를 출력할 수 있습니다.
4. Mapping(지정)
- 리전의 특화된 템플릿에서 어떠한 요소를 참조할 때 필요합니다.
- 예를 들어 템플릿에 EC2 AMI ID에 대한 매핑을 지정하는 것입니다.
- AMI ID가 리전에 특화된 리소스이기 때문에 유효한 AMI ID를 리전별로 지정하려고 할때 사용합니다.
- Mapping으로 각 나라의 특화된리소스, AMI와 같이 각 리전별로 다른 ID를 가지는 정보를 Mapping으로 지정하고, 각 리소스마다 다른 ID를 Parameters로 입력받는 식으로 CloudFormation을 이용하면 운영진이 범 국가적으로 배포를 진행할 수 있다.
AWSTemplateFormatVersion: 2010-09-09 Resources: # field: value 형식으로 작성된 yaml이다. VPC: # 이곳은 변경이 가능한 부분이다. Type: AWS::EC2::VPC # AWS안의 EC2안의 VPC를 생성한다. Properties: # 이부분은 변경이 불가능한 부분이다. CidrBlock: 192.168.0.0/16 EnableDnsSupport: true EnableDnsHostnames: true InstanceTenancy: default # 인스턴스 사용자는 디폴드로 해준다. Tags: - Key: Name # 이름은 NEW-PC로 만들 것이다. Value: VPC SubnetA: # SubnetA여기도 변경할 수 있다. Type: AWS::EC2::Subnet Properties: AvailabilityZone: ap-northeast-2a VpcId: !Ref VPC # !Ref는 참조한다는 뜻이다. # 즉 위에서 VPC라는 이름으로 만들면서 VPC변수 안에 생성된 VPC의 ID를 반환되었다. # 그 VPC ID를 참조한다는 뜻이다. CidrBlock: 192.168.0.0/20 MapPublicIpOnLaunch: true # 퍼블릭IP 자동할당 할성화 Tags: - Key: Name Value: NEW-PUBLIC-SUBNET-2A SubnetB: Type: AWS::EC2::Subnet Properties: AvailabilityZone: ap-northeast-2b VpcId: !Ref VPC CidrBlock: 192.168.16.0/20 MapPublicIpOnLaunch: true Tags: - Key: Name Value: NEW-PUBLIC-SUBNET-2B SubnetC: Type: AWS::EC2::Subnet Properties: AvailabilityZone: ap-northeast-2c VpcId: !Ref VPC CidrBlock: 192.168.32.0/20 MapPublicIpOnLaunch: true Tags: - Key: Name Value: NEW-PUBLIC-SUBNET-2C SubnetD: Type: AWS::EC2::Subnet Properties: AvailabilityZone: ap-northeast-2d VpcId: !Ref VPC CidrBlock: 192.168.48.0/20 MapPublicIpOnLaunch: true Tags: - Key: Name Value: NEW-PUBLIC-SUBNET-2D InternetGateway: # 인터넷게이트웨이의 설정 변수이름을 똑같이 InternetGateway로 준다. 이렇게하면 더 알기 쉽게 ID를 상ㅇ할 수 있다. Type: AWS::EC2::InternetGateway # 인터넷 게이트웨이를 생성한다. Properties: Tags: - Key: Name Value: NEW-IGW VPCGatewayAttachment: # VPC와 인터넷게이트웨이를 연결해준다. Type: AWS::EC2::VPCGatewayAttachment Properties: VpcId: !Ref VPC # VPC의 ID를 가져온다. InternetGatewayId: !Ref InternetGateway # IGW의 ID를 가져온다. RouteTableA: # 라우팅테이블을 생성한다. Type: AWS::EC2::RouteTable # 똑같이 AWS-> EC2-> Routetable에 존재한다. Properties: # VPC와 연결해준다. VpcId: !Ref VPC Tags: - Key: Name Value: NEW-PUBLIC-RTB InternetRoute: # 라우팅 정ㅂ를 세팅한다. Type: AWS::EC2::Route DependsOn: InternetGateway # DependsOn : Internet Gateway가 만들어진 후에 생성되야 한다. 즉 선 작업을 선언해주는 것이다. Properties: DestinationCidrBlock: 0.0.0.0/0 #0.0.0.0/0으로 대상으로 GatewayId: !Ref InternetGateway # 인터넷 게이트웨이와 연결 RouteTableId: !Ref RouteTableA #라우팅테이블 A에 연결 SubnetARouteTableAssociation: # 방금 생성한 라우팅테이블을 서브넷에 Attach(Association) Type: AWS::EC2::SubnetRouteTableAssociation Properties: # RouteTableA에 SubetA 연결 RouteTableId: !Ref RouteTableA # 각 서브넷별로 연결해준다. SubnetId: !Ref SubnetA SubnetBRouteTableAssociation: Type: AWS::EC2::SubnetRouteTableAssociation Properties: RouteTableId: !Ref RouteTableA SubnetId: !Ref SubnetB SubnetCRouteTableAssociation: Type: AWS::EC2::SubnetRouteTableAssociation Properties: RouteTableId: !Ref RouteTableA SubnetId: !Ref SubnetC SubnetDRouteTableAssociation: Type: AWS::EC2::SubnetRouteTableAssociation Properties: RouteTableId: !Ref RouteTableA SubnetId: !Ref SubnetD
살펴보기
스택 생성하기
1단계 템플릿 지정
- 스택을 생성한다.
- 우리가 메모장으로 만든 new-vpc.yaml파일로 업로드할 것이기 때문에 준비된 템플릿으로 준비해준다.
- Designer는 아이콘들을 꺼내서 그림(구성도)를 그려서 생성해주는 기능이다.
- S3에서 템플릿을 사용할 수 있다면, 아래 템플릿 URL을 입력해준다.
- 그러나 만약 우리가 yaml파일을 올리면 자동으로 S3버킷이 생성되어 업로드가 된다.
- 그래서 우리도 모르는 S3버킷이 생성될 것이다.
- 이렇게 생성되었다.
2단계 스택 세부 정보 지정
- 스택의 이름을 넣어준다.
- NEW-VPC_STACK
3단계 스택 옵션 구성
- 스택 옵션을 구성할 수 있다.
- 이번에는 그냥 기본값을 쓰기로 한다.
4단계 검토
- 스택을 검토해주고, 생성버튼을 눌러준다.
결과보기
- CREATE_IN_PROGRESS 현재 작업중이다.
- 새로고침하니 작업 리스트가 많이 늘어났다.
- VPC에서도 NEW-VPC가 생겼다. (그러나 어제걸 안지웠는지 2개가됬다.)
- 위 VPC에서 EC2코드를 넣어 한번에 만들 수 있다.
- 그러나, EC2구성 코드가 매우 중요하기 때문에 따로 분리해서 해본다.
- CloudFormation에서 EC2를 만들면서, 마지막에 Output으로 어떠한 인스턴스의 정보를 추출할 수 있다.
- 예를들어 생성된 EC2의 퍼블릭 IPv4주소를 output으로 받아서 그 주소로 웹페이지에서 테스트해볼 수 있다.
- 또 Mapping(지정)으로 어떤 리전에 특화된 템플릿에서 요소를 참조할때 지정할 수 잇다.
- 예를들어, 템플릿에 EC2 AMI ID에 대한 매핑을 지정할 수 있다.
- AMI ID는 리전에 특화된 리소스이기 떄문에 AMI ID를 리전별로 지정하려할 떄 사용할 수 있다.
vi new-ec2.yaml
AWSTemplateFormatVersion: 2010-09-09 Mappings: RegionMap: # 리전을 여기서 선택한다. ap-northeast-2: # 서울리전에서 아래 AMI를 사용할 것이다. AMIID: ami-0fd0765afb77bcca7 # Amazon Linux2 ap-northeast-1: # 도쿄리전이다. AMIID: ami-0b7546e839d7ace12 Parameters: # 파라미터, 입력값을 받는다. # 매번 변경해야하는 값들은 Parameters로 만들어서 입력받아서 변경할 수 있다. InstanceTypeParameter: # 인스턴스 파라미터 Type: String # string문자열로 받는다. Default: t2.micro # 기본값은 t2.micro Description: Enter instance size. Default is t2.micro # 설명 추가 VPC: # VPC 파라미터 Type: String #문자열로 입력받는다. Default: vpc-01a276b266db7833b # 기본으로 설정할 VPCID Description: VPC ID. Subnet: # SUBNET 파라미터 Type: String # 문자열로 입력받음 Default: subnet-01132b9dddcf71d3d # 기본값 SUBNET ID Description: Subnet ID. AMI: # AMI 파라미터 Type: String Default: AMIID # 기본값은 RegionMap에서 정의된 AMI ID를 사용한다. Description: The Linux AMI to use. Key: # Key 파라미터 Type: String Default: new-key # new-key를 기본값으로 한다. Description: The key used to access the instance. Resources: # 리소스 정의 InstanceSecurityGroup: #인스턴스 보안그룹 Type: AWS::EC2::SecurityGroup # AWS->EC2->SecurityGroup으로 타입을 정확하게 넣는다. Properties: GroupName: "NEW-SG-WEB" # 보안그룹 이름 정의 GroupDescription: "SSH and web traffic in, all traffic out." # 보안그룹에 설명을 넣어줘야하기 때문에 넣는다. VpcId: !Ref VPC # VpcId는 위 Parameter의 VPC에서 입력받은 값을 사용한다. SecurityGroupIngress: # 보안그룸 Ingress(인바운드) - IpProtocol: tcp # tcp프로토콜에서 FromPort: '80' # 80번포트로 들어오는 트래픽을 ToPort: '80' # 80번포트로 보낸다. CidrIp: 123.142.252.25/32 # 내IP에서 들어오는 트래픽을 대상으로 한다. - IpProtocol: tcp # tcp, 22->22, 내 IP FromPort: '22' ToPort: '22' CidrIp: 123.142.252.25/32 - IpProtocol: icmp # icmp, 모든포트, 내 IP FromPort: -1 ToPort: -1 CidrIp: 0.0.0.0/0 SecurityGroupEgress: # 아웃바운드 규칙 - IpProtocol: -1 # 모두 허용, 모든 IP주소 CidrIp: 0.0.0.0/0 Linux: # 리눅스 Type: 'AWS::EC2::Instance' # AWS->EC2->인스턴스를 생성한다. Properties: # 설정 SubnetId: !Ref Subnet # 서브넷ID는 아까 입력받은 Subnet으로 설정 # ImageId: !Ref AMI # 마찬가지로 AMI도 받는다. ImageId: !FindInMap [ RegionMap, !Ref "AWS::Region", !Ref AMI ] # FindInMap : Mapping에서 값을 가져올 것이다. RegionMap, 현재 CloudPlatform리전의 정보, AMI의 정보를 가져온다. InstanceType: # 인스턴스 타입 Ref: InstanceTypeParameter KeyName: !Ref Key # Key이름은 미리 설정한 변수로 적용 SecurityGroupIds: # 보안그룹도 정의한대로 - Ref: InstanceSecurityGroup BlockDeviceMappings: # 블록스토리지 매핑 - DeviceName: /dev/xvda Ebs: VolumeSize: 8 - DeviceName: /dev/xvdb Ebs: VolumeSize: 8 Tags: # 태그로 이름을 NEW-EC2로 정해준다. - Key: Name Value: NEW-EC2 UserData: # 사용자 데이터 Fn::Base64: | # 아래 입력값에서 글자가 깨지는 경우가 생긴다. 그것을 방지하기 위해 사용하는 내장함수이다. #cloud-boothook #!/bin/bash yum install -y httpd systemctl enable --now httpd echo "Hello World!" > /var/www/html/index.html Outputs: # 위 모든 내용이 완성이 되면, 추출하고 싶은 정보들을 추출하기 위해 정의하는 부분이다. PublicIp: Description: PublicIp Output # 설명 Value: {"Fn::GetAtt": ["Linux","PublicIp"]} # GetAtt 내장함수를 사용한다. # 리눅스라는 논리적 ID에서의 정보들 중에서, PublicIP값을 가져온다.
스택 생성
1단계 템플릿 지정
- 에러가 나온다. 여기서 에러가 있다면 여기서 에러가 출력된다.
- 여기부분을 추가했는데, 여기서 tab으로 라인을 맞추니 에러가 나왔다. 스페이스바를 눌러 맞춰주니 해결되었다.
2단계 스택 세부 정보 지정
- 파라미터를 입력하는 부분이 나온다.
- 우리가 아까 입력했던 Default 값들과, Description이 출력된다.
- VPC ID와 SubnetID는 우리가 수정해야한다. 직접 복붙해준다.
- 여기서 입력기능에 드롭다운 탑다운등 여러가지 Default 값들을 넣어서 선택하는 방법으로도 입력받을 수 있다.
3~4단계 스택 옵션 구성, 검토
- 기본값사용
- 아까 시작했던 NEW-VPC 스택은 완료되었고, EC2-STACK이 작업중이다
- 첫번째 시도에서 에러가 출력되었다.
- 서울 리전에 new-key라는 keypair가 없었다. 그래서 에러가 출력되어 ROLLBACK이 되었다.
- new-key 키페어를 만들고 다시 시도하니 성공하였다.
- 출력탭에 IP주소가 나왔다.
- 웹페이지가 잘 출력되었다.
도쿄 리전에서 스택 생성하기
- 도쿄에서 템플릿을 불러왔지만, 도쿄 리전에는 키가 없다.
- 키페어를 tokyo-key로 생성해준다.
- 또, VPC ID를 도쿄의 기본 VPC으로 사용해준다.
- 서브넷은 a의 ID를 가져온다.
- 전 세계적으로 a와 c의 가용영역만 Freetier에서 사용할 수 있다.
- 작업중이다.
- 웹페이지에 잘 접속된다.
스택 삭제
- 스택을 삭제하면, 스택으로 생성된 모든 자원이 삭제된다.
- 다만 생성중에 만들어진 S3버킷은 우리가 따로 지워야 한다.
- 코드(스크립트)를 작성 및 실행해서 인프라를 생성, 배포, 수정, 정리하는 것을 말한다.
- 이는 서버를 물리적으로 설치하는 하드웨어 측면을 포함하여 운영의 모든 측면을 소프트웨어적으로 생각하는 중대한 사고 전환을 보인다.
- IaC의 핵심은 서버, 데이터베이스, 네트워크, 로그 파일, 애플리케이션 구성, 문서, 자동화된 테스트, 배포 프로세스 등 거의 모든 것을 코드(스크립트)로 관리할 수 있다는 것이다.
- IaC도구로는 애드혹 스크립트, 구성 관리 도구, 서버 템플릿 도수, 오케스트레이션 도구, 프로비전 도구가 있다.
- 테라폼은 해시코프사에서 Go언어로 개발한 오픈소스 도구이다.
- 운영체제마다 바이너리 파일이 존재하는데 Go 코드는 하나의 바이너리 파일로 컴파일되며, Terraform이라는 명령어로 실행 할 수 있다.
- 이 Terraform 명령어를 사용하여 노트북, 데스크탑, 빌드 서버 또는 다른 컴퓨터에서든 인프라를 배포할 수 있으며, 이를위해 추가 인프라(마스터, 에이전트)를 생상할 필요가 없다. 즉 Terraform명령어가 AWS, Azure, GCP, Openstack 등의 Provider를 대신해 API를 호출하여 리소스를 생성한다.
- 테라폼은 생섣ㅇ하려는 인프라 정보가 담겨있는 텍스트로 이루어진 테라폼 구성파일을 생성해 API를 호출한다.
- 이러한 구성 값들이 '코드형 인프라'를 만드는 바로 그 '코드'입니다.
- 팀의 누군가가 인프라를 수정하고자 할 때, 서버에 직접 접속하여 작업하거나 수작업으로 수정하는 대신 테라폼을 사용하여 구성 파일을 수정할 있습니다.
1. 애드혹 스크립트
- 수행할 작업을 단계별로 나누고 배시(Bash)와 같은 언어를 사용하여 각 단계를 코드로 정의하고 작성된 스크립트를 서버에서 수동으로 실행하는것이다.
- 코드를 직접 작성하고, 매번 수동으로 맞춤코드를 작성해야되기 때문에 간단한 설치에 적합하다.
- 예) 사용자 데이터
2. 구성 관리 도구(Configuration)
- 셰프, 퍼핏, 앤서블, 솔트스택 등은 모두 구성 관리 도구로써 대상 서버에 소프트웨어를 설치하고 관리하도록 설계되어 있다.
- 이미 설치 되어있는 서버를 기준으로 한다.
- 배시 스크립트와 비슷해 보이지만 애드혹 스크립트를 사용할 떄와 다른 여러가지 장점이 있다.
- 우리는 여기서 셰프와 퍼핏은 AWS에 있으며, 사용할지 모르겠지만 앤서블과 솔트스택을 사용할 것 같다.
코딩 규칙
- 구성관리 도구는 문서화, 파일 레이아웃, 명확하게 이름 붙여진 매개변수, 시크릿 관리등을 포함하는 코딩 규틱으로 일관되고 예측 가능한 구조를 제공한다.
멱등성
- 구성 관리 도구는 실행 횟수에 관계없이 설정 파일을 사용하여 소프트웨어가 설치되지 않았을 경우에만 설치하고, 소프트웨어가 동작하지 않는 경우에만 동작하도록 한다.
- 예) httpd를 설치하고, 다시 설치하면 skip됨.
분산형 구조
- 애드혹 스크립트는 단일 로컬 머신에서만 실행되도록 설계되어 있지만 앤서블과 같은 구성 관리 도구는 원격의 수많은 서버를 관리하기 위해 특별히 설계된 것이다.
- 관리가 필요한 서버들의 IP를 정리한 hosts파일을 생성하고 플레이북을 정의하여 실행한다.
3. 서버 템플릿 도구
- 도커, 패커, 베이그런트와 같은 서버 템플릿 도구는 여러 서버를 시작하고 각각 동일한 코드를 실행하여 서버를 구성하는 기존방식과 다르게, 운영체제, 포스트웨어, 파일 및 기타 필요한 모든 내용을 포함하고 있는 스냅샷으로 이미지를 생성하여 모든 서버에 이미지를 설치할 수 있다. 실행은 서버에 이미지를 배포한 후 할 수 있다.
4. 오케스트레이션 도구
- 서버 템플릿 도구(도커)는 VM이나 컨테이너를 생성하기에 좋은 도구이지만 관리 부분이 부족하기 때문에 오케스트레이션 도구(쿠버네티스)가 필요하다.
- 오케스트레이션 도구는 VM과 컨테이너 배포, 효율적 업데이트 및 롤백(복원), 자동 복구(치유), 자동 확장(조정), 로드 밸런싱, 서로 식별하고 통신할 수 있게 서비스 검색 기능을 제공한다. 쿠버네티스를 사용하면 도커 컨테이너를 어떻게 관리할지를 코드로 정의할 수 잇다.
- 오케스트레이션 도구의 종류로는 온-premise에서 클러스터를 구축할 수 있는 쿠버네티스, 마라톤/메소스, 도커 스웜, 노마드 등이 있으며 퍼블릭 클라우드에서는 AWS EKS, Azure AKS, GCP GKE(Google Kubernetes Engine)가 있다.
클러스터
- 마스터 -> 워커1~n, 이렇게 어떠한 하나의 기능 아래에 마스터 하나가 있고 그 아래 워커들이 일하는 구조가 클러스터라고 한다.
- 오케스트레이션 도구에서 쿠버네티스가 가장 중요하고, 쿠버네티스는 클러스트다. 따라서
오케스트레이션도구 = 쿠버네티스 = 클러스터
라고 한다.5. 프로비전 도구
- 구성 관리, 서버 템플릿 및 오케스트레이션 도구가 각 서버에서 실행되는 코드를 정의한다면 테라폼, 클라우드 포메이션, 오픈스택 heat와 같은 프로비전 도구는 서버 자체를 생성한다. 서버 생성만 하는 것이 아니라, 사실상 설정도 하고 있어서, 인프라에 관한 거의 모든 부분을 프로비저닝할 수 있다.
- AWS에서 EC2 인스턴스를 생성할 수 있느느것이 테라폼, 클라우드 포메이션이다.
- 오픈스택 heat는 온프레미스에서만 가능하다.
- 수동으로 코드를 변환하지 않아도 되므로 소프트웨어를 효율적으로 배포할 수 있다.
- IaC(코드형 인프라)는 데브옵스의 일종으로 이를 도입한 조직은 배포 횟수를 200배 늘렸고 오류를 24배 빠르게 개선하며 배포시간을 2,555배 줄였다.
1. 자급식 배포
- '마법의 명령어'를 알고 있는 소수의 시스템 관리자만 프로덕션 환경에 접속하여 배포를 진행해 왔다.
- 하지만 인프라를 코드로 정의하면 전체 배포 프로세스를 자동화 할 수 있으며, 개발자도 필요할 떄마다 자체적으로 배포를 진행할 수 있었다.
2. 속도와 안정성
- 배포 프로세스를 자동화 하면 사람이 진행하는 것보다 훨씬 빠르게 컴퓨터가 배포를 진행할 수 있다.
- 자동화 된 프로세스는 일관되고 반복 가능하며 수동으로 지냏ㅇ했을때보다 오류가 적게 발생하기 때문에 더 안전하다.
3. 문서화
- 시스템 관리자뿐만 아니라 누구나 읽을 수 있는 소스 파일로 인프라 상태를 나타낼 수 있다.
- 즉, 모든 사람이 인프라 구조를 이해하고 업무를 볼 수 있도록 해준다.
4. 버전 관리
- 버전관리의 중요한 기능은 ROLLBACK, 다시 전 버전으로 돌아가는 것이다.
- 인프라의 변경 내용이 모두 기록된 코드형 인프라 소스파일을 저장할 수 있으므로 버전을 쉽게 관리할 수 있다.
5. 유효성 검증
- 인프라 상태가 코드로 정의되어 있으면 코드가 변경될 떄마다 검증을 수행하고, 일련의 자동화된 테스트를 실행할 수 있다.
- HashiCorp Terraform은 버전을 지정하고, 구성파일에서 클라우드 및 온프레미스 리소스를 모두 정의할 수 있는 IaC도구이다.
- 인프라를 프로비저닝하고 관리할 수 있다.
- CSP(Cloud Service Provider)에서 API를 제공하기 때문에,
- 그 API를 이용해서 클라우드 플랫폼 및 기타 서비스에서 리소스를 생성하고 관리한다.
쓰기
- 여러 클라우드 공급자 및 서비스에 걸쳐있는 리소스 정의
- tf파일로 정의
계획
- 기존 인프라 및 구성을 기반으로 생성, 업데이트, Destroy할 인프라를 설명하는 실행 계획을 생성한다.
- 테스트 및 검증
- 적용하기 전에 테스트 하는 단계
적용
- 리소스 종속성을 고려하여 제안된 작업을 올바른 순서로 수행한다.
provider "aws" { # aws를 공급자로 사용하여
region = "ap-northeast-2" # 서울 리전에 인프라를 배포한다는 의미
}
resource "aws_instance" "example" {
ami = "ami-0fd0765afb77bcca7"
instance_type = "t2.micro"
}
resource "<PROVIDER>_<TYPE>" "<NAME>" { # PROVIDER는 aws 같은 공급자의 이름이고 TYPE은 instance 같이 해당 공급자에서 생성할 리소스 유형입니다. NAME은 테라폼 코드에서 이 리소스를 참조하기 위해 사용할 수 있는 example과 같은 '식별자'입니다. CONFIG는 특정 리소스에 대한 하나 이상의 인수(argument)로 구성됩니다.
[CONFIG ...]
}
+
가 있는 항목은 추가되고, -
가 있는 항목은 삭제된다는 뜻입니다. ~
가 있는 항목은 수정됩니다.
wget https://releases.hashicorp.com/terraform/1.2.3/terraform_1.2.3_linux_amd64.zip
: Terraform 다운로드unzip terraform_1.2.3_linux_amd64.zip
: 압축해제mv terraform /usr/local/bin/
: bin폴더로 terraform명령어를 넣는다.terraform -version
버전확인
- 잘 설치 되었다.
mkdir aws && cd $_
: aws에서 작업할 파일들을 모아두기위해 파일생성 및 이동
vi main.tf
provider "aws" { region = "ap-northeast-2" } resource "aws_instance" "example" { # aws_instance라는 이름과 example 이라는 이름으로 만들어준다. ami = "ami-0fd0765afb77bcca7" instance_type = "t2.micro" } # terraform init # terraform plan # terraform apply
- 리전과 유형, ami만 정보가 들어가있다.
- main.tf에서 이름은 자유롭게 변경해도 된다
terraform init
: 테라폼 초기화 aws관련 설정이된다.
- terraform init 하면 .terraform이라는 숨김폴더가 하나 생긴다.
terraform plan
- ec2인스턴스의 상세정보들이 표현된다.
- known after apply는 생성된 후에 나오는 데이터를 말한다.
- 현재 에러 메세지는 없다.
- 더하기표시들이 보인다. 새롭게 만든다는 뜻이다.
-
기호는 뺀다는 표시다. 수정을 통해 제거할 때 그렇게 표시될 것이다.~
기호는 수정, 변경할 때 나오는 기호이다.
- 결국 1개가 만들어지는 것이다.
terraform apply
- terraform plan에서 나왔던 출력과 같이 출력되고, action을 실행할지 묻는 질문이 나온다.
- yes를 입력하면 creating이 시작된다.
- 42초후에 작업이 종료되었다.
- 인스턴스도 잘 생성되었다.
- 퍼블릭 IPv4가 잘 생성되어있다.
- VPC 는 자동으로 기본 VPC가 잡힌 것을 예상할 수 있다.
- VPC를 명시하지 않았고, 프라이빗 IP주소가 172.31.0.0의 모습이다.
terraform destroy
: terraform 작업 삭제
- 인스턴스가 잘 삭제되었다.
- vi main.tf
provider "aws" { region = "ap-northeast-2" } resource "aws_instance" "example" { ami = "ami-0fd0765afb77bcca7" instance_type = "t2.micro" tags = { # 태그를 달아준다. Name = "terraform-example" } } #terraform init #terraform plan #terraform apply #terraform destroy
- 태그가 잘 생성되었다.
- terraform을 수정하는데, 어떤사항은 수정이 되지 않는다. 종료하고 다시 시작해야 수정이 되는 수정사항도 존재한다.
terraform destroy
로 지워준다.- 아까 apply나 plan과는 다르게
-
기호가 많다.ec2 인스턴스 웹서버 배포
- vi main.tf
provider "aws" { # 프로바이더 aws region = "ap-northeast-2" # 리전 ap-northeast-2 } resource "aws_instance" "example" { #여기서 이름을 주는데 일종의 식별자가 된다. ami = "ami-0fd0765afb77bcca7" #AMI정의 instance_type = "t2.micro" # 인스턴스 유형 정의 vpc_security_group_ids = [aws_security_group.instance.id] # 보안그룹 지정, id를 가져오는데, 아래 resorce식별자에 aws_security_group이 있다. 여기의 instance의 id를 가져올 것이다. key_name = "new-key" # 키 정의 user_data = <<-EOF # 사용자데이터 정의 #! /bin/bash yum install -y httpd systemctl enable --now httpd echo "Hello, Terraform" > /var/www/html/index.html EOF # End Of File tags = { #태그를 달아준다. Name = "terraform-example" } } resource "aws_security_group" "instance" { # 위에서 불러왔던 보안그룹을 정의하는 부분 name = var.security_group_name #var는 변수를 뜻할 것이고, 아래 선언되어있을 것이다. ingress { #80번포트 TCP 인바운드 from_port = 80 to_port = 80 protocol = "tcp" cidr_blocks = ["0.0.0.0/0"] #강의장PC IP } ingress { # SSH 포트 오픈 from_port = 22 to_port = 22 protocol = "tcp" cidr_blocks = ["123.142.252.25/32"] } ingress { # ICMP는 포트규칙이 아니기 때문에 포트번호가 없어 모든포트에대해 열어준다. from_port = -1 to_port = -1 protocol = "icmp" cidr_blocks = ["0.0.0.0/0"] #핑은 모든 IP에 허용해준다. } egress { # 아웃바운드는 모두 열어준다. from_port = 0 to_port = 0 protocol = "-1" cidr_blocks = ["0.0.0.0/0"] } tags = { # 보안그룹의 태그를 달아준다. Name = "terraform-sg" } } variable "security_group_name" { # security_group_name이라는 문자열 변수를 입력받을 것이고, 기본값은 terraform-example-instance이다. description = "The name of the security group" type = string default = "terraform-example-instance" } output "public_ip" { value = aws_instance.example.public_ip # 위에서 생성한 example의 public_ip를 가져올 것이다. description = "The public IP of the Instance" } output "public_dns" { # 역시 위에서 생성한 example의 Public_dns를 출력할 것이다. value = aws_instance.example.public_dns description = "The Public dns of the Instance" } output "private_ip" { # 마찬가지로 Private-IP를 가져온다. value = aws_instance.example.private_ip description = "The Private_ip of the Instance" } # terraform init # terraform plan # terraform apply # terraform output public_ip # terraform destroy
- terraform init
- terraform plan
- 보안그룹이 들어가서 Plan: 2 to add가 나온다.
- terraform apply
- 열심히 create하고 있다.
- apply가 Complete되고, PrivateIP, PublicIP, PublicDNS가 출력되었다.
- PrivateIP가 172.31로 시작하는 것을 보니, 디폴트 VPC를 사용하고 있을 것이다.
- 웹서버가 잘 배포되었다.
- 보안그룹도 잘 생성되어있는것을 볼 수 있다.