Nextree

Infrastructure as code (AWS CloudFormation)

Nextree Jun 28, 2016 0 Comments

클라우드 서비스 유형으로 몇가지가 있습니다.

IaaS(Infrastructure as a service)는 인프라를 인터넷 서비스로 제공하며
플랫폼을 제공하는 PaaS(Platform as a service)와 소프트웨어를 제공하는 SaaS(Software as a service) 3가지 유형이 대표적입니다. 요즘은 LXC(Linux Container) 기반의 Docker Container 호스팅 서비스를 하는 DaaS(Docker as a Service)등 여러 서버스도 나타나고 있습니다.

이미지 출처 : https://blogs.technet.microsoft.com/kevinremde/2011/04/03/saas-paas-and-iaas-oh-my-cloudy-april-part-3

AWS에서 IaaS와 PaaS 서비스를 이용할수 있으며 또한 Infrastructure를 Code화 하여 관리가 가능합니다.

Infrastructur as Code란 "인프라를 코드화 한다", "인프라를 코드로 기록한다"의 의미입니다.

Infrastructure as Code라는 말은 , 2005년 경 PuppetChef 등 Configuration Management Tools이 원조이며,
현재 Infrastructure as Code의 흐름에 미친 영향은 큽니다.

현 Chef 사의 CTO Adam Jacob의 2008년 4월경 공개한 Why your startup needs an Automated Infrastructure의 24페이지에서 사용되기 시작했습니다.

인프라를 코드화 하면

  1. 시스템의 가독성이 높아집니다.
  2. 시스템 버전 관리르 할수 있습니다.
  3. 응용프로그램 개발 방법론을 인프라에도 적용할 수 있습니다.

개발의 테스트 주도 개발과 마찬가지로 코드화된 인프라 역시 테스트를 기록하고 인프라 코드에 대해서 테스트를 수행할수 있습니다.

이 테스트 주도 인프라는

  1. 직접 확인을 자동화 할 수 있으며
  2. 인프라 코드를 리팩토링 할 수 있습니다.

또한 관리적인 측면에서

  1. 인프라 코드 변경의 영향을 조기에 감지 할수 있고
  2. 인프라의 지속적인 개선을 수행할 수 있게됩니다.

이 코드화된 인프라를 이용하여 올 2월 AWS Region이 국내 정식 오픈되어 Tokyo Region에 구축한 AWS 환경을 CloudFormation(AWS 서비스의 인프라 구성을 코드로 관리)을 사용하여 전산센터 이전하는 방법을 소개합니다.

초기 구축 시 CloudFormation을 이용하여 구성을 했으면 코드 재사용이 가능하나 수작업으로 구성한 환경은 CloudFormer를 사용하여 코드화하는 작업을 우선 진행합니다. ( 보통 글로벌 서비스는 하나의 Backend Office 와 다수의 Frontend Office(Localization) 구성시 Frontend Office는 코드 재사용에 아주 유용합니다. )

CloudFormer 기술문서

  • Step 1: Create a CloudFormer Stack
  • Step 2: Launch the CloudFormer Stack
  • Step 3: Use CloudFormer to Create a Template

CloudFormer의 Launch 역시 CloudFormation 탬플릿을 통해 생성을 하고,
만들어진 서버(CloudFormer)를 통해 인프라 환경을 CloudFormation 탬플릿으로 생성을하게 됩니다.

https://console.aws.amazon.com/cloudformation/home?region=ap-northeast-1#cstack=sn~AWSCloudFormer|turl~https://s3.amazonaws.com/cloudformation-templates-ap-northeast-1/CloudFormer.template
Snap2

탬플릿은 UI를 제공하여 디자인으로 구성할수도 있고 Text 형식의 코드로도 작성할수 있습니다. Snap3

이 코드는 JSON 형식의 포맷이며 여러 스택으로 구분됩니다.

  • Description : 탬플릿의 상세 설명을 기술합니다.
  • Parameters : 사용자 입력 매개변수로 Resource내에 사용할수 있도록 변수를 입력받을수 있습니다.
{
   "AWSTemplateFormatVersion":"2010-09-09",
   "Description":"Copyright (c) 2015 thlee@nextree.co.kr All right reserved.",
   "Parameters":{
      "ServiceName":{
         "Description":"Environment Type",
         "Type":"String",
         "Default":"test",
         "AllowedValues" : ["prod", "test"],
         "ConstraintDescription":"must be a valid Service name."
      }
   },
  • Mappings : 변수 설정 부분으로 선언된 변수는 Resource에서 참조할수 있습니다. 예에서는 us-east-1의 요소중 VPC, ExtELB1, ExELB2의 변수 값을 지정했습니다.
   "Mappings":{
      "myVPCSubnetConfig":{
         "us-east-1":{
            "VPC"      :"10.0.0.0/16",
            "ExtELB1"  :"10.0.11.0/24", "ExtELB2"  :"10.0.111.0/24"
         }
      }
   },
  • Conditions : 조건 설정. 예에서는 Parameter 구문에서 입력받은 값을 비교합니다.
   "Conditions" : {
      "CreateProdResources" : {"Fn::Equals" : [{"Ref" : "EnvType"}, "prod"]}
   },
  • Resources : AWS Resource 설정부분으로 실제로 CloudFormation이 작업이 이뤄지는 구문으로 조건에 맞는 값으로 수행이 됩니다. AWS::XXX::YYY 형식의 Type 항목은 미리 정의되있는 형식이며 기술문서에 각 Type별로 Syntax가 필수와 옵션으로 정의되어 있습니다. "Fn::FindInMap" 함수는 Mapping에 선언된 MapName의 top-level과 second-level 두개의 인자를 반환합니다. Intrinsic 함수에 대한 자세한 내용은 기술문서를 참고.
   "Resources":{
      "VPC":{
         "Type":"AWS::EC2::VPC",
         "Properties":{
            "EnableDnsSupport":"true",
            "EnableDnsHostnames":"true",
            "CidrBlock":{
               "Fn::FindInMap":[ "myVPCSubnetConfig", { "Ref":"AWS::Region" }, "VPC" ]
            },
            "Tags":[ { "Key":"Name", "Value":{ "Fn::Join" : [ "-", [ { "Ref" : "ServiceName" }, { "Ref" : "AWS::Region" } ] ] } 
            } ]
         }
      },
   },
  • Output : 탬플릿 Stack이 완료되면 내용을 출력할수 있습니다. 자동으로 생성된 인프라의 정보를 표시하기 위하여 유저가 설정합니다.
   "Outputs" : {
      "myVPCCIDR" : {
         "Description" : "VPC CIDR of the newly created VPC",
         "Value" : { "Fn::FindInMap":[ "myVPCSubnetConfig", { "Ref":"AWS::Region" }, "VPC" ] }
      }
   }
}

이런 형식의 탬플릿으로 CloudFormation을 통해 CloudFormer를 Launch를 합니다.

서비스 인프라 구성이 10분도 채 않되어 구성이 완료 됩니다. (1:23:55 ~1:31:39, 약 8분, Resource 항목이 많으면 시간이 좀더 걸릴수 있습니다.)

Snap8

Snap11

CloudFormation 항목에서 CREATE_COMPLETE 의 Output 내용에 접속 URL을 확인하여 웹 브라우저로 접속후 수집할 내용을 Filter하여 현재의 인프라 환경 정보를 수집 합니다.

Snap13 Snap14

CloudFormer의 웹페이지에서 모든 과정을 마치면 현재의 인프라 구성이 JSON형식의 탬플릿으로 저장이 됩니다. (사용자의 S3에 저장)
생성된 탬플릿은 하나의 Region에 해당하는 사항으로 다른 Region에 배포시 Tokyo(ap-northeast-1) -> Seoul(ap-northeast-2)와 같이 Launch할 Region에 맞게 수정 과정을 거쳐야 합니다.

Snap17

이 수정이 완료된 탬플릿을 이용하여 생성할 Region에 구성하여 동일한 환경으로 인프라를 구성합니다.

Snap16 Snap18

CloudFormer를 통해 현재의 인프라 상태를 코드화 하고
다른 Region에 동일한 인프라 환경을 구성하는 작업 시간은 수분내에 완료 할수 있습니다.

create-stack-diagram

주의할 점은 상이한 환경이나 다른 Region상의 고려사항은 몇가지가 있습니다.

  1. EC2 ImageId : Region별로 AMI 이미지 ID가 상이합니다.
  2. VPC vs. Classics : VPC 환경인지 EC2 Classic 환경인지 구분이 필요합니다.
  3. Instance Types : Region별로 지원하는 혹은 EC2 Type이 상이할수 있습니다.
  4. IAM policy : CloudFormation으로 생성 할시 권한이 필요합니다.
  5. Endpoing Names : unique한 Name(ELB, S3 등)은 임의로 변경이 됩니다.
  6. ARN(Amazon Resource Names)

이 CloudFormation은

  1. 전 국가에(혹은 여럿 국가에) 동일 서비스를 Localization 서비스로 제공하기 위해, 국가별로 동일한 구성이 필요할 경우 빠른 provisioning이 가능합니다.
  2. Region(서비스 국가) 재해 시 DR 구성을 위해 (잘 짜여진 소스코드는) 수분 내 동일한 구성을 타 Region에 가능합니다.
  3. 인프라 형상을 소스로 관리 할 수 있어 형상관리가 가능하게 되며 비인가 접근자의 인프라 상태 변경을 알 수 있으며,
  4. 변경된 인프라 구성을 원복 할 수도 있게 됩니다.
  5. 병화벽 역할의 SecurityGroup/NACL의 Ingress/Egress 코드화 관리 등등등….
    다양한 활용 목적으로 사용할수 있습니다.

참고 : CloudFormation 의 탬플릿으로 생성해주는 자료도 github에 많이 공유되어 있습니다.

https://github.com/cloudtools/troposphere

Snap19

Nextree

Read more posts by this author.