Amazon Web Services 한국 블로그

AWS CloudFormation 업데이트 – 장애 시점부터 스택 작업 신속 재시도 가능 (서울 리전 포함)

클라우드 컴퓨팅의 가장 큰 장점 중 하나는 프로그래밍 가능한 인프라에 액세스할 수 있다는 것입니다. 이를 통해 코드형 인프라를 관리하고 동일한 애플리케이션 코드 개발 사례를 인프라 프로비저닝에 적용할 수 있습니다.

AWS CloudFormation을 사용하면 관련 AWS 및 서드 파티 리소스 모음을 모델링하고, 이를 빠르고 일관되게 프로비저닝하며, 수명 주기 전반에 걸쳐 손쉽게 관리할 수 있습니다. CloudFormation 템플릿은 원하는 리소스 및 해당 종속성을 설명하므로 이를 스택으로 함께 시작하고 구성할 수 있습니다. 리소스를 개별적으로 관리하는 대신 템플릿을 사용하여 전체 스택을 하나의 단위로 생성, 업데이트 및 삭제할 수 있습니다.

스택을 만들거나 업데이트할 때 여러 가지 이유로 작업이 실패할 수 있습니다. 예를 들어 템플릿이나 템플릿의 파라미터에 오류가 있거나, AWS Identity and Access Management(IAM) 권한 오류와 같은 템플릿 외부의 문제가 있을 수 있습니다. 이러한 오류가 발생하면 CloudFormation은 스택을 이전 안정 상태로 롤백합니다. 스택 생성의 경우 이것은 오류 시점까지 생성된 모든 리소스를 삭제한다는 의미입니다. 스택 업데이트의 경우 이것은 이전 구성을 복원한다는 의미입니다.

이전 상태로의 롤백은 프로덕션 환경에 적합하지만 오류의 원인을 파악하기가 쉽지 않습니다. 템플릿의 복잡성 및 관련된 리소스 수에 따라, 적절한 구성으로 템플릿을 업데이트하고 작업을 재시도하기 위해서는 모든 리소스가 롤백될 때까지 데 많은 시간을 기다려야 할 수도 있습니다.

오늘, CloudFormation을 사용하면 자동 롤백을 비활성화하고 오류가 발생하기 전에 생성 또는 업데이트된 리소스를 유지하며 실패 시점부터 스택 작업을 재시도할 수 있다는 사실을 공유하게 되어 기쁩니다. 이러한 방식으로 신속하게 반복하여 오류를 수정 및 해결하고 개발 환경에서 CloudFormation 템플릿을 테스트하는 데 필요한 시간을 크게 줄일 수 있습니다. 스택을 생성 및 업데이트하거나 변경 세트를 실행할 때 이 새 기능을 적용할 수 있습니다. 이제 실제로 어떻게 작동하는지 알아보겠습니다.

빠르게 반복하여 CloudFormation 스택 수정 및 복구
애플리케이션 중 하나에 Amazon Kinesis 데이터 스트림에 대한 항목 수준 변경 사항을 스트리밍하는 Amazon Simple Storage Service(Amazon S3) 버킷, Amazon Simple Queue Service(SQS) 대기열, Amazon DynamoDB 테이블을 설정합니다. 이 설정을 위해 CloudFormation 템플릿의 첫 번째 버전을 작성합니다.

AWSTemplateFormatVersion: "2010-09-09"
Description: A sample template to fix & remediate
Parameters:
  ShardCountParameter:
    Type: Number
    Description: The number of shards for the Kinesis stream
Resources:
  MyBucket:
    Type: AWS::S3::Bucket
  MyQueue:
    Type: AWS::SQS::Queue
  MyStream:
    Type: AWS::Kinesis::Stream
    Properties:
      ShardCount: !Ref ShardCountParameter
  MyTable:
    Type: AWS::DynamoDB::Table
    Properties:
      BillingMode: PAY_PER_REQUEST
      AttributeDefinitions:
        - AttributeName: "ArtistId"
          AttributeType: "S"
        - AttributeName: "Concert"
          AttributeType: "S"
        - AttributeName: "TicketSales"
          AttributeType: "S"
      KeySchema:
        - AttributeName: "ArtistId"
          KeyType: "HASH"
        - AttributeName: "Concert"
          KeyType: "RANGE"
      KinesisStreamSpecification:
        StreamArn: !GetAtt MyStream.Arn
Outputs:
  BucketName:
    Value: !Ref MyBucket
    Description: The name of my S3 bucket
  QueueName:
    Value: !GetAtt MyQueue.QueueName
    Description: The name of my SQS queue
  StreamName:
    Value: !Ref MyStream
    Description: The name of my Kinesis stream
  TableName:
    Value: !Ref MyTable
    Description: The name of my DynamoDB table

이제 이 템플릿에서 스택을 생성해 보겠습니다. CloudFormation 콘솔에서 Create stack(스택 생성)을 선택합니다. 그런 다음 템플릿 파일을 업로드하고 Next(다음)를 선택합니다.

콘솔 스크린샷.

스택 이름을 입력합니다. 그런 다음 스택 파라미터를 채웁니다. 내 템플릿 파일에는 Kinesis 데이터 스트림의 샤드 수를 구성하는 데 사용되는 파라미터(ShardCountParameter)가 하나 있습니다. 샤드 수가 1이상이어야 한다는 것을 알고 있지만 실수로 0을 입력하고 Next(다음)를 선택합니다.

콘솔 스크린샷.

스택에서 리소스를 생성, 수정 또는 삭제하기 위해 IAM 역할을 사용합니다. 이 방식에는 CloudFormation이 스택 작업에 사용할 수 있는 권한에 대한 명확한 경계가 있습니다. 또한 동일한 역할을 사용하여 나중에 표준화되고 재현 가능한 환경에서 스택 배포를 자동화할 수 있습니다.

Permissions(권한)에서 스택 작업에 사용할 IAM 역할을 선택합니다.

콘솔 스크린샷.

이제 새로운 기능을 사용할 차례입니다! Stack failure options(스택 실패 옵션)에서 오류가 발생할 경우 이미 생성된 리소스를 유지하도록 Preserve successfully provisioned resources(성공적으로 프로비저닝된 리소스 보존)를 선택합니다. 실패한 리소스는 항상 마지막으로 알려진 안정 상태로 롤백됩니다.

다른 모든 옵션을 기본값으로 두고 Next(다음)를 선택합니다. 그런 다음 구성을 검토하고 Create stack(스택 생성)을 선택합니다.

스택 생성이 몇 초 동안 진행 되다가 오류로 인해 실패합니다. Events(이벤트) 탭에서 이벤트의 타임라인을 살펴봅니다. 스택 생성의 시작은 맨 아래에 있습니다. 가장 최근의 이벤트가 맨 위에 있습니다. 샤드 수(ShardCount)가 최소값보다 낮기 때문에 스트림 리소스에 대한 속성 유효성 검사가 실패했습니다. 이러한 이유로 스택은 이제 CREATE_FAILED 상태가 됩니다.

콘솔 스크린샷.

프로비저닝된 리소스를 유지하기로 선택했기 때문에 오류가 발생하기 전에 생성된 모든 리소스는 여전히 존재합니다. 리소스 탭에서 S3 버킷과 SQS 대기열은 CREATE_COMPLETE 상태에 있고 Kinesis 데이터 스트림은 CREATE_FAILED 상태입니다. DynamoDB 테이블의 생성은 테이블이 속성(KinesisStreamSpecification) 중 하나에서 데이터 스트림을 사용하기 때문에 사용할 수 있는 Kinesis 데이터 스트림에 따라 달라집니다. 따라서 테이블 생성은 아직 시작되지 않았으며 테이블이 목록에 없습니다.

콘솔 스크린샷.

이제 롤백이 일시 중지되고 몇 가지 새로운 옵션이 있습니다.

Retry(재시도) – 변경 없이 스택 작업을 재시도합니다. 이 옵션은 템플릿 외부의 문제로 인해 리소스를 프로비저닝하지 못한 경우에 유용합니다. 문제를 수정한 다음 실패 시점부터 다시 시도할 수 있습니다.

Update(업데이트) – 스택 생성을 다시 시도하기 전에 템플릿 또는 파라미터를 업데이트합니다. 스택 업데이트는 마지막 작업이 오류로 인해 중단된 위치에서 시작됩니다.

Rollback(롤백) – 마지막으로 알려진 안정 상태로 롤백합니다. 이는 기본 CloudFormation 동작과 유사합니다.

콘솔 스크린샷.

파라미터의 문제 수정
샤드 수에 대한 매개 변수를 입력하는 동안 실수를 빨리 알아냈으므로 Update(업데이트)를 선택합니다.

이 오류를 수정하기 위해 템플릿을 변경할 필요는 없습니다. Parameters(파라미터)에서 이전 오류를 수정하고 샤드 수에 대한 올바른 값, 하나의 샤드를 입력합니다.

콘솔 스크린샷.

다른 모든 옵션을 현재 값으로 두고 Next(다음)를 선택합니다.

Change set preview(변경 세트 미리 보기)에서, 업데이트가 Kinesis 스트림(현재 CREATE_FAILED 상태)을 수정하고 DynamoDB 테이블을 추가할 것임을 확인할 수 있습니다. 다른 구성을 검토하고 Update stack(업데이트 스택)을 선택합니다.

콘솔 스크린샷.

이제 업데이트가 진행 중입니다. 모든 문제를 해결했나요? 아직은 아닙니다. 잠시 후 업데이트가 실패합니다.

템플릿 외부의 문제 수정
Kinesis 스트림이 생성되었지만 CloudFormation에서 수임하는 IAM 역할에는 DynamoDB 테이블을 생성할 권한이 없습니다.

콘솔 스크린샷.

IAM 콘솔에서 DynamoDB 테이블을 생성할 수 있도록 스택 작업에서 사용하는 역할에 추가 권한을 추가합니다.

콘솔 스크린샷.

CloudFormation 콘솔로 돌아가서 Retry(재시도) 옵션을 선택합니다. 새 권한을 사용하면 DynamoDB 테이블 생성이 시작되지만 잠시 후 또 다른 오류가 발생합니다.

템플릿의 문제 수정
이번에는 DynamoDB 테이블을 정의하는 템플릿에 오류가 발생했습니다. AttributeDefinitions 섹션에는 스키마에 사용되지 않는 속성(TicketSales)이 있습니다.

콘솔 스크린샷.

DynamoDB에서는 템플릿에 정의된 속성을 기본 키 또는 인덱스에 사용해야 합니다. 템플릿을 업데이트하고 TicketSales 속성 정의를 제거합니다.

템플릿을 편집하고 있기 때문에 샤드 수(ShardCountParameter) 파라미터에 MinValueMaxValue 속성을 추가할 수 있습니다. 이러한 방식으로 CloudFormation은 배포를 시작하기 전에 값이 올바른 범위에 있는지 확인할 수 있으며 추가 실수를 피할 수 있습니다.

Update(업데이트) 옵션을 선택합니다. 현재 템플릿을 업데이트하도록 선택하고 새 템플릿 파일을 업로드합니다. 파라미터의 현재 값을 확인합니다. 그런 다음, 다른 모든 옵션을 현재 값으로 두고 Update stack(스택 업데이트)을 선택합니다.

이번에는 스택이 생성되고 상태는 UPDATE_COMPLETE입니다. Resources(리소스) 탭에서 모든 리소스와 해당 설명(템플릿의 Outputs(출력) 섹션 기반)을 Outputs(출력) 탭에서 볼 수 있습니다.

콘솔 스크린샷.

다음은 템플릿의 최종 버전입니다.

AWSTemplateFormatVersion: "2010-09-09"
Description: A sample template to fix & remediate
Parameters:
  ShardCountParameter:
    Type: Number
    MinValue: 1
    MaxValue: 10
    Description: The number of shards for the Kinesis stream
Resources:
  MyBucket:
    Type: AWS::S3::Bucket
  MyQueue:
    Type: AWS::SQS::Queue
  MyStream:
    Type: AWS::Kinesis::Stream
    Properties:
      ShardCount: !Ref ShardCountParameter
  MyTable:
    Type: AWS::DynamoDB::Table
    Properties:
      BillingMode: PAY_PER_REQUEST
      AttributeDefinitions:
        - AttributeName: "ArtistId"
          AttributeType: "S"
        - AttributeName: "Concert"
          AttributeType: "S"
      KeySchema:
        - AttributeName: "ArtistId"
          KeyType: "HASH"
        - AttributeName: "Concert"
          KeyType: "RANGE"
      KinesisStreamSpecification:
        StreamArn: !GetAtt MyStream.Arn
Outputs:
  BucketName:
    Value: !Ref MyBucket
    Description: The name of my S3 bucket
  QueueName:
    Value: !GetAtt MyQueue.QueueName
    Description: The name of my SQS queue
  StreamName:
    Value: !Ref MyStream
    Description: The name of my Kinesis stream
  TableName:
    Value: !Ref MyTable
    Description: The name of my DynamoDB table

이것은 간단한 예였지만 실패 시점부터 스택 작업을 재시도하는 새로운 기능은 이미 많은 시간을 절약했습니다. 이를 통해 문제를 신속하게 수정하고 해결하여 피드백 루프를 줄이고 동일한 시간 내에 수행할 수 있는 반복 횟수를 늘릴 수 있었습니다. 이 기능은 디버깅 용도 외에도 템플릿을 점진적으로 대화식으로 개발하는 데 유용합니다. 보다 정교한 애플리케이션을 사용하면 시간을 절약할 수 있습니다!

AWS CLI를 사용하여 CloudFormation 스택 수정 및 복구
스택을 생성, 업데이트하거나 변경 세트를 실행할 때 --disable-rollback 옵션을 지정해서 AWS Command Line Interface(AWS CLI)로 성공적으로 프로비저닝된 리소스를 보존할 수 있습니다. 예를 들면 다음과 같습니다.

aws cloudformation create-stack --stack-name my-stack \
    --template-body file://my-template.yaml -–disable-rollback
aws cloudformation update-stack --stack-name my-stack \
    --template-body file://my-template.yaml --disable-rollback
aws cloudformation execute-change-set --stack-name my-stack --change-set-name my-change-set \
    --template-body file://my-template.yaml --disable-rollback

기존 스택의 경우 describe stack 명령으로 DisableRollback 속성이 활성화되어 있는지 확인할 수 있습니다.

aws cloudformation describe-stacks --stack-name my-stack

이제 CREATE_FAILED 또는 UPDATE_FAILED 상태의 스택을 업데이트할 수 있습니다. CREATE_FAILED 또는 UPDATE_FAILED 상태에 있는 스택을 수동으로 롤백하려면 새 rollback stack 명령을 사용할 수 있습니다.

aws cloudformation rollback-stack --stack-name my-stack

가용성 및 요금
AWS CloudFormation의 실패 시점부터 스택 작업을 재시도할 수 있는 기능은 미국 동부(버지니아 북부, 오하이오), 미국 서부(오레곤, 캘리포니아 북부), AWS GovCloud(미국 동부, 미국 서부), 캐나다(중부), 유럽(프랑크푸르트, 아일랜드, 런던, 밀라노, 파리, 스톡홀름), 아시아 태평양(홍콩, 뭄바이, 오사카, 서울, 싱가포르, 시드니, 도쿄), 중동(바레인), 아프리카(케이프타운) 및 남아메리카(상파울루) AWS 리전에서 추가 비용 없이 사용할 수 있습니다.

JavaScript, TypeScript, Python, Java, C#, Go와 같은 친숙한 프로그래밍 언어를 사용해 클라우드 애플리케이션 리소스를 정의하는 것을 선호하십니까? 좋은 소식입니다! AWS Cloud Development Kit(AWS CDK) 팀은 앞으로 몇 주 내에 이 게시물에 설명된 새로운 기능에 대한 지원을 추가할 계획입니다.

실패 시점부터 스택 작업을 재시도할 수 있는 신규 기능을 통해 AWS CloudFormation 스택을 수정하고 복구하는 데 소요되는 시간을 줄일 수 있습니다.

Danilo