서버 구성을 자동화하는 CloudFormation

이재홍 http://www.pyrasis.com 2014.03.24 ~ 2014.06.30

CloudFormation 템플릿으로 CloudFormation 스택 생성하기

CloudFormation 템플릿으로 CloudFormation 스택을 생성해보겠습니다. 템플릿은 앞에서 설명한 기본 템플릿을 조합하여 EC2 인스턴스를 생성하고, 22, 80번 포트를 여는 Security Group을 설정하고, 아파치 웹 서버를 설치, 실행하는 템플릿을 사용하겠습니다.

메모장이나 기타 텍스트 편집기를 열고 아래와 같이 템플릿을 작성한 뒤 httpd.template으로 저장합니다.

EC2 인스턴스 생성, 22, 80번 포트를 여는 Security Group 설정, 아파치 웹 서버 설치, 실행 템플릿(installhttpdsecuritygroup.template)

{
  "Description" : "Create an EC2 instance running the Amazon Linux 64 bit AMI.",
  "Parameters" : {
    "KeyPair" : {
      "Description" : "The EC2 Key Pair to allow SSH access to the instance",
      "Type" : "String",
      "Default" : "awskeypair"
    }
  },
  "Resources" : {
    "Ec2Instance" : {
      "Type" : "AWS::EC2::Instance",
      "Properties" : {
        "KeyName" : { "Ref" : "KeyPair" },
        "ImageId" : "ami-c9562fc8",
        "SecurityGroups" : [ { "Ref" : "InstanceSecurityGroup" } ],
        "InstanceType" : "t1.micro",
        "UserData": {
          "Fn::Base64": {
            "Fn::Join": [ "",
              [ "#!/bin/bash\n",
              "/opt/aws/bin/cfn-init --region ", {  "Ref": "AWS::Region" },
              " -s ", { "Ref": "AWS::StackName" },
              " -r Ec2Instance\n" ]
            ]
          }
        }
      },
      "Metadata" : {
        "AWS::CloudFormation::Init" : {
          "config" : {
            "packages" : {
              "yum" : {
                "httpd" : []
              }
            },
            "services" : {
              "sysvinit" : {
                "httpd" : {
                  "enabled" : "true",
                  "ensureRunning" : "true"
                }
              }
            }
          }
        }
      }
    },
    "InstanceSecurityGroup" : {
      "Type" : "AWS::EC2::SecurityGroup",
      "Properties" : {
        "GroupDescription" : "Allow HTTP and SSH access",
        "SecurityGroupIngress" : [ {
          "IpProtocol" : "tcp",
          "FromPort" : "22",
          "ToPort" : "22",
          "CidrIp" : "0.0.0.0/0"
        }, {
          "IpProtocol" : "tcp",
          "FromPort" : "80",
          "ToPort" : "80",
          "CidrIp" : "0.0.0.0/0"
        } ]
      }
    }
  },
  "Outputs" : {
    "InstanceId" : {
      "Description" : "The InstanceId of the newly created EC2 instance",
      "Value" : {
        "Ref" : "Ec2Instance"
      }
    }
  },
  "AWSTemplateFormatVersion" : "2010-09-09"
}

AWS 콘솔로 접속한 뒤 메인 화면에서 Deployment & Management의 CloudFormation를 클릭합니다.


그림 22-4 CloudFormation Templated AWS Resource Creation

오른쪽 위에서 CloudFormation의 리전을 변경할 수 있습니다. 템플릿으로 CloudFormation 스택을 생성하면 여기서 선택한 리전에 AWS 리소스가 생성됩니다. Tokyo 리전을 사용하겠습니다.


그림 22-5 CloudFormation 리전 선택

생성한 CloudFormation 스택이 하나도 없을 때 그림 22-6과 같은 페이지가 표시됩니다. Create New Stack 버튼을 클릭합니다.


그림 22-6 CloudFormation 메인 페이지

CloudFormation 템플릿으로 CloudFormation 스택을 생성합니다(그림 22-7).

  • Name: CloudFormation 스택의 이름입니다. httpd를 입력합니다.
  • Source: 사용할 CloudFormation 템플릿입니다. Upload a template to Amazon S3을 선택하고 파일 선택 버튼을 클릭합니다.
    • Select a sample template: AWS에서 제공하는 예제 템플릿입니다.
    • Upload a template to Amazon S3: 현재 컴퓨터에 있는 템플릿 파일을 S3에 올린 후 스택을 생성합니다.
    • Specify an Amazon S3 Template URL: 템플릿 파일을 미리 S3 버킷에 올렸다면 S3 버킷에 저장된 템플릿 파일의 경로입니다.


그림 22-7 CloudFormation 스택 생성

방금 저장한 httpd.template 파일을 선택하고, 열기 버튼을 클릭합니다. 파일을 선택을 했으면 아래쪽 Next 버튼을 클릭합니다(나중에 S3 버킷 목록을 보면 템플릿 파일이 저장된 S3 버킷이 생성되어 있습니다).


그림 22-8 CloudFormation 템플릿 파일 선택

EC2 인스턴스에 사용할 키 쌍을 설정합니다. 우리가 만든 템플릿에는 awskeypair라는 키를 기본값으로 설정해놓았습니다. 다른 키 쌍을 사용하고 싶으면 KeyPair 부분에 키 쌍 이름을 입력하면 됩니다. 이제 Next 버튼을 클릭합니다.


그림 22-9 EC2 인스턴스에 사용할 키 설정

CloudFormation 스택을 생성할 때 사용할 옵션입니다(그림 22-9).

  • Tags: CloudFormation 스택의 태그입니다. 기본값 그대로 비워둡니다.
  • Advanced: 추가 옵션입니다. 이번에는 따로 설정하지 않고, 각 항목 설명만 하겠습니다.
    • Notification options: CloudFormation 스택 이벤트가 발생하면 SNS로 알림을 보냅니다.
    • Timeout: CloudFormation 스택 생성을 시작하고 여기에 설정한 시간(분) 이상 지나면 스택 생성에 실패한 것으로 보고, 모든 AWS 리소스와 설정을 되돌립니다. 기본적으로 Timeout 값이 설정되어 있지 않으므로 스택 생성이 성공할 때까지 기다립니다.
    • Rollback on failure: CloudFormation 스택을 생성하다가 중간에 실패하면 AWS 리소스와 설정을 되돌립니다.
    • Stack policy: CloudFormation 스택 업데이트 정책입니다. 실수로 생성된 스택의 설정을 변경하지 않도록 할 수 있습니다. 자세한 내용은 다음 링크를 참조하기 바랍니다.
      http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/protect-stack-resources.html

Next 버튼을 클릭합니다.


그림 22-10 CloudFormation 스택 생성 옵션

지금까지 설정한 내용에 이상이 없는지 확인합니다. 이상이 없으면 Create 버튼을 클릭합니다.


그림 22-11 CloudFormation 스택 설정 확인

CloudFormation 스택 목록에 CloudFormation 스택(httpd)이 생성되었습니다. Status를 보면 CREATE_IN_PROGRESS로 나오며 AWS 리소스를 생성하고 설정하고 있습니다. 완전히 생성되는 시간은 AWS 리소스의 종류와 개수에 따라 달라집니다.


그림 22-12 CloudFormation 스택 생성 중

CloudFormation 스택 생성이 완료된 뒤 Output 탭을 클릭하면 생성된 EC2 인스턴스의 ID가 표시됩니다. 템플릿에서 Output 부분에 설정한 내용이 이곳에 표시됩니다.


그림 22-13 CloudFormation 스택 생성 완료

EC2 인스턴스 목록(INSTANCES → Instances)에 CloudFormation이 생성한 EC2 인스턴스가 추가되었습니다. 위 CloudFormation 스택 Outputs에 나온 인스턴스 ID와 같습니다. 그리고 아래 세부 내용을 보면 Security groups에 템플릿에서 정의한 InstanceSecurityGroup이 설정되었습니다.


그림 22-14 생성된 EC2 인스턴스 확인

웹 브라우저를 실행하고 그림 22-14에 표시된 EC2 인스턴스의 Public IP에 접속합니다. 아파치 웹 서버(httpd)의 기본 웹 페이지 내용이 표시됩니다.


그림 22-15 CloudFormation으로 생성한 EC2 인스턴스에 접속

이처럼 CloudFormation 템플릿으로 AWS 리소스를 조합한 CloudFormation 스택을 생성할 수 있습니다. CloudFormation 스택을 삭제하면 지금까지 생성된 AWS 리소스는 모두 삭제됩니다. CloudFormation 스택에 포함된 EC2 인스턴스 등의 유형을 변경하거나 AWS 리소스의 설정을 변경하고 싶으면 스택 업데이트 기능을 사용하면 됩니다. 템플릿의 내용을 수정한 뒤 Update Stack 버튼을 클릭하고 해당 템플릿을 선택하면 됩니다. 설정 화면은 스택 생성과 동일합니다. 예를 들면 CloudFormation 스택으로 EC2 인스턴스를 100개 만든 뒤 EC2 인스턴스 유형을 변경하면, 새 EC2 인스턴스 100개가 모두 생성되고 나서 기존 EC2 인스턴스 100개가 동시에 삭제됩니다.

스택 업데이트 기능은 많은 AWS 리소스의 설정을 일괄적으로 변경할 때 유용합니다. 설정 한두 개를 변경할 때에는 AWS 콘솔의 해당 AWS 리소스 페이지에서 직접 설정을 변경해도 됩니다.


저작권 안내

이 웹사이트에 게시된 모든 글의 무단 복제 및 도용을 금지합니다.
  • 블로그, 게시판 등에 퍼가는 것을 금지합니다.
  • 비공개 포스트에 퍼가는 것을 금지합니다.
  • 글 내용, 그림을 발췌 및 요약하는 것을 금지합니다.
  • 링크 및 SNS 공유는 허용합니다.