AWS 클라우드포메이션을 이용한 웹서버 시작하기

AWS 클라우드포메이션을 이용한 웹서버 시작하기

Nov 18, 2019    

AWS 클라우드포메이션은 EC2, VPC 등과 같은 AWS 리소스를 코드로 정의하고 원하는 때에 코드 템플릿으로 리소스를 시작할 수 있게 도와주는 서비스이다. 클라우드포케이션 템플릿 코드에 정의한 모든 서비스는 사용자가 원하는 만큼 프로비저닝하고 사용을 원치 않으면 한꺼번에 종료할 수 있다. 이런 서비스를 Infrastructure as code라고 부른다.

템플릿은 JSON 혹은 YAML 형식으로 정의할 수 있다. 이 코드는 S3 버킷에서 로드하거나, 사용자가 직접 업로드(자동생성된 S3 버킷에 저장) 할 수 있다.

하지만 클라우드포메이션 템플릿을 빈 파일에서부터 작성하는 것은 어려운 일이다. AWS는 매니지먼트 콘솔에 클라우드포메이션 템플릿 디자이너라는 UI 툴을 제공한다. 그리고 VS Code를 사용하는 사람이라면 CloudFormation extension의 도움을 받을 수 있다.

그리고 각 리소스마다 제공되는 속성이 다양하기 때문에 AWS 템플릿 참조 문서를 옆에 두고 템플릿을 작성해야 한다.

템플릿은 크게 Resources, Parameters, Mappings, Outputs, Metadata 다섯 부분으로 구성되고 이 중 AWS 리소스를 정의하는 Resources 만이 필수 작성 영역이다.

  • Resources(필수): CloudFormation을 통해 정의할 AWS 리소스
  • Parameters: 사용자 정의 파라미터, 이 파라미터는 템플릿 내부에서 사용할 수 있다.
  • Mappings: Map 형태의 값 형식을 가진다. FindInMap 함수를 통해서 템플릿 내부에서 사용할 수 있다.
  • Outputs: 스택의 결과물을 다른 스택으로 가져오거나 응답을 반환하기 위해 사용한다.
  • Metadata: 템플릿에 대한 세부 정보를 제공한다.

아래 코드는 VS Code 익스텐션과 AWS 템플릿 문서의 도움으로 작성한 EC2 웹서버 정의 템플릿이다. 리소스로는 EC2, 보안그룹이 있으며 EC2는 인스턴스 초기화할 때 유저데이터를 사용해서 Apache Http서버를 실행하고 루트 페이지에 hostname과 페이지 수정 일시를 표시한다. 보안그룹은 EC2 인스턴스에 적용되며 SSH(22포트)와 http(80포트)를 any로 개방한다.

AWSTemplateFormatVersion: 2010-09-09
Metadata:
  MyMeta:
    apple: red
    bannna: yellow
Parameters:
  owner:
    Description: This stack owner's name
    Type: String
    Default: 'Shawn'
Resources:
  MyEC2SecurityGroup:
    Type: 'AWS::EC2::SecurityGroup'
    Properties:
      GroupName: MyWebSecurity
      GroupDescription: 'This is my web server security group'
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 22
          CidrIp: 0.0.0.0/0
          ToPort: 22
      Tags:
        - Key: Name
          Value: MySG
        - Key: CreatedBy
          Value: CloudFormation
  WebServerIngress:
    Type: 'AWS::EC2::SecurityGroupIngress'
    Properties:
      CidrIp: 0.0.0.0/0
      Description: WebServerIngress By CloudFormation
      FromPort: 80
      GroupName: !Ref MyEC2SecurityGroup
      IpProtocol: tcp
      ToPort: 80
  MyWebServer:
    Type: 'AWS::EC2::Instance'
    Properties:
      ImageId: ami-02b3330196502d247
      InstanceType: t2.micro
      SecurityGroups:
        - !Ref MyEC2SecurityGroup
      Tags:
        - Key: Name
          Value: !Sub
            - 'WebServerBy ${param}'
            - { param: !Ref owner }
      UserData:
        Fn::Base64:
          !Sub |
            #!/bin/bash
            yum update -y 
            yum install -y httpd.x86_64 
            systemctl start httpd.service
            systemctl enable httpd.service
            echo "Hello Cloud Formation from $(hostname -f)... at $(date)" > /var/www/html/index.html
Outputs:
  MyStackRegion:
    Description: This is the output description.
    Value: !Ref 'AWS::Region'
  StackOwner:
    Description: This stack creator
    Value: !Ref owner