본문 바로가기
INFRA/Operation

AWS CloudFormation 설치 및 리소스 배포

by BTC_지수 2022. 6. 23.

안녕하세요! "하씨 가문의 영광" 입니다

오늘은 AWS CloudFormation 에 대해서 다루어 볼 겁니다!

같이 보러 한번 가보실까요!

 

 

CloudFormation 기본 프로세스

 

간단하게 리뷰차 CloudFormation에 대해서 말씀을 드리자면 

  • AWS 리소스들을 자동으로 생성해주는 IaC 도구
  • AWS 구성을 재사용하기 쉽게 코드로 작성해두는 것

입니다.

 

< 작동 방법 >

템플릿 작성 -> 템플릿 업로드 -> 스택 생성 -> 스택 설정 및 리소스 생성

  • 리소스 구성들을 코드화한 템플릿을 작성하여 해당 템플릿으로 스택을 생성하면, 자동으로 리소스들이 생성됩니다.
  • 템플릿은 JSON 또는 YAML 형식으로 작성됩니다.

 

< 템플릿 구조 >

1. AWSTemplateFormatVersion (포맷 버전)

  • 템플릿의 기능을 식별합니다.
  • 현재 유일한 유효 값은 2010-09-09 입니다.

2. Description

  • 템플릿에 대한 설명입니다.
  • 이 템플릿에 대한 전체적인 설명을 해주는게 좋습니다. (생략가능)

3. Parameter

  • 스택 생성 시 넘겨지는 파라미터들
  • 템플릿 내부에서 Ref 함수로 참조합니다.
  • 선택사항

4. Resource (주 내용)

  • 말 그대로 AWS 내에서 생성될 리소스들
  • YAML에서의 구조
Resources:
  Logical ID:
    Type: Resource type
    Properties:
      Set of properties

Logical ID : 해당 템플릿 내의 고유한 id. 이 이름을 가지고 다른 리소스를 참조합니다.

Resource Type : 리소스 유형

Properties : 각각의 리소스별로 필요한 속성들을 작성해줍니다.

 

참고. 파라미터로 구성 하고 안하고의 차이

yaml 파일을 구성하기 앞서 Parameter 섹션을 만들지 않고 진행하게 된다면 Cidr과 리전, 가용영역이 고정되기 때문에 재사용성이 떨어집니다.

 

> 파라미터 사용 X

 

> 파라미터 사용 O

파라미터를 사용하여 하게되면 더 자유롭게 선택할 수 있음으로 재사용성면에서 톡톡히 효과를 볼 수 있습니다.

 

 

Yaml 파일 구성

그럼 스택생성을 하기위한 YAML 파일을 구성해 볼까요!

저희는 간단한 VPC와 Subnet을 만들어서 EC2를 배포하여 httpd를 배포해보겠습니다

 

1. 사용할 파라미터 구성

Resource 섹션 위로 Parameter 섹션을 만들어서 CIDR블럭과 가용영역을 설정해주도록 하겠습니다.

 

Parameters:
 # 키선택 가능
  KeyName:
    Description: Name of KeyPair
    Type: AWS::EC2::KeyPair::KeyName
 
 # Amazon Linux 2 AMI 선택
  AMI:
    Description: AMI of EC2
    Type: AWS::EC2::Image::Id
    Default: ami-0fd0765afb77bcca7
# 가용성 영역을 선택 가능
  AZpublic:
    Description: AvailabilityZone for public
    Type: AWS::EC2::AvailabilityZone::Name

# VPC Cidr의 default 값을 적어줍니다.
  VPCCidr:
    Description: Cidr Block for VPC
    Type: String
    Default: 10.0.0.0/16
    
# Public Subnet Cidr의 default 값을 적어줍니다.
  PublicSubnetCidr:
    Description: Cidr Block for Public Subnet
    Type: String
    Default: 10.0.0.0/24

AZ 파라미터는 값을 따로 정해주진 않았는데, 이런 경우는 AWS-specific parameter types라고 템플릿을 구성할 때 직접 선택할 수 있습니다.

VPC Cidr 은 10.0.0.0/16 으로 PublicSubnet Cidr은 10.0.0.0/24로 디폴트 값을 지정해주었습니다.

 

이런 파라미터는 Resources에서 VPC와 Subnet들의 az, cidr 등의 해당하는 부분들에 !Ref로 바꾸어주면 적용이 됩니다.

 

2. VPC

이제 본격적으로 Resource들을 구성해보도록 하겠습니다.

먼저 VPC 구성은 아래와 같습니다.

  VPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: !Ref VPCCidr
      EnableDnsHostnames: true
      Tags:
        - Key: Name
          Value: jisooVPC

!Ref VPCCidr을 해줌으로써 CidrBlock에 파라미터에서 정의한 값을 넣어줍니다.

그리고 DNS 호스트 이름을 활성화 해주었습니다. 

DNS 호스트 이름은 필수는 아니지만, 활성화를 해놓아야 이 VPC 안에서 생성되는 인스턴스들이 DNS 호스트 이름을 갖게 됩니다. (Default는 비활성)

태그는 Name을 jisoovpc로 주었습니다.

 

3. Subnet

간단히 Public Subnet을 구성해보도록 하겠습니다.

  PublicSubnet:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC
      CidrBlock: !Ref PublicSubnetCidr
      AvailabilityZone: !Ref AZpublic
      MapPublicIpOnLaunch: true
      Tags:
        - Key: Name
          Value: jisoo pub subnet

CidrBlock 와 Availabilityzone에 마찬가지로 !Ref 를 적음으로써 파라미터에서 정의한 값을 넣어줍니다.

그리고 VpcId로 위에서 만든 VPC를 연결해 줬는데, 이렇게 매개변수나 리소스 값을 반환할 땐 내장함수 Ref를 씁니다.

YAML에서 Ref는 아래와 같이 두 가지 방법으로 쓸 수 있습니다.

VpcId: !Ref VPC

VpcId:
  Ref: VPC

 

4. Internet Gateway + VPC에 Attach
  IGW:
    Type: AWS::EC2::InternetGateway
    Properties:
      Tags:
        - Key: Name
          Value: jisooigw
  Attachigw:
    Type: AWS::EC2::VPCGatewayAttachment
    Properties:
      InternetGatewayId: !Ref IGW
      VpcId: !Ref VPC

위 코드와 같이 internet gateway를 생성해준다음 vpc와 연결하는걸 따로 해줍니다.

연결하는 부분에 있어 마찬가지고 Ref로 VPC와 igw를 참조해주면 됩니다. 

 

5. Route Table
  PublicRT:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId: !Ref VPC
      Tags:
        - Key: Name
          Value: jisoo Public RT
  PublicRoute:
    Type: AWS::EC2::Route
    DependsOn: Attachigw
    Properties:
      RouteTableId: !Ref PublicRT
      DestinationCidrBlock: 0.0.0.0/0
      GatewayId: !Ref IGW
  PublicSubnetRTAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      RouteTableId: !Ref PublicRT
      SubnetId: !Ref PublicSubnet

먼저 Route Table을 만들고(PublicRT), Routing Table을 설정하고(PublicRoute), 서브넷 연결(PublicSubnetRTAssociation)까지 해주면 됩니다.

 

6. Security Group

이제 apache를 배포할 ec2에 적용할 Security Group을 만들어보겠습니다.

저는 ssh 22번 포트, httpd 80번 포트를 허용해주도록하겠습니다.

  SGforWeb:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: allow 22, 80
      GroupName: jisoo SG
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 80
          ToPort: 80
          CidrIp: 0.0.0.0/0
        - IpProtocol: tcp
          FromPort: 22
          ToPort: 22
          CidrIp: 0.0.0.0/0
      VpcId: !Ref VPC

 

7. EC2
EC2forWeb:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: !Ref AMI
      KeyName: !Ref KeyName
      AvailabilityZone: !GetAtt PublicSubnet.AvailabilityZone
      InstanceType: t2.micro
      SubnetId: !Ref PublicSubnet
      SecurityGroupIds:
        - !Ref SGforWeb
      UserData:
        Fn::Base64:
          !Join [ "", [
          "#!/bin/bash\n",
          "#Install APM for Web Server\n",
          "yum install -y httpd\n",
          "systemctl enable httpd\n",
          "systemctl start httpd\n"] ]
      Tags:
        - Key: Name
          Value: jisooWeb

Key 는 각자, 리전별로 갖고 있는 키를 바로 쓸 수 있도록 Parameter로 설정했습니다.

AMI도 리전별로 원하는 OS별로 다르기 떄문에 파라미터로 넣었지만, 드롭다운 값 목록을 표시하지 않기 때문에 디폴트 값을 넣어줬습니다.

제가 넣은 AMI는 서울 리전의 Amazon Linux 2 입니다.

 

UserData로는 apache2를 설치해주고 시스템 시작하는 코드를 넣어줍니다.

 

 

Stack 생성

자! 이제 완성된 YAML 파일을 가지고 스택을 생성 해보겠습니다.

CloudFormation으로 들어가서 stack을 생성해줍니다.

순서대로 체크를 해주고 "Upload a template file" 에는 완성된 yaml 파일을 업로드해줍니다.

 

다음으로는 파라미터에서 가용영역과 key를 설정해줍니다.

(여기서 key는 콘솔에서 만든 key로 진행하였습니다.)

 

step3 에서는 별도로 설정해주어야하는것이 없어 next를 눌러줍니다.

 

마지막으로 만든 Stack을 리뷰해주고 생성해줍니다.

 

결과

 

이제 stack이 다 만들어졌습니다

 

만들어진 EC2에서 Public ip 주소로 들어가보도록 하겠습니다.

 

Apache Test Page가 잘 나오는것을 확인할 수 있습니다.

 

 

삭제

마지막으로는 생성한 스택을 삭제해주는것 까지 해줘야하는거 잊지말아야겠지요?

생성한 스택을 선택하여 delete만 누르면 스택삭제가 완료됩니다. 

 

 

여기까지 오늘 준비한 CloudFormation으로 간단한 리소스 배포를 해보았는데요!

이번에도 여러분들께 많은 도움이 되셨으면 좋겠습니다.

그럼 다음 시간에도 유용한 정보를 드릴수 있도록하겠습니다

뿅!

 

<참고자료 : https://honglab.tistory.com/84?category=942973>

 

'INFRA > Operation' 카테고리의 다른 글

What is HashiCorp?  (0) 2022.06.28
Airflow  (0) 2022.06.24
AWS Puppet 설치 및 리소스 배포  (0) 2022.06.13
AWS Ansible 리소스 구성 및 설치  (0) 2022.06.09
AWS terraform 설치 및 리소스 배포  (0) 2022.05.31

댓글