Skip to main content

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

About 2 mincrashcoursepyrasisawsamazon-web-services

22E. CloudFormation 템플릿으로 CloudFormation 스택 생성하기 관련

목차

아마존 웹 서비스를 다루는 기술

22장 - 5. 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의 <FontIcon icon="iconfont icon-select"/>를 클릭합니다.
AWS 콘솔로 접속한 뒤 메인 화면에서 Deployment& Management의 [CloudFormation]를 클릭합니다.

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

Tokyo 리전을 사용하겠습니다.
Tokyo 리전을 사용하겠습니다.

생성한 CloudFormation 스택이 하나도 없을 때 페이지가 표시됩니다.

<FontIcon icon="iconfont icon-select"/> 버튼을 클릭합니다.
[Create New Stack] 버튼을 클릭합니다.

CloudFormation 템플릿으로 CloudFormation 스택을 생성합니다.

  • 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 버킷에 저장된 템플릿 파일의 경로입니다.
CloudFormation 스택 생성
CloudFormation 스택 생성

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

CloudFormation 템플릿 파일 선택
CloudFormation 템플릿 파일 선택

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

이제 <FontIcon icon="iconfont icon-select"/> 버튼을 클릭합니다.
이제 [Next] 버튼을 클릭합니다.

CloudFormation 스택을 생성할 때 사용할 옵션입니다.

  • 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.htmlopen in new window

<FontIcon icon="iconfont icon-select"/> 버튼을 클릭합니다.
[Next] 버튼을 클릭합니다.

지금까지 설정한 내용에 이상이 없는지 확인합니다.

이상이 없으면 <FontIcon icon="iconfont icon-select"/> 버튼을 클릭합니다.
이상이 없으면 [Create] 버튼을 클릭합니다.

CloudFormation 스택 목록에 CloudFormation 스택(httpd)이 생성되었습니다.

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

CloudFormation 스택 생성이 완료된 뒤 Output 탭을 클릭하면 생성된 EC2 인스턴스의 ID가 표시됩니다.

템플릿에서 Output 부분에 설정한 내용이 이곳에 표시됩니다.
템플릿에서 Output 부분에 설정한 내용이 이곳에 표시됩니다.

EC2 인스턴스 목록([INSTANCES][Instances])에 CloudFormation이 생성한 EC2 인스턴스가 추가되었습니다. 위 CloudFormation 스택 Outputs에 나온 인스턴스 ID와 같습니다.

그리고 아래 세부 내용을 보면 Security groups에 템플릿에서 정의한 InstanceSecurityGroup이 설정되었습니다.
그리고 아래 세부 내용을 보면 Security groups에 템플릿에서 정의한 InstanceSecurityGroup이 설정되었습니다.

웹 브라우저를 실행하고 EC2 인스턴스의 Public IP에 접속합니다.

아파치 웹 서버(httpd)의 기본 웹 페이지 내용이 표시됩니다.
아파치 웹 서버(httpd)의 기본 웹 페이지 내용이 표시됩니다.

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

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


이찬희 (MarkiiimarK)
Never Stop Learning.