DevOps/Docker, Jenkins, Ansible, Terraform

CloudFormation (클라우드 포메이션)으로 인프라 관리하기

prden 2023. 2. 2. 20:40

IaC 의 두 종류 : 1. Provisioning Tool (프로비저닝 도구) 2. SCM Tool( 구성관리도구)

1. Provisioning Tool -> Terraform, CloudFormation

모든 가상 리소스(가상 서버, 로드 밸런서, 스토리지, 네트워크 계층 등)를 코드로 관리한다.

 

2. 시스템 구성에 초점을 두는 구성관리(Configuration System) - Ansible

운영체제 구성부터 패키지 설치 및 애플리케이션 배포까지 자동화

 

https://btcd.tistory.com/20

 

3. 클라우드 포메이션

https://btcd.tistory.com/123

 

참고 : Terraform & Ansible외의 도구 개념 및 관계 - 2

안녕하세요! 하씨가문의 영광입니다. 이전시간에는 Puppet & Chef를 다뤄봤는데요! 이번 시간에서는 AWS CloudFormation & SaltStack에 대해서 알아보겠습니다! ※ 목차 AWS CloudFormation 개념 구성 요소 동작

btcd.tistory.com

 

3-1. 클라우드 포메이션 구성요소

1) Template : JSON 또는 YAML 형식의 텍스트 파일로 .json, .yaml, .template, .txt 등 모든 확장명으로 파일을 저장할 수 있다. CloudFormation에서는 템플릿을 AWS 리소스 구축을 위한 블루 프린트로 사용한다. 

 

2) Stack :  CloudFormation으로 생성한 AWS리소스 집합으로, Stack 단위로 생성, 수정, 삭제가 가능하다. 리소스간에 의존관계가 있으면 순서에 맞게 생성되고, Stack을 사겢하면 관련 리소스가 모두 삭제된다. 

 

3) Change Set : Stack에서 실행중인 리소스를 변경해야하는 경우 스택을 업데이트한다. 리소스를 변경하기 전에 제안된 변경세트를 생성할 수 있다.

 

3-2. 클라우드 포메이션 동작방식

Template 코드를 읽어 Stack을 생성

클라우드 포메이션은 JSON  또는 YAML파일로 구축하려는  AWS 아키텍쳐를 정확히 기술할 수 있다.

이런 파일을 작성해 간단히 업로드하면 이파일을 실행해 AWS 리소스를 자동으로 생성하고 갱신한다.

 

##  Template 특징

{
  "AWSTemplateFormatVersion": "version date",
    "Description" : "템플릿 작업 요약을 기술",
    "Resources" : {}, // AWS 서비스를 초기화하고 서비스의 구성이 무엇인지 기술 
    // ex) InternetGateway, Vpc, 보안그룹, EC2 등.
    "Parameters" : {}, //SSH로 접근하기 위해 SSH 키 페어와 같은 추가적인 정보제공
    "Mapping" : {}, //리전별로 어떤 AMI를 사용할지 Mapping을 통해 정의할 수 있다.
    "Conditions": {}, // 조건부 논리를 추가하는 데 사용한다. 
    "Metadata": {}, // 임의의 정보를 리소스에 추가하는 데 사용
    "Outputs":{}, 
    // EC2 서버 IP주소와 같이 템플릿 실행 후 유익한 정보를 출력하거나 추출하는데 사용
    // ex) 웹 애플리케이션 접속 url,  SSH로 인스턴스에 접근할 수 있는 공인 IP주소 출력가능
 }

## 예시Public Subnet2, Private Subnet2, NAT

VPC - InternetGateway - AttachGateway - EIP - NatGateway - PrivateRoute(PrivateRouteTable)- PrivateSubnet1,2

AWSTemplateFormatVersion: 2010-09-09
Description: Deploy a VPC



Resources:
  VPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.0.0.0/16
      EnableDnsHostnames: true
      Tags:
      - Key: Name
        Value: Lab VPC

  InternetGateway:
    Type: AWS::EC2::InternetGateway
    Properties:
      Tags:
      - Key: Name
        Value: Lab Internet Gateway

  AttachGateway:
    Type: AWS::EC2::VPCGatewayAttachment
    Properties:
      VpcId: !Ref VPC
      InternetGatewayId: !Ref InternetGateway




  PublicSubnet1:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC
      CidrBlock: 10.0.0.0/24
      AvailabilityZone: !Select 
        - '0'
        - !GetAZs ''
      Tags:
        - Key: Name
          Value: Public Subnet 1
  
  PublicSubnet2:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC
      CidrBlock: 10.0.2.0/24
      AvailabilityZone: !Select 
        - '1'
        - !GetAZs ''
      Tags:
        - Key: Name
          Value: Public Subnet 2
# 1
  PrivateSubnet1:
    Type: AWS::EC2::Subnet    
    Properties:
      VpcId: !Ref VPC
      CidrBlock: 10.0.1.0/24
      AvailabilityZone: !Select 
        - '0'
        - !GetAZs ''
      Tags:
        - Key: Name
          Value: Private Subnet 1

  PrivateSubnet2:
    Type: AWS::EC2::Subnet    
    Properties:
      VpcId: !Ref VPC
      CidrBlock: 10.0.3.0/24
      AvailabilityZone: !Select 
        - '1'
        - !GetAZs ''
      Tags:
        - Key: Name
          Value: Private Subnet 2
          
  PublicRouteTable:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId: !Ref VPC
      Tags:
        - Key: Name
          Value: Public Route Table

  PublicRoute:
    Type: AWS::EC2::Route
    Properties:
      RouteTableId: !Ref PublicRouteTable
      DestinationCidrBlock: 0.0.0.0/0
      GatewayId: !Ref InternetGateway

  PublicSubnetRouteTableAssociation1:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId: !Ref PublicSubnet1
      RouteTableId: !Ref PublicRouteTable

  PublicSubnetRouteTableAssociation2:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId: !Ref PublicSubnet2
      RouteTableId: !Ref PublicRouteTable
      
# nat1
  NATGW01:
    Type: AWS::EC2::NatGateway    
    Properties:
      AllocationId: !GetAtt EIP.AllocationId
      SubnetId: !Ref PrivateSubnet1

# nat2
  EIP:
    DependsOn: AttachGateway
    Type: AWS::EC2::EIP    
    Properties:
      Domain: vpc

# 2
  PrivateRouteTable:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId: !Ref VPC
      Tags:
      - Key: Name
        Value: Private Route Table
  
# nat 3
  PrivateRoute:
    Type: AWS::EC2::Route    
    Properties:
      RouteTableId: !Ref PrivateRouteTable
      DestinationCidrBlock: 0.0.0.0/0
      NatGatewayId: !Ref NATGW01

# 3
  PrivateSubnetRouteTableAssociation1:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId: !Ref PrivateSubnet1
      RouteTableId: !Ref PrivateRouteTable
      
  PrivateSubnetRouteTableAssociation2:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId: !Ref PrivateSubnet2
      RouteTableId: !Ref PrivateRouteTable
      
Outputs:
  VPC:
    Description: VPC
    Value: !Ref VPC
  AZ1:
    Description: Availability Zone 1
    Value: !GetAtt 
      - PublicSubnet1
      - AvailabilityZone

4.  AWS 클라우드 포메이션 디자이너 - GUI로 작업가능

GUI로 클라우드 포메이션 템플릿을 작성하고 편집하는 도구

 

5. AWS 클라우드 포메이션 예제를 많이 봐