CloudFormation 작동 방식
이 주제에서는 CloudFormation의 작동 방식을 설명하고 사용할 때 알아야 할 주요 개념을 소개합니다.
주요 개념
CloudFormation을 사용하는 경우에는 템플릿 및 스택으로 작업합니다. 템플릿을 생성하여 AWS 리소스와 해당 속성에 대해 설명합니다. 스택을 생성할 때마다 CloudFormation에서 템플릿에 설명된 리소스를 프로비저닝합니다.
템플릿
CloudFormation 템플릿은 JSON 또는 YAML 형식의 텍스트 파일입니다. .json
, .yaml
, .template
, .txt
등의 확장명을 사용하여 이러한 파일을 저장할 수 있습니다. CloudFormation은 이러한 템플릿을 AWS 리소스 구축을 위한 청사진으로 사용합니다. 예를 들어, 템플릿에서 인스턴스 유형, AMI ID, 블록 디바이스 매핑, Amazon EC2 키 페어 이름 등과 같은 Amazon EC2 인스턴스를 설명할 수 있습니다. 스택을 생성할 때마다 CloudFormation에서 템플릿에 설명된 항목을 생성하는 데 사용되는 템플릿도 지정합니다.
예를 들어, 다음 템플릿을 사용하여 스택을 생성한 경우 CloudFormation에서는 ami-0ff8a91507f77f867
AMI ID, t2.micro
인스턴스 유형, testkey
키 페어 이름 및 Amazon EBS 볼륨을 사용하여 인스턴스를 프로비저닝합니다.
JSON
{ "AWSTemplateFormatVersion": "2010-09-09", "Description": "A sample template", "Resources": { "MyEC2Instance": { "Type": "AWS::EC2::Instance", "Properties": { "ImageId": "ami-0ff8a91507f77f867", "InstanceType": "t2.micro", "KeyName": "testkey", "BlockDeviceMappings": [ { "DeviceName": "/dev/sdm", "Ebs": { "VolumeType": "io1", "Iops": 200, "DeleteOnTermination": false, "VolumeSize": 20 } } ] } } } }
YAML
AWSTemplateFormatVersion: 2010-09-09 Description: A sample template Resources: MyEC2Instance: Type: 'AWS::EC2::Instance' Properties: ImageId: ami-0ff8a91507f77f867 InstanceType: t2.micro KeyName: testkey BlockDeviceMappings: - DeviceName: /dev/sdm Ebs: VolumeType: io1 Iops: 200 DeleteOnTermination: false VolumeSize: 20
단일 템플릿에서 여러 리소스를 지정하고 해당 리소스를 함께 작동하도록 구성할 수도 있습니다. 예를 들어, 다음 예제와 같이 탄력적 IP 주소(EIP)를 포함하도록 이전 템플릿을 수정한 후 Amazon EC2 인스턴스와 연결할 수 있습니다.
JSON
{ "AWSTemplateFormatVersion": "2010-09-09", "Description": "A sample template", "Resources": { "MyEC2Instance": { "Type": "AWS::EC2::Instance", "Properties": { "ImageId": "ami-0ff8a91507f77f867", "InstanceType": "t2.micro", "KeyName": "testkey", "BlockDeviceMappings": [ { "DeviceName": "/dev/sdm", "Ebs": { "VolumeType": "io1", "Iops": 200, "DeleteOnTermination": false, "VolumeSize": 20 } } ] } }, "MyEIP": { "Type": "AWS::EC2::EIP", "Properties": { "InstanceId": { "Ref": "MyEC2Instance" } } } } }
YAML
AWSTemplateFormatVersion: 2010-09-09 Description: A sample template Resources: MyEC2Instance: Type: 'AWS::EC2::Instance' Properties: ImageId: ami-0ff8a91507f77f867 InstanceType: t2.micro KeyName: testkey BlockDeviceMappings: - DeviceName: /dev/sdm Ebs: VolumeType: io1 Iops: 200 DeleteOnTermination: false VolumeSize: 20 MyEIP: Type: 'AWS::EC2::EIP' Properties: InstanceId: !Ref MyEC2Instance
이전 템플릿은 단일 Amazon EC2 인스턴스를 기반으로 하지만 CloudFormation 템플릿은 복잡한 리소스 세트를 구축하는 데 사용 가능한 추가 기능이 있으며 다양한 컨텍스트에서 템플릿을 재사용할 수 있습니다. 예를 들어 CloudFormation 스택을 생성할 때 값이 지정되는 입력 파라미터를 추가할 수 있습니다. 다시 말해 템플릿을 생성할 때가 아니라 스택을 생성할 때 인스턴스 유형과 같은 값을 지정할 수 있으므로 다양한 상황에서 템플릿을 더 쉽게 재사용할 수 있습니다.
자세한 내용은 CloudFormation 템플릿 작업 단원을 참조하십시오.
스택
CloudFormation을 사용할 경우 스택이라는 하나의 단위로 관련 리소스를 관리합니다. 스택을 생성, 업데이트, 삭제하여 리소스 모음을 생성, 업데이트 및 삭제합니다. 스택의 모든 리소스는 스택의 CloudFormation 템플릿으로 정의합니다. Auto Scaling 그룹, Elastic Load Balancing 로드 밸런서 및 Amazon Relational Database Service(Amazon RDS) 데이터베이스 인스턴스를 포함하는 템플릿을 생성했다고 가정합니다. 이러한 리소스를 생성하려면 생성한 템플릿을 제출하여 스택을 생성합니다. 그러면 CloudFormation에서 모든 리소스를 자동으로 프로비저닝합니다. CloudFormation 콘솔
자세한 내용은 AWS CloudFormation 스택을 통해 하나의 단위로 AWS 리소스 관리 단원을 참조하십시오.
변경 세트
스택에서 실행 중인 리소스를 변경해야 하는 경우 스택을 업데이트합니다. 리소스를 변경하기 전에 제안된 변경 사항이 요약된 변경 세트를 생성할 수 있습니다. 변경 세트를 사용하면 변경 사항을 구현하기 이전에 해당 변경이 실행 중인 리소스 특히, 중요 리소스에 미치는 영향을 확인할 수 있습니다.
예를 들어, Amazon RDS 데이터베이스 인스턴스의 이름을 변경한 경우 CloudFormation에서 새 데이터베이스를 생성하고 이전 데이터베이스를 삭제합니다. 아직 백업하지 않은 경우 이전 데이터베이스의 데이터를 잃게 됩니다. 변경 세트를 생성한 경우 변경 후 데이터베이스가 교체된다는 사실을 알 수 있으므로 스택을 업데이트하기 이전에 적절히 계획할 수 있습니다.
자세한 내용은 변경 세트를 사용하여 CloudFormation 스택 업데이트 단원을 참조하십시오.
CloudFormation 작동 방식
스택을 생성할 때 CloudFormation에서는 AWS에 대한 기본 서비스 호출을 실행해 리소스를 프로비저닝 및 구성합니다. CloudFormation에서는 수행 권한이 있는 작업만 수행할 수 있습니다. 예를 들어 CloudFormation을 사용하여 EC2 인스턴스를 생성하려면 인스턴스를 생성할 권한이 필요합니다. 인스턴스가 포함된 스택을 삭제하는 경우에도 인스턴스를 종료할 유사한 권한이 필요합니다. AWS Identity and Access Management(IAM)를 사용하여 권한을 관리합니다.
CloudFormation에서 실행하는 호출은 모두 템플릿으로 선언됩니다. 예를 들어 t2.micro
인스턴스 유형으로 EC2 인스턴스를 설명하는 템플릿이 있다고 가정해 보겠습니다. 이 템플릿을 사용해 스택을 생성하는 경우 CloudFormation에서는 Amazon EC2 인스턴스 생성 API를 생성하고 인스턴스 유형을 t2.micro
로 지정합니다. 다음 다이어그램은 CloudFormation의 스택 생성 워크플로우를 요약해서 보여줍니다.
-
Infrastructure Composer 또는 자체 텍스트 편집기를 사용하여 JSON 또는 YAML 형식으로 CloudFormation 템플릿을 생성하거나 수정할 수 있습니다. 또한 제공된 템플릿을 사용하도록 선택할 수도 있습니다. CloudFormation 템플릿에는 필요한 리소스와 해당하는 설정이 설명됩니다. 예를 들어 EC2 인스턴스를 생성하려고 한다고 가정해 보겠습니다. 다음 예에서처럼 템플릿에서 Amazon EC2 인스턴스를 선언하고 해당 인스턴스의 속성을 설명할 수 있습니다.
예 JSON
{ "AWSTemplateFormatVersion": "2010-09-09", "Description": "A simple EC2 instance", "Resources": { "MyEC2Instance": { "Type": "AWS::EC2::Instance", "Properties": { "ImageId": "ami-0ff8a91507f77f867", "InstanceType": "t2.micro" } } } }
예 YAML
AWSTemplateFormatVersion: 2010-09-09 Description: A simple EC2 instance Resources: MyEC2Instance: Type: 'AWS::EC2::Instance' Properties: ImageId: ami-0ff8a91507f77f867 InstanceType: t2.micro
-
템플릿을 로컬 또는 Amazon S3 버킷에 저장합니다. 템플릿을 생성한 경우
.json
,.yaml
또는.txt
와 같은 파일 확장명으로 저장합니다. -
템플릿 파일의 위치(예: 로컬 컴퓨터의 경로 또는 Amazon S3 URL)를 지정하여 CloudFormation 스택을 생성합니다. 템플릿에 파라미터가 포함되어 있는 경우 스택을 생성할 때 입력 값을 지정할 수 있습니다. 파라미터를 통해 템플릿을 값을 전달하여 스택을 생성할 때마다 리소스를 사용자 지정할 수 있습니다.
CloudFormation 콘솔, CreateStack API 작업 또는 create-stack AWS CLI 명령을 사용하여 스택을 생성할 수 있습니다.
참고
로컬에 저장된 템플릿 파일을 지정하면 CloudFormation이 이를 AWS 계정의 S3 버킷에 업로드합니다. CloudFormation은 템플릿 파일을 업로드하는 각 리전에 대한 버킷을 생성합니다. AWS 계정에서 Amazon Simple Storage Service(Amazon S3) 권한이 있는 모든 사용자가 버킷에 액세스할 수 있습니다. CloudFormation에서 생성한 버킷이 이미 있는 경우, 해당 버킷에 템플릿이 추가됩니다.
템플릿을 Amazon S3에 수동으로 업로드하여 자체 버킷을 사용하고 버킷의 권한을 관리할 수 있습니다. 그런 다음 스택을 생성하거나 업데이트할 때마다 템플릿 파일의 Amazon S3 URL을 지정합니다.
CloudFormation에서는 템플릿에 설명된 AWS 서비스를 호출하여 리소스를 프로비저닝 및 구성합니다.
모든 리소스가 생성된 후 CloudFormation에서는 스택이 생성되었음을 보고합니다. 그러면 스택의 리소스를 사용할 수 있습니다. 스택 생성에 실패하면 CloudFormation에서는 생성한 리소스를 삭제하여 변경 사항을 롤백합니다.
변경 세트로 스택 업데이트
스택의 리소스를 업데이트해야 하는 경우 스택의 템플릿을 수정할 수 있습니다. 새 스택을 만들고 이전 스택은 삭제할 필요가 없습니다. 스택을 업데이트하려면 원본 스택 템플릿의 수정된 버전, 다른 입력 파라미터 또는 둘 다를 제출하여 변경 세트를 생성합니다. CloudFormation은 수정된 템플릿을 원본 템플릿과 비교하고 변경 세트를 생성합니다. 변경 세트에는 제안된 변경 사항이 나열되어 있습니다. 변경 사항을 검토한 후 변경 세트를 실행해 스택을 업데이트하거나 새 변경 세트를 시작할 수 있습니다. 다음 다이어그램은 스택 업데이트 워크플로우를 요약해서 보여줍니다.
중요
업데이트 시 중단이 발생할 수 있습니다. 업데이트 중인 리소스 및 속성에 따라 업데이트 시 기존 리소스가 중단되거나 대체될 수 있습니다. 자세한 내용은 스택 리소스의 업데이트 동작 이해 단원을 참조하십시오.
-
Infrastructure Composer 또는 텍스트 편집기를 사용하여 CloudFormation 스택 템플릿을 수정할 수 있습니다. 예를 들어 EC2 인스턴스에 대한 인스턴스 유형을 변경하려는 경우 원본 스택의 템플릿에서
InstanceType
속성의 값을 변경합니다. 자세한 내용은 스택 템플릿 업데이트 단원을 참조하십시오. -
CloudFormation 템플릿을 로컬 또는 S3 버킷에 저장합니다.
-
업데이트하려는 스택과 수정된 템플릿의 위치(예: 로컬 컴퓨터의 경로 또는 Amazon S3 URL)를 지정하여 변경 세트를 생성합니다. 템플릿에 파라미터가 포함되어 있는 경우 변경 세트를 생성할 때 값을 지정할 수 있습니다.
변경 세트 생성에 대한 자세한 내용은 변경 세트를 사용하여 CloudFormation 스택 업데이트 단원을 참조하십시오.
참고
로컬 컴퓨터에 저장되는 템플릿을 지정한 경우 CloudFormation에서는 해당 템플릿을 AWS 계정의 S3 버킷에 템플릿을 자동으로 업로드합니다.
-
변경 세트를 보고 기대하는 변경을 CloudFormation에서 수행할지 확인합니다. 예를 들어 CloudFormation에서 중요한 스택 리소스를 대체할지 확인합니다. 원하는 변경 사항을 포함할 때까지 변경 세트는 필요한 만큼 생성할 수 있습니다.
-
스택에 적용하려는 변경 세트를 시작합니다. CloudFormation에서는 수정한 리소스만 업데이트하여 스택을 업데이트하고 스택 업데이트에 성공했다는 신호를 전송합니다. 스택 업데이트에 실패하면 CloudFormation에서는 변경 사항을 롤백해 스택을 알려진 마지막 작동 상태로 복원합니다.
스택 삭제
스택을 삭제하는 경우 삭제할 스택을 지정하면 CloudFormation에서는 해당 스택과 스택 내 모든 리소스를 삭제합니다. CloudFormation 콘솔, DeleteStack API 작업 또는 delete-stack AWS CLI 명령을 사용하여 스택을 삭제할 수 있습니다.
스택은 삭제하지만 해당 스택 내 일부 리소스는 보존하려는 경우 삭제 정책을 사용하여 해당 리소스는 보존할 수 있습니다.
모든 리소스가 삭제된 후 CloudFormation에서는 스택이 성공적으로 삭제되었다는 신호를 전송합니다. CloudFormation에서 리소스를 삭제할 수 없는 경우에는 스택이 삭제되지 않습니다. 삭제되지 않은 모든 리소스는 스택을 성공적으로 삭제할 수 있을 때까지 보존됩니다.