CloudFormation 스택 업데이트 - AWS CloudFormation

CloudFormation 스택 업데이트

참고

이 자습서는 Amazon EC2에 애플리케이션 배포 자습서에 제공된 개념을 기반으로 합니다. 이 자습서를 완료하지 않은 경우 먼저 CloudFormation에서 EC2 부트스트래핑을 이해하는 것이 좋습니다.

이 주제에서는 실행 중인 스택에 대한 간단한 업데이트 진행 상황을 보여줍니다. 다음 단계를 살펴보겠습니다.

  1. 초기 스택 생성 – 기본 Amazon Linux 2 AMI를 사용하여 스택을 생성하고, CloudFormation 헬퍼 스크립트를 사용하여 Apache Web Server 및 간단한 PHP 애플리케이션을 설치합니다.

  2. 애플리케이션 업데이트 - CloudFormation을 사용하여 애플리케이션의 파일 중 하나를 업데이트하고 소프트웨어를 배포합니다.

  3. 키 페어 추가 - Amazon EC2 키 페어를 인스턴스에 추가한 다음, 인스턴스에 대한 SSH 액세스를 허용하도록 보안 그룹을 업데이트합니다.

  4. 인스턴스 유형 업데이트 - 기존 Amazon EC2 인스턴스의 인스턴스 유형을 변경합니다.

  5. AMI 업데이트 - 스택에서 Amazon EC2 인스턴스용 Amazon Machine Image(AMI)를 변경합니다.

참고

CloudFormation은 무료이지만 생성하는 Amazon EC2 리소스에 대해서는 요금이 부과됩니다. 그러나 AWS를 처음 사용하는 경우 프리 티어를 활용하여 이 학습 프로세스 중에 비용을 최소화하거나 제거할 수 있습니다.

1단계: 초기 스택 생성

이 주제의 나머지 부분에서 사용할 수 있는 스택을 생성하는 것부터 시작합니다. 간단한 템플릿 하나를 제공했습니다. 이 템플릿은 Apache Web Server에 호스팅되고 Amazon Linux 2 AMI에서 실행 중인 단일 인스턴스 PHP 웹 애플리케이션을 시작합니다.

Apache Web Server, PHP 및 간단한 PHP 애플리케이션은 기본적으로 Amazon Linux 2 AMI에 설치되는 CloudFormation 헬퍼 스크립트를 통해 모두 설치됩니다. 다음 템플릿 코드 조각에서는 설치할 패키지와 파일(여기서는 Amazon Linux 2 AMI용 Yum 리포지토리의 Apache Web Server 및 PHP 인프라)을 설명하는 메타데이터를 표시합니다. 이 코드 조각에서는 Apache Web Server가 실행 중임을 보장하는 Services 섹션도 보여줍니다.

WebServerInstance: Type: AWS::EC2::Instance Metadata: AWS::CloudFormation::Init: config: packages: yum: httpd: [] php: [] files: /var/www/html/index.php: content: | <?php echo '<h1>Hello World!</h1>'; ?> mode: '000644' owner: apache group: apache services: systemd: httpd: enabled: true ensureRunning: true

애플리케이션 자체는 전체가 템플릿 안에 정의되어 있는 'Hello World' 예제입니다. 실제 애플리케이션의 경우, 파일이 Amazon S3, GitHub 또는 다른 리포지토리에 저장되어 템플릿에서 참조될 수도 있습니다. CloudFormation은 패키지(예: RPM 또는 RubyGems)를 다운로드하고 개별 파일을 참조하며 .zip.tar 파일의 압축을 풀어서 Amazon EC2 인스턴스에 애플리케이션 아티팩트를 생성할 수 있습니다.

이 템플릿은 cfn-hup 대몬이 Amazon EC2 인스턴스에 대한 메타데이터에 정의된 구성의 변경 내용을 수신하도록 구성하고 활성화합니다. cfn-hup 대몬을 사용하여 Apache 또는 PHP 버전 등 애플리케이션 소프트웨어를 업데이트하거나 CloudFormation에서 PHP 애플리케이션 파일 자체를 업데이트할 수 있습니다. 템플릿의 동일한 Amazon EC2 리소스에서 가져온 다음 코드 조각에서는 메타데이터에 대한 업데이트를 확인하고 적용하기 위해 2분마다 cfn-init를 직접적으로 호출하도록 cfn-hup를 구성하는 데 필요한 부분을 보여줍니다. 그렇지 않으면 시작 시 cfn-init가 한 번만 실행됩니다.

files: /etc/cfn/cfn-hup.conf: content: !Sub | [main] stack=${AWS::StackId} region=${AWS::Region} # The interval used to check for changes to the resource metadata in minutes. Default is 15 interval=2 mode: '000400' owner: root group: root /etc/cfn/hooks.d/cfn-auto-reloader.conf: content: !Sub | [cfn-auto-reloader-hook] triggers=post.update path=Resources.WebServerInstance.Metadata.AWS::CloudFormation::Init action=/opt/aws/bin/cfn-init -s ${AWS::StackId} -r WebServerInstance --region ${AWS::Region} runas=root services: systemd: cfn-hup: enabled: true ensureRunning: true files: - /etc/cfn/cfn-hup.conf - /etc/cfn/hooks.d/cfn-auto-reloader.conf

스택을 완료하기 위해 Amazon EC2 인스턴스 정의의 Properties 섹션에서 UserData 속성에는 패키지 및 파일을 설치하기 위해 cfn-init를 직접적으로 호출하는 cloud-init 스크립트가 포함됩니다. 자세한 내용은 CloudFormation 템플릿 참조 가이드CloudFormation 헬퍼 스크립트 참조를 참조하세요. 템플릿은 Amazon EC2 보안 그룹도 생성합니다.

AWSTemplateFormatVersion: 2010-09-09 Parameters: LatestAmiId: Description: The latest Amazon Linux 2 AMI from the Parameter Store Type: AWS::SSM::Parameter::Value<AWS::EC2::Image::Id> Default: '/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2' InstanceType: Description: WebServer EC2 instance type Type: String Default: t3.micro AllowedValues: - t3.nano - t3.micro - t3.small - t3.medium - t3a.nano - t3a.micro - t3a.small - t3a.medium - m5.large - m5.xlarge - m5.2xlarge - m5a.large - m5a.xlarge - m5a.2xlarge - c5.large - c5.xlarge - c5.2xlarge - r5.large - r5.xlarge - r5.2xlarge - r5a.large - r5a.xlarge - r5a.2xlarge ConstraintDescription: must be a valid EC2 instance type. Resources: WebServerInstance: Type: AWS::EC2::Instance Properties: ImageId: !Ref LatestAmiId InstanceType: !Ref InstanceType SecurityGroupIds: - !Ref WebServerSecurityGroup UserData: Fn::Base64: !Sub | #!/bin/bash -xe # Get the latest CloudFormation package yum update -y aws-cfn-bootstrap # Run cfn-init /opt/aws/bin/cfn-init -v --stack ${AWS::StackName} --resource WebServerInstance --region ${AWS::Region} || error_exit 'Failed to run cfn-init' # Start up the cfn-hup daemon to listen for changes to the EC2 instance metadata /opt/aws/bin/cfn-hup || error_exit 'Failed to start cfn-hup' # Signal success or failure /opt/aws/bin/cfn-signal -e $? --stack ${AWS::StackName} --resource WebServerInstance --region ${AWS::Region} Metadata: AWS::CloudFormation::Init: config: packages: yum: httpd: [] php: [] files: /var/www/html/index.php: content: | <?php echo "<h1>Hello World!</h1>"; ?> mode: '000644' owner: apache group: apache /etc/cfn/cfn-hup.conf: content: !Sub | [main] stack=${AWS::StackId} region=${AWS::Region} # The interval used to check for changes to the resource metadata in minutes. Default is 15 interval=2 mode: '000400' owner: root group: root /etc/cfn/hooks.d/cfn-auto-reloader.conf: content: !Sub | [cfn-auto-reloader-hook] triggers=post.update path=Resources.WebServerInstance.Metadata.AWS::CloudFormation::Init action=/opt/aws/bin/cfn-init -s ${AWS::StackId} -r WebServerInstance --region ${AWS::Region} runas=root services: systemd: httpd: enabled: true ensureRunning: true cfn-hup: enabled: true ensureRunning: true files: - /etc/cfn/cfn-hup.conf - /etc/cfn/hooks.d/cfn-auto-reloader.conf CreationPolicy: ResourceSignal: Timeout: PT5M WebServerSecurityGroup: Type: AWS::EC2::SecurityGroup Properties: GroupDescription: Enable HTTP access via port 80 SecurityGroupIngress: - IpProtocol: tcp FromPort: 80 ToPort: 80 CidrIp: 0.0.0.0/0 Outputs: WebsiteURL: Value: !Sub 'http://${WebServerInstance.PublicDnsName}' Description: URL of the web application
이 템플릿에서 스택을 시작하는 방법
  1. 템플릿을 복사하여 텍스트 파일로 시스템에 로컬로 저장하세요. 이후 단계에서는 이 파일을 사용해야 하므로 이 위치를 적어둡니다.

  2. AWS Management Console에 로그인하여 https://console.aws.amazon.com/cloudformation에서 CloudFormation 콘솔을 엽니다.

  3. 스택 생성, 새 리소스 사용(표준)을 선택하세요.

  4. 기존 템플릿 선택을 선택합니다.

  5. 템플릿 지정에서 템플릿 파일 업로드를 선택하고 첫 번째 단계에서 생성한 파일로 이동한 후 다음을 선택하세요.

  6. 스택 세부 정보 지정 페이지에서 스택 이름으로 UpdateTutorial을 입력하세요.

  7. 파라미터에서 모든 파라미터를 동일하게 유지하고 다음을 두 번 선택하세요.

  8. 검토 및 생성 화면에서 제출을 선택하세요.

스택 상태가 CREATE_COMPLETE가 된 후에는 출력 탭에 웹 사이트의 URL이 표시됩니다. WebsiteURL 출력 값을 선택하면 새 PHP 애플리케이션의 작동이 표시됩니다.

2단계: 애플리케이션 업데이트

이제 스택을 배포했으며, 애플리케이션을 업데이트하겠습니다. 애플리케이션에서 출력되는 텍스트를 조금 변경해 보겠습니다. 이렇게 하기 위해 이 템플릿 코드 조각에 표시된 대로 index.php 파일에 echo 명령을 추가하겠습니다.

files: /var/www/html/index.php: content: | <?php echo "<h1>Hello World!</h1>"; echo "<p>This is an updated version of our application.</p>"; ?> mode: '000644' owner: apache group: apache

텍스트 편집기를 사용하여 로컬로 저장한 템플릿 파일을 수동으로 편집합니다.

이제 스택을 업데이트하세요.

업데이트된 템플릿으로 스택을 업데이트하는 방법
  1. CloudFormation 콘솔에서 UpdateTutorial 스택을 선택하세요.

  2. 업데이트, 직접 업데이트를 선택하세요.

  3. 기존 템플릿 교체를 선택하세요.

  4. 템플릿 지정에서 템플릿 파일 업로드를 선택하고 템플릿을 업로드한 후 다음을 선택하세요.

  5. 스택 세부 정보 지정 페이지에서 모든 파라미터를 동일하게 유지하고 다음을 두 번 선택하세요.

  6. 검토 페이지에서 변경 내용을 검토하세요. 변경 내용에서 CloudFormation이 WebServerInstance 리소스를 업데이트함을 확인할 수 있습니다.

  7. 제출을 선택합니다.

스택이 UPDATE_COMPLETE 상태이면 WebsiteURL 출력 값을 다시 선택하여 애플리케이션에서 적용한 변경 내용을 확인합니다. cfn-hup 대몬은 2분마다 실행되므로 스택이 업데이트되고 나서 애플리케이션이 변경하는 데 최대 2분이 걸릴 수 있습니다.

업데이트된 리소스 세트를 확인하려면 CloudFormation 콘솔로 이동합니다. 이벤트 탭에서 스택 이벤트를 살펴봅니다. 이 특수한 경우에 Amazon EC2 인스턴스 WebServerInstance의 메타데이터가 업데이트되고, 이때 변경 내용이 없는지 확인하기 위해 CloudFormation에서 다른 리소스(WebServerSecurityGroup)를 다시 평가합니다. 다른 스택 리소스는 수정되지 않았습니다. CloudFormation은 스택 내에서 스택 변경에 영향을 받는 리소스만 업데이트합니다. 이러한 변경에는 속성이나 메타데이터 변경과 같은 직접적인 변경도 있고, Ref, GetAtt 또는 기타 내장 템플릿 함수를 통한 데이터 흐름이나 종속성으로 인한 간접적인 변경도 있을 수 있습니다. 자세한 내용은 내장 함수 참조를 참조하세요.

이 간단한 업데이트에서 프로세스를 보여줍니다. 그러나 Amazon EC2 인스턴스로 배포되는 파일 및 패키지에 대한 보다 복잡한 변경도 가능합니다. 예를 들면 MySQL에 대한 PHP 지원과 함께 인스턴스에 MySQL을 추가해야 할 수도 있습니다. 이렇게 하려면 추가 서비스와 함께 추가적인 패키지 및 파일을 구성에 추가하고 나서 변경 내용을 배포하도록 스택을 업데이트하기만 하면 됩니다.

packages: yum: httpd: [] php: [] mysql: [] php-mysql: [] mysql-server: [] mysql-libs: [] ... services: systemd: httpd: enabled: true ensureRunning: true cfn-hup: enabled: true ensureRunning: true files: - /etc/cfn/cfn-hup.conf - /etc/cfn/hooks.d/cfn-auto-reloader.conf mysqld: enabled: true ensureRunning: true

CloudFormation 메타데이터를 업데이트하여 애플리케이션에 사용되는 패키지의 새 버전으로 업데이트합니다. 이전 예제에서는 각 패키지의 버전 속성이 비어 있어서 cfn-init가 패키지의 최신 버전을 설치해야 했습니다.

packages: yum: httpd: [] php: []

원할 경우 패키지의 버전 문자열을 지정할 수 있습니다. 이후 업데이트 스택 직접 호출에서 버전 문자열을 변경하는 경우 패키지의 새 버전이 배포됩니다. 다음은 RubyGems 패키지의 버전 번호를 사용하는 예입니다. 버전 관리를 지원하는 패키지마다 특정 버전이 있을 수 있습니다.

packages: rubygems: mysql: [] rubygems-update: - "1.6.2" rake: - "0.8.7" rails: - "2.3.11"

3단계: 키 페어를 사용하여 SSH 액세스 추가

템플릿에 원래 지정되지 않았던 속성을 추가하도록 템플릿에서 리소스를 업데이트할 수도 있습니다. 이를 보여주기 위해 Amazon EC2 키 페어를 기존 EC2 인스턴스에 추가하고 나서 Amazon EC2 보안 그룹에서 포트 22를 열어 Secure Shell(SSH)을 사용해 인스턴스에 액세스할 수 있도록 하겠습니다.

Amazon EC2 인스턴스에 SSH 액세스를 추가하려면
  1. 템플릿에 기존 Amazon EC2 키 페어 및 SSH 위치의 이름을 전달할 추가 파라미터 두 개를 추가합니다.

    Parameters: KeyName: Description: Name of an existing EC2 KeyPair to enable SSH access to the instance Type: AWS::EC2::KeyPair::KeyName ConstraintDescription: must be the name of an existing EC2 KeyPair. SSHLocation: Description: The IP address that can be used to SSH to the EC2 instances in CIDR format (e.g. 203.0.113.1/32) Type: String MinLength: 9 MaxLength: 18 Default: 0.0.0.0/0 AllowedPattern: '^(\d{1,3}\.){3}\d{1,3}\/\d{1,2}$' ConstraintDescription: must be a valid IP CIDR range of the form x.x.x.x/x.
  2. KeyName 속성을 Amazon EC2 인스턴스에 추가합니다.

    WebServerInstance: Type: AWS::EC2::Instance Properties: ImageId: !Ref LatestAmiId InstanceType: !Ref InstanceType KeyName: !Ref KeyName SecurityGroupIds: - !Ref WebServerSecurityGroup
  3. 포트 22 및 SSH 위치를 Amazon EC2 보안 그룹의 수신 규칙에 추가합니다.

    WebServerSecurityGroup: Type: AWS::EC2::SecurityGroup Properties: GroupDescription: Enable HTTP access via port 80 and SSH access via port 22 SecurityGroupIngress: - IpProtocol: tcp FromPort: 80 ToPort: 80 CidrIp: 0.0.0.0/0 - IpProtocol: tcp FromPort: 22 ToPort: 22 CidrIp: !Ref SSHLocation
  4. 2단계: 애플리케이션 업데이트에 설명된 동일한 단계를 사용하여 스택을 업데이트합니다.

4단계: 인스턴스 유형 업데이트

이제 인스턴스 유형을 변경하여 기본 인프라를 업데이트하는 방법을 살펴보겠습니다.

지금까지 생성한 스택에는 t3.micro Amazon EC2 인스턴스가 사용됩니다. 새로 생성한 웹 사이트의 트래픽 양이 t3.micro 인스턴스에서 처리할 수 있는 것보다 점점 더 많아지고 있어서 m5.large Amazon EC2 인스턴스 유형으로 이동하려 한다고 가정합니다. 인스턴스 유형의 아키텍처가 변경되는 경우 다른 AMI로 인스턴스가 생성되어야 합니다. 그러나 t3.micro 및 m5.large 모두 동일한 CPU 아키텍처를 사용하고 Amazon Linux 2(x86_64) AMI를 실행합니다. 자세한 내용은 Amazon EC2 사용 설명서인스턴스 유형 변경을 위한 호환성을 참조하세요.

이전 단계에서 수정한 템플릿을 사용하여 인스턴스 유형을 변경해 보겠습니다. InstanceType이 템플릿에 대한 입력 파라미터이므로 템플릿을 수정할 필요가 없습니다. 스택 세부 정보 지정 페이지에서 파라미터 값을 변경할 수 있습니다.

스택을 새 파라미터 값으로 업데이트하는 방법
  1. CloudFormation 콘솔에서 UpdateTutorial 스택을 선택하세요.

  2. 업데이트, 직접 업데이트를 선택하세요.

  3. 현재 템플릿 사용을 선택하고 다음을 선택하세요.

  4. 스택 세부 정보 지정 페이지에서 InstanceType 텍스트 상자의 값을 t3.micro에서 m5.large로 변경하세요. 그리고 다음을 두 번 선택하세요.

  5. 검토 페이지에서 변경 내용을 검토하세요. 변경 내용에서 CloudFormation이 WebServerInstance 리소스를 업데이트함을 확인할 수 있습니다.

  6. 제출을 선택합니다.

인스턴스를 시작했다가 중지하여 EBS 지원 Amazon EC2 인스턴스의 인스턴스 유형을 동적으로 변경할 수 있습니다. CloudFormation에서는 인스턴스 유형을 업데이트하고 인스턴스를 다시 시작하여 변경을 최적화하려고 하므로 인스턴스 ID가 변경되지 않습니다. 하지만 인스턴스가 다시 시작되는 경우 인스턴스의 퍼블릭 IP 주소가 변경됩니다. 변경 후 탄력적 IP 주소가 올바르게 바인딩되도록 하기 위해 CloudFormation에서 탄력적 IP 주소도 업데이트합니다. CloudFormation 콘솔의 이벤트 탭에서 변경 내용을 확인할 수 있습니다.

AWS Management Console에서 인스턴스 유형을 확인하려면 Amazon EC2 콘솔을 열고 해당 인스턴스를 찾습니다.

5단계: AMI 업데이트

이제 차세대 Amazon Linux인 Amazon Linux 2023을 사용하도록 스택을 업데이트해 보겠습니다.

AMI 업데이트는 인스턴스를 교체해야 하는 주요 변경 사항입니다. AMI를 수정하기 위해 단순히 인스턴스를 시작했다가 중지할 수 없으므로 CloudFormation은 이 작업을 리소스의 변경 불가능 속성에 대한 변경으로 간주합니다. 변경 불가능한 속성을 변경하려면 CloudFormation에서 대체 리소스(이 경우에는 새 AMI를 실행 중인 Amazon EC2 인스턴스)를 시작해야 합니다.

Amazon Linux 2023을 사용하도록 스택 템플릿을 업데이트하는 방법을 살펴보겠습니다. 주요 변경 사항으로, AMI 파라미터 업데이트 및 yum에서 dnf 패키지 관리자로의 변경이 포함됩니다.

AWSTemplateFormatVersion: 2010-09-09 Parameters: LatestAmiId: Description: The latest Amazon Linux 2023 AMI from the Parameter Store Type: AWS::SSM::Parameter::Value<AWS::EC2::Image::Id> Default: '/aws/service/ami-amazon-linux-latest/al2023-ami-kernel-6.1-x86_64' InstanceType: Description: WebServer EC2 instance type Type: String Default: t3.micro AllowedValues: - t3.nano - t3.micro - t3.small - t3.medium - t3a.nano - t3a.micro - t3a.small - t3a.medium - m5.large - m5.xlarge - m5.2xlarge - m5a.large - m5a.xlarge - m5a.2xlarge - c5.large - c5.xlarge - c5.2xlarge - r5.large - r5.xlarge - r5.2xlarge - r5a.large - r5a.xlarge - r5a.2xlarge ConstraintDescription: must be a valid EC2 instance type. KeyName: Description: Name of an existing EC2 KeyPair to enable SSH access to the instance Type: AWS::EC2::KeyPair::KeyName ConstraintDescription: must be the name of an existing EC2 KeyPair. SSHLocation: Description: The IP address that can be used to SSH to the EC2 instances in CIDR format (e.g. 203.0.113.1/32) Type: String MinLength: 9 MaxLength: 18 Default: 0.0.0.0/0 AllowedPattern: '^(\d{1,3}\.){3}\d{1,3}\/\d{1,2}$' ConstraintDescription: must be a valid IP CIDR range of the form x.x.x.x/x. Resources: WebServerInstance: Type: AWS::EC2::Instance Properties: ImageId: !Ref LatestAmiId InstanceType: !Ref InstanceType KeyName: !Ref KeyName SecurityGroupIds: - !Ref WebServerSecurityGroup UserData: Fn::Base64: !Sub | #!/bin/bash -xe # Get the latest CloudFormation package dnf update -y aws-cfn-bootstrap # Run cfn-init /opt/aws/bin/cfn-init -v --stack ${AWS::StackName} --resource WebServerInstance --region ${AWS::Region} || error_exit 'Failed to run cfn-init' # Start up the cfn-hup daemon to listen for changes to the EC2 instance metadata /opt/aws/bin/cfn-hup || error_exit 'Failed to start cfn-hup' # Signal success or failure /opt/aws/bin/cfn-signal -e $? --stack ${AWS::StackName} --resource WebServerInstance --region ${AWS::Region} Metadata: AWS::CloudFormation::Init: config: packages: dnf: httpd: [] php: [] files: /var/www/html/index.php: content: | <?php echo "<h1>Hello World!</h1>"; echo "<p>This is an updated version of our application.</p>"; echo "<p>Running on Amazon Linux 2023!</p>"; ?> mode: '000644' owner: apache group: apache /etc/cfn/cfn-hup.conf: content: !Sub | [main] stack=${AWS::StackId} region=${AWS::Region} # The interval used to check for changes to the resource metadata in minutes. Default is 15 interval=2 mode: '000400' owner: root group: root /etc/cfn/hooks.d/cfn-auto-reloader.conf: content: !Sub | [cfn-auto-reloader-hook] triggers=post.update path=Resources.WebServerInstance.Metadata.AWS::CloudFormation::Init action=/opt/aws/bin/cfn-init -s ${AWS::StackId} -r WebServerInstance --region ${AWS::Region} runas=root services: systemd: httpd: enabled: true ensureRunning: true cfn-hup: enabled: true ensureRunning: true files: - /etc/cfn/cfn-hup.conf - /etc/cfn/hooks.d/cfn-auto-reloader.conf CreationPolicy: ResourceSignal: Timeout: PT5M WebServerSecurityGroup: Type: AWS::EC2::SecurityGroup Properties: GroupDescription: Enable HTTP access via port 80 and SSH access via port 22 SecurityGroupIngress: - IpProtocol: tcp FromPort: 80 ToPort: 80 CidrIp: 0.0.0.0/0 - IpProtocol: tcp FromPort: 22 ToPort: 22 CidrIp: !Ref SSHLocation Outputs: WebsiteURL: Value: !Sub 'http://${WebServerInstance.PublicDnsName}' Description: URL of the web application

2단계: 애플리케이션 업데이트에 설명된 동일한 단계를 사용하여 스택을 업데이트합니다.

새 인스턴스를 실행한 후에는 CloudFormation에서 새 리소스를 가리키도록 스택의 다른 리소스를 업데이트합니다. 새로운 모든 리소스가 생성되면 이전 리소스가 삭제되며, 이를 UPDATE_CLEANUP 프로세스라고 합니다. 현재는 업데이트의 결과로서 스택 내 인스턴스의 인스턴스 ID와 애플리케이션 URL이 변경되었습니다. 이벤트 테이블의 이벤트에는 리소스가 대체되었음을 나타내는 '요청된 업데이트에서 변경 불가능한 속성에 대한 변경을 포함하므로 새 물리적 리소스가 생성됨'이라는 설명이 포함됩니다.

또는 업데이트할 애플리케이션 코드를 AMI에 작성한 경우 새 애플리케이션을 로드하도록 동일한 스택 업데이트 메커니즘을 사용하여 AMI를 업데이트할 수 있습니다.

사용자 지정 애플리케이션 코드로 AMI를 업데이트하는 방법
  1. 애플리케이션이나 운영 체제 변경 내용을 포함하는 새 AMI를 생성하세요. 자세한 내용은 Amazon EC2 사용 설명서Amazon EBS 지원 AMI 생성을 참조하세요.

  2. 새 AMI ID를 통합하도록 템플릿을 업데이트합니다.

  3. 2단계: 애플리케이션 업데이트에 설명된 동일한 단계를 사용하여 스택을 업데이트합니다.

스택 업데이트 시, CloudFormation은 AMI ID가 변경되었음을 감지하고 나서 위에서 트리거했을 때와 동일한 방식으로 스택 업데이트를 시작합니다.

가용성 및 영향 고려 사항

속성마다 스택의 리소스에 미치는 영향이 다릅니다. CloudFormation을 사용하여 속성을 업데이트할 수 있지만, 변경하기 전에 다음 질문을 고려해야 합니다.

  1. 업데이트가 리소스 자체에 어떤 영향을 미치는가? 예를 들어 경보 임계값 업데이트는 업데이트 중에 경보를 비활성화합니다. 아시다시피, 인스턴스 유형을 변경하려면 인스턴스를 중지했다가 다시 시작해야 합니다. CloudFormation은 기본 리소스에 대해 업데이트 또는 수정 작업을 사용하여 리소스를 변경합니다. 업데이트 영향을 이해하려면 특정 리소스에 대한 설명서를 확인해야 합니다.

  2. 변경이 가능한가? 불가능한가? Amazon EC2 인스턴스에서 AMI 변경과 같이 리소스 속성에 대한 일부 변경은 기본 서비스에서 지원되지 않습니다. 가능한 변경의 경우, CloudFormation은 기본 리소스에 대해 업데이트 또는 수정 유형의 API를 사용합니다. 불가능한 속성 변경의 경우, CloudFormation은 업데이트된 속성을 사용하여 새 리소스를 생성하고 나서 이전 리소스를 삭제하기 전에 새 리소스를 스택에 연결합니다. CloudFormation이 스택 리소스의 중단 시간을 줄이려고 노력하더라도, 리소스 대체는 다단계 프로세스이며 시간이 걸리는 작업입니다. 스택 구성 중에는 애플리케이션이 부분적으로만 작동합니다. 예를 들면 요청을 처리하거나 데이터베이스에 액세스하지 못할 수도 있습니다.

관련 리소스

CloudFormation을 사용하여 애플리케이션을 시작하고 다른 구성 및 배포 서비스(예: Puppet 및 Opscode Chef)와 통합하는 방법에 대한 자세한 내용은 다음 백서를 참조하세요.