연습: AWS CloudFormation Designer를 사용하여 스택의 템플릿 수정 - AWS CloudFormation

연습: AWS CloudFormation Designer를 사용하여 스택의 템플릿 수정

AWS CloudFormation Designer를 사용하여 스택의 템플릿을 수정한 다음 AWS CloudFormation에 제출해 스택을 업데이트할 수 있습니다. 일반적으로 스택 수정 시 템플릿의 사본을 가져와 텍스트 편집기에서 템플릿을 수정한 다음 CloudFormation을 사용해 스택을 업데이트해야 합니다. AWS CloudFormation Designer에서는 실행 중인 스택의 템플릿 사본을 빠르게 가져와 수정한 다음 콘솔을 종료하지 않고 스택을 업데이트할 수 있습니다.

이 연습에서는 기본 웹 서버로 시작한 다음 웹 서버를 확장 가능하고 내구성이 뛰어나도록 수정합니다.

이 연습에서는 다음 단계를 수행합니다.

  1. 스택 템플릿을 가져옵니다.

    실행 중인 스택의 템플릿 사본을 가져옵니다. 다음 연습: AWS CloudFormation Designer를 사용하여 기본 웹 서버 생성 연습의 기본 웹 서버 스택과 동일합니다.

  2. 템플릿을 수정합니다.

    AWS CloudFormation Designer를 사용하여 스택의 템플릿을 수정하는 데, EC2 인스턴스를 오토 스케일링 및 Elastic Load Balancing 로드 밸런서로 대체해 웹 사이트를 확장 가능하고 내구성이 뛰어나도록 만듭니다.

  3. 스택을 업데이트합니다.

    수정 사항을 저장한 후 수정된 템플릿으로 기본 웹 서버 스택을 업데이트합니다.

    참고

    CloudFormation이 무료 서비스이긴 하지만 스택에 포함시키는 AWS 리소스에 대해서는 리소스별 현재 시세로 요금이 청구됩니다. AWS 요금에 대한 자세한 내용을 알아보려면 http://aws.amazon.com의 제품별 세부 정보 페이지를 참조하세요.

  4. 스택을 삭제합니다.

    스택을 삭제해 모든 리소스를 정리합니다.

필수 조건

이 연습에서는 여러분에게 Amazon Virtual Private Cloud(Amazon VPC), Auto Scaling, Elastic Load Balancing 및 CloudFormation에 대한 유효한 지식이 있다고 가정합니다. 맥락을 파악할 수 있도록 각 절차에서는 각 리소스에 대한 몇 가지 기본 정보를 제공합니다.

또한 다음 연습: AWS CloudFormation Designer를 사용하여 기본 웹 서버 생성 연습을 완료했다고 가정합니다. 해당 연습을 완료했으면 BasicWebServerStack라는 실행 중인 스택이 있어야 합니다.

1단계: 스택 템플릿 가져오기

이 단계에서는 AWS CloudFormation Designer를 사용해 실행 중인 스택의 템플릿 사본을 가져와 엽니다.

실행 중인 스택의 템플릿 사본을 가져오려면
  1. https://console.aws.amazon.com/cloudformation/에서 CloudFormation 콘솔을 엽니다.

  2. 스택 목록에서 BasicWebServerStack을 선택합니다.

  3. 작업을 선택한 다음 Designer에서 템플릿 보기/편집을 선택합니다.

CloudFormation에서는 BasicWebServerStack 스택의 템플릿 사본을 가져와 AWS CloudFormation Designer에 표시합니다. 여기서 템플릿 리소스와 그 관계를 볼 수 있습니다. 다음 단계에서는 AWS CloudFormation Designer를 사용하여 템플릿을 수정합니다.

2단계: 템플릿 수정

AWS CloudFormation Designer의 끌어 놓기 인터페이스와 통합 JSON 및 YAML 편집기에서 Amazon EC2 인스턴스 하나를 오토 스케일링 및 로드 밸런서로 바꾸어 기본 웹 서버 템플릿을 수정하고 웹 사이트를 확장 가능하게 만들 것입니다. 웹 사이트에 대한 트래픽이 갑자기 증가한 경우에는 Auto Scaling을 사용해 웹 서버의 수를 빠르게 늘립니다. 로드 밸런서는 인스턴스 간에 균등하게 트래픽을 분산합니다.

스택 템플릿을 수정하려면
  1. WebServerInstance 리소스를 제거합니다.

    1. WebServerInstance 리소스를 마우스 오른쪽 버튼으로 클릭합니다.

    2. 리소스 메뉴에서 삭제( )를 선택합니다.

    3. [OK]를 선택하여 확인합니다.

  2. 리소스 유형 창에서 PublicSubnet 리소스에 AutoScalingGroup, LaunchConfigurationLoadBalancer 리소스를 추가합니다. 리소스를 추가하기 전에 서브넷을 확장해 리소스를 모두 포함해야 합니다.

    리소스는 리소스 범주별로 구성됩니다. Auto Scaling 그룹 및 시작 구성은 AutoScaling 범주에 속하며 로드 밸런서는 ElasticLoadBalancing 범주에 속합니다.

    참고

    이러한 리소스는 컨테이너 모델을 따르지 않으므로 AWS CloudFormation Designer에서는 해당 리소스를 서브넷과 자동으로 연결하지 않습니다. 연결은 이 단계의 후반부에서 생성합니다.

  3. 리소스 유형 창의 EC2 범주에서 SecurityGroup 리소스를 서브넷을 제외한 VPC의 아무 위치에 추가합니다.

    이 보안 그룹이 로드 밸런서의 인바운드 및 아웃바운드 트래픽을 제어합니다.

  4. 쉽게 식별할 수 있도록 다음과 같이 리소스의 이름을 바꿉니다.

    • AutoScalingGroupWebServerFleet으로 바꿉니다.

    • LaunchConfigurationWebServerLaunchConfig로 바꿉니다.

    • LoadBalancerPublicElasticLoadBalancer로 바꿉니다.

    • SecurityGroupPublicLoadBalancerSecurityGroup으로 바꿉니다.

  5. 추가한 리소스에 대한 연결을 생성합니다.

    1. 다음과 같이 로드 밸런서와 Auto Scaling 그룹 리소스를 퍼블릭 서브넷과 연결합니다.

      • PublicElasticLoadBalancer 리소스에서 AWS::EC2::Subnet (Property: Subnets) 연결을 PublicSubnet 리소스로 끕니다.

      • WebServerFleet 리소스에서 AWS::EC2::Subnet (Property: VPCZoneIdentifier) 연결을 PublicSubnet 리소스로 끕니다.

    2. 다음과 같이 로드 밸런서를 해당 보안 그룹과 연결합니다.

      • PublicElasticLoadBalancer 리소스에서 AWS::EC2::SecurityGroup (Property: SecurityGroups) 연결을 PublicLoadBalancerSecurityGroup 리소스로 끕니다.

    3. 다음과 같이 Auto Scaling 그룹을 로드 밸런서 및 시작 구성과 연결합니다.

      • WebServerFleet 리소스에서 AWS::ElasticLoadBalancing::LoadBalancer (Property: LoadBalancerNames) 연결을 PublicElasticLoadBalancer 리소스로 끕니다.

      • WebServerFleet 리소스에서 AWS::ElasticLoadBalancing::LaunchConfiguration (Property: LaunchConfigurationName) 연결을 WebServerLaunchConfig 리소스로 끕니다.

    4. 다음과 같이 시작 구성을 보안 그룹과 연결해야 합니다.

      • WebServerLaunchConfig 리소스에서 AWS::EC2::SecurityGroup (Property: SecurityGroups) 연결을 WebServerSecurityGroup 리소스로 끕니다.

    5. 다음과 같이 퍼블릭 라우팅에 대한 Auto Scaling 그룹의 종속성을 정의합니다.

      • WebServerFleet 리소스에서 DependsOn 연결을 PublicRoute 리소스로 끕니다.

      이러한 종속성은 퍼블릭 라우팅이 완료될 때까지 CloudFormation에서 WebServerFleet 리소스를 생성하지 않음을 의미합니다. 그렇지 않고 웹 서버 인스턴스 시작 시 퍼블릭 라우팅을 사용할 수 없으면 웹 서버 인스턴스는 구성 및 애플리케이션 배포가 완료된 경우 (cfn-signal 헬퍼 스크립트를 사용하여) 신호를 보내 CloudFormation에 이를 알릴 수 없습니다.

  6. 추가한 리소스의 속성을 지정합니다.

    1. AWS CloudFormation Designer 캔버스에서 PublicElasticLoadBalancer 리소스를 선택합니다.

    2. 통합 편집기 창에서 속성 탭을 선택하고 다음 코드 조각을 복사하여 속성 중괄호({}) 사이에 붙여 넣습니다.

      AWS CloudFormation Designer에서 보안 그룹 및 서브넷 연결을 자동으로 추가했으므로 ListenersHealthCheck 속성만 추가해야 합니다. Listeners 속성은 트래픽을 수신하는 위치와 트래픽 유형을 지정하고, HealthCheck 속성은 로드 밸런서의 상태를 결정하기 위한 설정을 설명합니다.

      JSON

      "Listeners": [ { "LoadBalancerPort": "80", "InstancePort": "80", "Protocol": "HTTP" } ], "HealthCheck": { "Target": "HTTP:80/", "HealthyThreshold": "3", "UnhealthyThreshold": "5", "Interval": "90", "Timeout": "60" }, "SecurityGroups": [ { "Ref": "PublicLoadBalancerSecurityGroup" } ], "Subnets": [ { "Ref": "PublicSubnet" } ]

      YAML

      Listeners: - LoadBalancerPort: '80' InstancePort: '80' Protocol: HTTP HealthCheck: Target: 'HTTP:80/' HealthyThreshold: '3' UnhealthyThreshold: '5' Interval: '90' Timeout: '60' SecurityGroups: - !Ref PublicLoadBalancerSecurityGroup Subnets: - !Ref PublicSubnet
    3. 다음 리소스에 대해 이 절차를 반복합니다.

      WebServerFleet

      MaxSize, MinSizeDesiredCapacity 속성이 추가되었습니다. 이러한 속성은 Auto Scaling 그룹에서 시작할 수 있는 최소 및 최대 인스턴스 수와 시작할 최초 인스턴스 수를 지정합니다. 원하는 용량 값은 이 절차의 후반부에서 추가할 새 파라미터를 참조합니다.

      JSON

      "MinSize": "1", "MaxSize": "10", "DesiredCapacity": { "Ref": "WebServerCount" }, "VPCZoneIdentifier": [ { "Ref": "PublicSubnet" } ], "LaunchConfigurationName": { "Ref": "WebServerLaunchConfig" }, "LoadBalancerNames": [ { "Ref": "PublicElasticLoadBalancer" } ]

      YAML

      MinSize: '1' MaxSize: '10' DesiredCapacity: !Ref WebServerCount VPCZoneIdentifier: - !Ref PublicSubnet LaunchConfigurationName: !Ref WebServerLaunchConfig LoadBalancerNames: - !Ref PublicElasticLoadBalancer
      PublicLoadBalancerSecurityGroup

      로드 밸런서에 도달해 로드 밸런서에서 나갈 수 있는 트래픽을 결정하는 다음 인바운드 및 아웃바운드 규칙을 추가합니다. 이러한 규칙은 모든 HTTP 트래픽이 로드 밸런서에 도달해 로드 밸런서에서 나갈 수 있도록 허용합니다.

      JSON

      "GroupDescription": "Public Elastic Load Balancing security group with HTTP access on port 80 from the Internet", "SecurityGroupIngress": [ { "IpProtocol": "tcp", "FromPort": 80, "ToPort": 80, "CidrIp": "0.0.0.0/0" } ], "SecurityGroupEgress": [ { "IpProtocol": "tcp", "FromPort": 80, "ToPort": 80, "CidrIp": "0.0.0.0/0" } ], "VpcId": { "Ref": "VPC" }

      YAML

      GroupDescription: >- Public Elastic Load Balancing security group with HTTP access on port 80 from the Internet SecurityGroupIngress: - IpProtocol: tcp FromPort: 80 ToPort: 80 CidrIp: 0.0.0.0/0 SecurityGroupEgress: - IpProtocol: tcp FromPort: 80 ToPort: 80 CidrIp: 0.0.0.0/0 VpcId: !Ref VPC
      WebServerSecurityGroup

      로드 밸런서에서의 트래픽만 허용하도록 HTTP 인바운드 규칙을 수정합니다.

      JSON

      "GroupDescription": "Allow access from load balancer and SSH traffic", "SecurityGroupIngress": [ { "IpProtocol": "tcp", "FromPort": 80, "ToPort": 80, "SourceSecurityGroupId": { "Ref": "PublicLoadBalancerSecurityGroup" } }, { "IpProtocol": "tcp", "FromPort": 22, "ToPort": 22, "CidrIp": { "Ref": "SSHLocation" } } ], "VpcId": { "Ref": "VPC" }

      YAML

      VpcId: !Ref VPC GroupDescription: Allow access from load balancer and SSH traffic SecurityGroupIngress: - IpProtocol: tcp FromPort: 80 ToPort: 80 SourceSecurityGroupId: !Ref PublicLoadBalancerSecurityGroup - IpProtocol: tcp FromPort: 22 ToPort: 22 CidrIp: !Ref SSHLocation
      WebServerLaunchConfig

      시작 구성에서는 여러 가지 속성을 지정해야 하므로, 그 중 몇 가지만 중점적으로 다루겠습니다. InstanceTypeImageId 속성은 템플릿에 이미 지정되어 있는 파라미터와 매핑 값을 사용합니다. 스택을 생성할 때 인스턴스 유형을 파라미터 값으로 지정합니다. ImageId 값은 지정한 스택의 리전과 인스턴스 유형.을 기반으로 하는 매핑입니다.

      UserData 속성에서는 인스턴스가 시작된 후 실행할 구성 스크립트를 지정합니다. 구성 정보는 인스턴스의 메타데이터에 정의되며 이 메타데이터는 다음 단계에서 추가합니다.

      JSON

      "InstanceType": { "Ref": "InstanceType" }, "ImageId": { "Fn::FindInMap": [ "AWSRegionArch2AMI", { "Ref": "AWS::Region" }, { "Fn::FindInMap": [ "AWSInstanceType2Arch", { "Ref": "InstanceType" }, "Arch" ] } ] }, "KeyName": { "Ref": "KeyName" }, "AssociatePublicIpAddress": "true", "UserData": { "Fn::Base64": { "Fn::Join": [ "", [ "#!/bin/bash -xe\n", "yum install -y aws-cfn-bootstrap\n", "# Install the files and packages from the metadata\n", "/opt/aws/bin/cfn-init -v ", " --stack ", { "Ref": "AWS::StackName" }, " --resource WebServerLaunchConfig ", " --configsets All ", " --region ", { "Ref": "AWS::Region" }, "\n", "# Signal the status from cfn-init\n", "/opt/aws/bin/cfn-signal -e $? ", " --stack ", { "Ref": "AWS::StackName" }, " --resource WebServerFleet ", " --region ", { "Ref": "AWS::Region" }, "\n" ] ] } }, "SecurityGroups": [ { "Ref": "WebServerSecurityGroup" } ]

      YAML

      InstanceType: !Ref InstanceType ImageId: !FindInMap - AWSRegionArch2AMI - !Ref 'AWS::Region' - !FindInMap - AWSInstanceType2Arch - !Ref InstanceType - Arch KeyName: !Ref KeyName AssociatePublicIpAddress: 'true' UserData: !Base64 'Fn::Join': - '' - - | #!/bin/bash -xe - | yum install -y aws-cfn-bootstrap - | # Install the files and packages from the metadata - '/opt/aws/bin/cfn-init -v ' - ' --stack ' - !Ref 'AWS::StackName' - ' --resource WebServerLaunchConfig ' - ' --configsets All ' - ' --region ' - !Ref 'AWS::Region' - |+ - | # Signal the status from cfn-init - '/opt/aws/bin/cfn-signal -e $? ' - ' --stack ' - !Ref 'AWS::StackName' - ' --resource WebServerFleet ' - ' --region ' - !Ref 'AWS::Region' - |+ SecurityGroups: - !Ref WebServerSecurityGroup
  7. WebServerLaunchConfig 리소스에 cfn-init 헬퍼 스크립트에 웹 서버를 시작하고 기본 웹 페이지를 생성하도록 지시하는 시작 구성 메타데이터를 추가합니다.

    1. WebServerLaunchConfig 리소스를 선택한 다음 통합 편집기에서 메타데이터 탭을 선택합니다.

    2. 템플릿을 JSON 형식으로 작성하는 경우: Metadata 중괄호({}) 내부와 AWS::CloudFormation::Designer 닫는 중괄호 뒤에 쉼표(,)를 추가합니다.

    3. AWS::CloudFormation::Designer 속성 뒤에 다음 코드 조각을 추가하여 cfn-init 헬퍼 스크립트가 웹 서버를 시작하고 기본 웹 페이지를 생성하도록 지시합니다.

      JSON

      "AWS::CloudFormation::Init" : { "configSets" : { "All" : [ "ConfigureSampleApp" ] }, "ConfigureSampleApp" : { "packages" : { "yum" : { "httpd" : [] } }, "files" : { "/var/www/html/index.html" : { "content" : { "Fn::Join" : ["\n", [ "<h1>Congratulations, you have successfully launched the AWS CloudFormation sample.</h1>" ]]}, "mode" : "000644", "owner" : "root", "group" : "root" } }, "services" : { "sysvinit" : { "httpd" : { "enabled" : "true", "ensureRunning" : "true" } } } } }

      YAML

      'AWS::CloudFormation::Init': configSets: All: - ConfigureSampleApp ConfigureSampleApp: packages: yum: httpd: [] files: /var/www/html/index.html: content: !Join - |+ - - >- <h1>Congratulations, you have successfully launched the AWS CloudFormation sample.</h1> mode: '000644' owner: root group: root services: sysvinit: httpd: enabled: 'true' ensureRunning: 'true'
  8. WebServerCount 파라미터를 추가합니다. 이 파라미터는 CloudFormation에서 Auto Scaling 그룹을 생성하는 경우 생성할 인스턴스 수를 지정합니다.

    1. AWS CloudFormation Designer 캔버스에서 빈 공간을 선택합니다.

    2. 통합 편집기 창에서 파라미터 탭을 선택합니다.

    3. 통합 편집기에서 다음 파라미터를 추가합니다. 템플릿을 JSON 형식으로 작성하는 경우 필요에 따라 쉼표를 추가합니다.

      JSON

      "WebServerCount": { "Description": "Number of Amazon EC2 instances to launch for the WebServer server", "Type": "Number", "Default": "1" }

      YAML

      WebServerCount: Description: Number of Amazon EC2 instances to launch for the WebServer server Type: Number Default: '1'
  9. 로드 밸런서의 DNS 이름을 표시하도록 템플릿 출력을 수정합니다.

    1. 통합 편집기 창에서 출력 탭을 선택합니다.

    2. 다음 코드 조각에 표시된 것처럼 로드 밸런서 DNS 이름을 사용하도록 JSON을 수정합니다.

      JSON

      { "Outputs": { "URL": { "Value": { "Fn::GetAtt": [ "PublicElasticLoadBalancer", "DNSName" ] }, "Description": "Newly created application URL" } } }

      템플릿을 YAML 형식으로 작성 중인 경우 다음 코드 조각을 사용하십시오.

      Outputs: URL: Value: !GetAtt - PublicElasticLoadBalancer - DNSName Description: Newly created application URL
  10. AWS CloudFormation Designer 도구 모음에서 Validate template(템플릿 확인)( )을 선택하여 템플릿의 구문 오류를 검사합니다.

    메시지 창에서 오류를 확인해 수정한 다음 템플릿을 다시 확인합니다. 오류가 보이지 않으면 템플릿이 구문상 유효한 것입니다.

  11. AWS CloudFormation Designer 도구 모음에서 File(파일)( )을 선택한 다음 Save(저장)를 선택하여 템플릿을 로컬 저장합니다.

이제 기본 웹 서버 스택을 업데이트하는 데 사용할 수 있는 수정된 CloudFormation 템플릿이 생겼습니다. 다음 단계에서는 이 템플릿을 사용하여 기본 웹 서버 스택을 업데이트합니다.

3단계: 스택 업데이트

템플릿 변경 사항을 구현하려면 기본 웹 서버 스택을 업데이트해야 합니다. AWS CloudFormation Designer에서 CloudFormation 스택 업데이트 마법사를 직접 시작할 수 있습니다.

스택을 업데이트하려면
  1. AWS CloudFormation Designer 도구 모음에서 Create Stack(스택 생성)( )을 선택합니다.

    AWS CloudFormation Designer에서는 열려 있는 템플릿을 S3 버킷에 저장한 다음 CloudFormation 스택 업데이트 마법사를 시작합니다. BasicWebServerStack 스택의 템플릿을 수정했으므로 CloudFormation에서 해당 스택에 대한 스택 업데이트 마법사가 시작됩니다.

  2. CloudFormation에서는 템플릿 URL을 자동으로 채웁니다. [다음(Next)]을 선택합니다.

  3. 스택 섹션의 이름 필드에서 스택의 이름이 BasicWebServerStack인지 확인합니다.

  4. 파라미터 섹션에서 기존 값을 사용하고 다음을 선택합니다.

  5. 이 연습에서는 태그를 추가하거나 고급 설정을 지정할 필요가 없으므로 다음을 선택합니다.

  6. 스택 이름이 올바른지 확인한 다음 업데이트를 선택합니다.

CloudFormation에서 스택을 업데이트하는 데 몇 분 정도 걸릴 수 있습니다. 진행 상황을 모니터링하려면 스택 이벤트를 확인합니다. 자세한 내용은 AWS Management Console에서 AWS CloudFormation 스택 데이터 및 리소스 보기 단원을 참조하십시오. 스택이 업데이트되면 스택 출력을 보고 웹 사이트 URL로 이동해 웹 사이트가 실행 중인지 확인합니다. 자세한 내용은 AWS Management Console에서 AWS CloudFormation 스택 데이터 및 리소스 보기 단원을 참조하십시오. AWS CloudFormation Designer를 사용해 성공적으로 템플릿 및 스택을 업데이트했습니다.

원치 않는 서비스에 대해 요금이 청구되지 않도록 하기 위해 스택을 삭제할 수 있습니다.

4단계: 리소스 정리

원치 않는 서비스에 대해 요금이 청구되지 않도록 하려면 스택과 해당 리소스를 삭제합니다.

스택을 삭제하려면
  1. CloudFormation 콘솔에서 BasicWebServerStack 스택을 선택합니다.

  2. [스택 삭제]를 선택합니다.

  3. 확인 메시지에서 예, 삭제를 선택합니다.

CloudFormation에서 스택을 삭제하는 데 몇 분 정도 걸릴 수 있습니다. 진행 상황을 모니터링하려면 스택 이벤트를 확인합니다. 스택이 삭제되면 생성한 모든 리소스가 삭제됩니다. 이제 AWS CloudFormation Designer를 사용하는 방법을 이해했으므로 이를 사용하여 고유한 템플릿을 작성하고 수정할 수 있게 되었습니다.