220630

HyeonKi Jo·2022년 6월 30일
0

복습

ad-hoc

ad-hoc이란

  • 라틴어, 특별한 이유를 위해
  • CLI에서 명령어로 작업을 하는 것을 의미한다.
  • 클릭으로 만드는것이 더욱 간편하지만, 코드를 복사-> 붙혀넣기로 똑같은 작업을 반복할 수 있어서, 클릭보다 편한점이 있었다.

특이사항

  • 각 서비스의 ID를 변수로 만들어서 사용했다.
  • 처음 생성한 VPC부터 서브넷, 인터넷게이트웨이, 보안그룹, 인스턴스등. 각각의 ID를 변수로 저장해서 만들고, Attach하고, 삭제할때도 사용했다.

AWS CloudFormation

  • 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를 리전별로 지정하려고 할때 사용합니다.
    1. Mapping으로 각 나라의 특화된리소스, AMI와 같이 각 리전별로 다른 ID를 가지는 정보를 Mapping으로 지정하고, 각 리소스마다 다른 ID를 Parameters로 입력받는 식으로 CloudFormation을 이용하면 운영진이 범 국가적으로 배포를 진행할 수 있다.

vi new-vpc.yaml

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

Cloud Formation들어가보기

살펴보기


스택 생성하기

1단계 템플릿 지정

  • 스택을 생성한다.
  • 우리가 메모장으로 만든 new-vpc.yaml파일로 업로드할 것이기 때문에 준비된 템플릿으로 준비해준다.
  • Designer는 아이콘들을 꺼내서 그림(구성도)를 그려서 생성해주는 기능이다.
  • S3에서 템플릿을 사용할 수 있다면, 아래 템플릿 URL을 입력해준다.
  • 그러나 만약 우리가 yaml파일을 올리면 자동으로 S3버킷이 생성되어 업로드가 된다.
  • 그래서 우리도 모르는 S3버킷이 생성될 것이다.
  • 이렇게 생성되었다.

2단계 스택 세부 정보 지정

  • 스택의 이름을 넣어준다.
  • NEW-VPC_STACK

3단계 스택 옵션 구성

  • 스택 옵션을 구성할 수 있다.
  • 이번에는 그냥 기본값을 쓰기로 한다.

4단계 검토

  • 스택을 검토해주고, 생성버튼을 눌러준다.

결과보기

  • CREATE_IN_PROGRESS 현재 작업중이다.
  • 새로고침하니 작업 리스트가 많이 늘어났다.
  • VPC에서도 NEW-VPC가 생겼다. (그러나 어제걸 안지웠는지 2개가됬다.)

EC2 만들어보기

  • 위 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의 핵심은 서버, 데이터베이스, 네트워크, 로그 파일, 애플리케이션 구성, 문서, 자동화된 테스트, 배포 프로세스 등 거의 모든 것을 코드(스크립트)로 관리할 수 있다는 것이다.
  • IaC도구로는 애드혹 스크립트, 구성 관리 도구, 서버 템플릿 도수, 오케스트레이션 도구, 프로비전 도구가 있다.

Terraform

작동 방식

  • 테라폼은 해시코프사에서 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(코드형 인프라)장점

  • 수동으로 코드를 변환하지 않아도 되므로 소프트웨어를 효율적으로 배포할 수 있다.
  • IaC(코드형 인프라)는 데브옵스의 일종으로 이를 도입한 조직은 배포 횟수를 200배 늘렸고 오류를 24배 빠르게 개선하며 배포시간을 2,555배 줄였다.

1. 자급식 배포

  • '마법의 명령어'를 알고 있는 소수의 시스템 관리자만 프로덕션 환경에 접속하여 배포를 진행해 왔다.
  • 하지만 인프라를 코드로 정의하면 전체 배포 프로세스를 자동화 할 수 있으며, 개발자도 필요할 떄마다 자체적으로 배포를 진행할 수 있었다.

2. 속도와 안정성

  • 배포 프로세스를 자동화 하면 사람이 진행하는 것보다 훨씬 빠르게 컴퓨터가 배포를 진행할 수 있다.
  • 자동화 된 프로세스는 일관되고 반복 가능하며 수동으로 지냏ㅇ했을때보다 오류가 적게 발생하기 때문에 더 안전하다.

3. 문서화

  • 시스템 관리자뿐만 아니라 누구나 읽을 수 있는 소스 파일로 인프라 상태를 나타낼 수 있다.
  • 즉, 모든 사람이 인프라 구조를 이해하고 업무를 볼 수 있도록 해준다.

4. 버전 관리

  • 버전관리의 중요한 기능은 ROLLBACK, 다시 전 버전으로 돌아가는 것이다.
  • 인프라의 변경 내용이 모두 기록된 코드형 인프라 소스파일을 저장할 수 있으므로 버전을 쉽게 관리할 수 있다.

5. 유효성 검증

  • 인프라 상태가 코드로 정의되어 있으면 코드가 변경될 떄마다 검증을 수행하고, 일련의 자동화된 테스트를 실행할 수 있다.

테라폼이란?

  • HashiCorp Terraform은 버전을 지정하고, 구성파일에서 클라우드 및 온프레미스 리소스를 모두 정의할 수 있는 IaC도구이다.
  • 인프라를 프로비저닝하고 관리할 수 있다.

테라폼은 어떻게 작동합니까?

  • CSP(Cloud Service Provider)에서 API를 제공하기 때문에,
  • 그 API를 이용해서 클라우드 플랫폼 및 기타 서비스에서 리소스를 생성하고 관리한다.

쓰기

  • 여러 클라우드 공급자 및 서비스에 걸쳐있는 리소스 정의
  • tf파일로 정의

계획

  • 기존 인프라 및 구성을 기반으로 생성, 업데이트, Destroy할 인프라를 설명하는 실행 계획을 생성한다.
  • 테스트 및 검증
  • 적용하기 전에 테스트 하는 단계

적용

  • 리소스 종속성을 고려하여 제안된 작업을 올바른 순서로 수행한다.

테라폼 코드 예제

  • vi main.tf
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 ...]
}

Terraform 주요 명령어

  • terraform init
    • terraform 명령어에는 테라폼의 기본 기능이 포함되어 있지만 모든 공급자(AWS, Azure, GCP 등)에 대한 코드가 포함되어 있지 않습니다.
    • 그렇게 때문에 terraform init 명령어를 실행하여 테라폼에 코드를 스캔하도록 지시하고 어느 공급자인지 확인하고, 필요한 코드를 다운로드하도록 해야 합니다.
    • 기본적으로 공급자 코드는 테라폼의 .terraform 폴더에 다운로드됩니다.
  • terraform plan
    • 테라폼이 구성 파일을 사용하여 작업을 수행하기 전에 코드의 온전성을 검사할 수 있습니다.
    • plan 명령어는 리눅스에서 쓰이는 diff 명령의 결괏값과 유사합니다.
    • + 가 있는 항목은 추가되고, - 가 있는 항목은 삭제된다는 뜻입니다. ~ 가 있는 항목은 수정됩니다.
  • terraform apply : 테라폼의 구성 파일을 실행하려면 terraform apply 명령어를 실행합니다.

Terraform 설치

  • 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에서 작업할 파일들을 모아두기위해 파일생성 및 이동

Terraform 코드예시

  • 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를 사용하고 있을 것이다.
  • 웹서버가 잘 배포되었다.
  • 보안그룹도 잘 생성되어있는것을 볼 수 있다.
profile
Talking Potato

0개의 댓글