CloudFormation 이란?
- AWS 리소스의 설정을 JSON 형식 또는 YAML 형식으로 기재한 템플릿을 만들고 해당 템플릿에서 AWS 리소스를 자동으로 구축하는 서비스
- CloudFormation에는 스택과 템플릿으로 구성
-
스택
-
-
CloudFormation 기능으로 자동 생성된 AWS 리소스의 집합을 나타냄
-
CloudFormation은 스택 단위로 리소스를 관리하기 위해 스택에 연관된 리소스를 한번에 구축하거나 한번에 제거할 수 있음
-
리소스간에는 의존관계가 있는 경우가 많은데 예를 들어 VPC와 EC2 인스턴스에서 VPC가 없다면 인스턴스를 만들 수 없다. 이같은 의존 관계를 CloudFormation이 자동 구축 시에 판단하고 구축하는 순서에 모순이 없도록 결정
-
-
템플릿
-
-
스택 구성을 결정하는 설계자로서 CloudFormation의 핵심 요소
-
JSON이나 YAML 형식으로 기술
-
템플릿은 AWS 리소스를 기술하는 장소, 실행조건을 기술하는 장소 등의 몇 개 섹션으로 구성
-
템플릿 생성을 지원하는 내장함수가 존재하며 이 내장함수를 사용해 범용성 높은 템플릿 구성 가능
-
-
변경 세트
-
-
스택에서 실행 중인 리소스를 변경해야 하는 경우 스택을 업데이트
-
리소스를 변경하기 전에 제안된 변경 사항이 요약된 변경 세트를 생성할 수 있음
-
변경 세트를 사용하면 변경 사항을 구현하기 이전에 해당 변경이 실행중인 리소스에 미치는 영향을 확인할 수 있음
-
Ex. RDS DB 인스턴스의 이름을 변경한 경우 CloudFormation에서 새 DB를 생성하고 이전 DB를 삭제하므로 아직 백업하지 않은 경우 이전 DB 데이터를 잃게 됨
-
템플릿 섹션
Resources (리소스)
- 구축하는 AWS 리소스를 정의하는 섹션 (사용하는 AWS 서비스의 정의를 기술)
- 템플릿 중에서도 가장 중요한 섹션
- 사용 예제-1
Resources :
EC2InstanceWeb : # Logical ID로 템플릿내에 고유해야함, 논리적 이름을 사용하여 템플릿의 다른 부분에 있는 리소스를 참조
Type : 'AWS::EC2::Instance' # 리소스의 유형을 지정
Properties : # 리소스에 지정할 수 있는 추가 옵션으로 속성을 지정
InstanceType : 'm2.large' # 인스턴스 유형 지정
InstanceInitiatedShutdownBehavior : 'stop' # 셧다운할 때 동작을 지정
- 사용 예제-2 (MyInstance 리소스는 MyQuere 리소스를 UserData 속성의 일부로서 포함)
Resources:
MyInstance:
Type: "AWS::EC2::Instance"
Properties:
UserData:
"Fn::Base64":
!Sub |
Queue=${MyQueue}
AvailabilityZone: "us-east-1a"
ImageId: "ami-0ff8a91507f77f867"
MyQueue:
Type: "AWS::SQS::Queue"
Properties: {}
Parameters (파라미터)
- 템플릿 실행 시에 사용자가 선택하는 항목을 정의하는 섹션
- 동일한 템플릿에도 용도에 따라 템플릿 설정 값을 변경하려는 경우 사용 (예를 들어 인스턴스 유형을 운영환경에서는 t2.large로 사용하지만 개발환경에서는 t2.small로 지정하고 싶은 경우)
- 파라미터 섹션을 이용해 CloudFormation 실행 사용자에게 인스턴스 유형을 선택하게 할 수 있음
- 파라미터를 통해 스택을 생성하거나 업데이트 할 때마다 템플릿에 사용자 지정 값을 입력할 수 있음
- 사용 예제
Parameters :
InstanceType :
Type : String
Default : t2.micro
AllowedValues :
- t2.mircro
- t2.small
- t2.medium
- t2.large
Description : Select EC2 instance type.
-
이 템플릿을 실행하면 파라미터 입력이 요구 됨
-
입력 값을 참조할 수 있음
Resources :
EC2InstanceWeb :
Type : 'AWS::EC2:Instance'
Properties :
InstanceType : !Ref InstanceType
-
-
사용자가 입력한 값은 Ref 함수로 참조할 수 있음
-
Mappings (매핑)
- Map 형식의 변수를 정의하는 섹션
- 템플릿의 실행 환경에 따라 달라질 수 있는 값을 사전에 맵 형식으로 정의할 수 있음
- 리전마다 설정 값이 다른 경우 등은 Mappings 섹션에 정의해 두고 리전마다 사용하는 값을 변경할 수 있게함
- 사용 예제-1
Mappings :
MappingName : # Mapping 이름
Key1 : # 키 이름
Name1 : Value1-1 # 이름과 값의 페어
Name2 : Value1-2
Key2 :
Name1 : Value2-1
- 사용 예제-2
Mappings:
RegionMap:
us-east-1: #키는 리전의 이름
"HVM64": "ami-0ff8a91507f77f867” # 값은 리전의 HVM64 AMI용 AMI ID
us-west-1:
"HVM64": "ami-0bdb828fd58c52235"
eu-west-1:
"HVM64": "ami-047bb4163c506cd98"
ap-southeast-1:
"HVM64": "ami-08569b978cc4dfa10"
ap-northeast-1:
"HVM64": "ami-06cd52961ce9f0d85"
- 사용 예제-3 (FindInMap 함수를 사용하여 지정한 키에 따라 명명된 값을 반환할 수 있음, FindInMap 함수르 통해 ImageId 속성이 할당된 EC2 리소스가 포함)
AWSTemplateFormatVersion: "2010-09-09"
Mappings:
RegionMap:
us-east-1:
HVM64: ami-0ff8a91507f77f867
HVMG2: ami-0a584ac55a7631c0c
us-west-1:
HVM64: ami-0bdb828fd58c52235
HVMG2: ami-066ee5fd4a9ef77f1
eu-west-1:
HVM64: ami-047bb4163c506cd98
HVMG2: ami-0a7c483d527806435
ap-northeast-1:
HVM64: ami-06cd52961ce9f0d85
HVMG2: ami-053cdd503598e4a9d
ap-southeast-1:
HVM64: ami-08569b978cc4dfa10
HVMG2: ami-0be9df32ae9f92309
Resources:
myEC2Instance:
Type: "AWS::EC2::Instance"
Properties:
ImageId: !FindInMap [RegionMap, !Ref "AWS::Region", HVM64] #FindInMap 함수는 키를 스택이 생성되는 리전으로 지정하여 HVM64를 매핑할 값으로 지정
InstanceType: m1.small
Conditions (조건)
- 조건에 따라 템플릿의 동작을 바꾸고 싶은 경우 사용 (예를 들어 조건을 충족할때만 EC2 인스턴스를 시작하는 경우)
- 사용 예제-1 (운영 환경과 그 외의 환경에서 생성할 IAM 사용자를 변경하고 싶을 때 템플릿을 정의하는 방법 (운영 환경 사용자외 이외 사용자를 서로 다르게))
1) 파라미터 섹션에서 환경을 나타내는 파라미터 생성
Parameters : # 조건에서 평가하고자 하는 입력을 정의, 조건은 이러한 입력 파라미터의 값에 따라 true 또는 false로 평가, 조건에서 가상 파라미터를 평가하고자 하는 경우 이 섹션에서 가상파라미터를 정의할 필요가 없음
Env :
Type : String
AllowedValues :
- production
- test
- develop
Default : test
Description : Select Env.
2) Conditions 섹션에 선택된 Env 에 의해 운영 환경인지 아닌지 판단하는 값을 판단하는 값인 IsProduction을 생성
Conditions : # 내장 조건 함수를 사용 하여 조건을 정의, 이러한 조건은 CloudFormation에서 연결된 리소스가 생성되는 경우를 결정
IsProduction : !Equals [ !Ref Env, production ]
3) 마지막으로 리소스 측에서 IsProduction의 값에 따라 사용자를 만들것인지를 판단
Resources : # Resources 및 Outputs 섹션에서 조건부로 생성할 리소스나 출력을 조건과 연결, Condition 키와 조건의 논리적 ID를 사용하여 리소스나 출력과 연결, 속성을 조건부로 지정하려면 Fn::If 함수를 사용
ProdUser :
Type : AWS::IAM::User
Condition::IsProduction
Properties :
~~~~
-
Conditions 섹션을 활용하면 '운영 환경만 CloudWatch의 모니터링을 추가한다', '검증 환경에만 검증 권한을 가진 IAM 사용자를 생성한'다라는 정의를 할 수 있음
- 사용 예제-2
AWSTemplateFormatVersion: "2010-09-09"
Mappings:
RegionMap:
us-east-1:
AMI: "ami-0ff8a91507f77f867"
TestAz: "us-east-1a"
us-west-1:
AMI: "ami-0bdb828fd58c52235"
TestAz: "us-west-1a"
us-west-2:
AMI: "ami-a0cfeed8"
TestAz: "us-west-2a"
eu-west-1:
AMI: "ami-047bb4163c506cd98"
TestAz: "eu-west-1a"
sa-east-1:
AMI: "ami-07b14488da8ea02a0"
TestAz: "sa-east-1a"
ap-southeast-1:
AMI: "ami-08569b978cc4dfa10"
TestAz: "ap-southeast-1a"
ap-southeast-2:
AMI: "ami-09b42976632b27e9b"
TestAz: "ap-southeast-2a"
ap-northeast-1:
AMI: "ami-06cd52961ce9f0d85"
TestAz: "ap-northeast-1a"
Parameters:
EnvType:
Description: Environment type.
Default: test
Type: String
AllowedValues:
- prod
- test
ConstraintDescription: must specify prod or test.
Conditions:
CreateProdResources: !Equals [ !Ref EnvType, prod ]
Resources:
EC2Instance:
Type: "AWS::EC2::Instance"
Properties:
ImageId: !FindInMap [RegionMap, !Ref "AWS::Region", AMI]
MountPoint:
Type: "AWS::EC2::VolumeAttachment"
Condition: CreateProdResources
Properties:
InstanceId:
!Ref EC2Instance
VolumeId:
!Ref NewVolume
Device: /dev/sdh
NewVolume:
Type: "AWS::EC2::Volume"
Condition: CreateProdResources
Properties:
Size: 100
AvailabilityZone:
!GetAtt EC2Instance.AvailabilityZone
Outputs:
VolumeId:
Condition: CreateProdResources
Value:
!Ref NewVolume
Output (출력)
- 구축된 리소스에 관한 정보 중에서 관리 콘솔 등에 출력하는 정보를 정의
- 정의한 값은 관리 콘솔에서 확인할 수 있을뿐더러 다른 AWS 리소스를 구축할 때 사용할 수 있음
- 사용 예제-1 (EC2 인스턴스의 인스턴스 ID 출력)
Outputs :
InstanceID :
Description : The Instance ID
Value : !Ref TestEC2Instance01
- 사용 예제-2 (다른 스택에서 출력 값을 사용하고 싶은 경우에 Export 사용)
Outputs :
InstanceID :
Description : The Instance ID
Value : !Ref TestEC2Instance01
Export :
Name : !Sub "${AWS::StackName}-InstanceID"
위의 내용을 Fn::ImportValue 함수를 사용해 참조하는 것이 가능
Fn::ImportValue:
!Sub "${AWS::StackName}-InstanceID"
Metadata (메타데이터)
- 템플릿에 대한 세부 정보를 제공하는 임의 JSON 또는 YAML 객체를 포함할 수 있음 (특정 리소스에 대한 템플릿 구현 세부 정보를 포함할 수 있음)
- 스택 업데이트 중에는 메타데이터 섹션을 자체적으로 업데이트할 수 없음, 리소스를 추가 / 수정 / 삭제하는 변경 내용을 포함할 때만 업데이트할 수 있음
- 사용 예제-1 (메타데이터 키)
Metadata:
Instances:
Description: "Information about the instances"
Databases:
Description: "Information about the databases"
-
AWS::CloudFormation::Init
-
-
cfn-init 헬퍼 스크립트에 대한 구성 작업을 정의
-
EC2 인스턴스에서 애플리케이션을 구성 및 설치할 때 유용
-
-
AWS::CloudFormnation::Interface
-
-
CloudFormation 콘솔에 표시되는 입력 파리미터의 그룹화 순서를 정의
-
기본적으로 콘솔에는 파라미터가 논리적 ID별 영문자순으로 정렬
-
-
AWS::CloudFormation::Designer
-
-
CloudFormation Designer에서 리소스가 배치되는 방식을 설명
-
Designer에서 템플릿을 생성 및 업데이트할 때 이 정보가 자동으로 추가
-
Transform (변환)
- 템플릿을 처리하는데 사용하는 하나 이상의 매크로를 지정
- CloudFormation에서는 지정된 순서에 따라 매크로를 실행하고 변경 세트를 생성할 때 CloudFormation에서 처리된 템플릿 콘텐츠를 포함시키는 변경 세트를 생성 (변경사항을 검토하고 변경 세트를 실행)
- AWS::Serverless 변환
-
CloudFormation에 의해 호스팅 되는 매크로인 AWS::Serverless 변형은 AWS SAM 구문에서 작성된 전체 템플릿을 가져온 다음 이를 변형 후 규정 준수 템플릿으로 확장
-
사용자 지정 매크로와는 달리 AWS::Serverless 변형은 특별한 사용 권한을 필요로 하지않는데 CloudFormation에서 호스팅 되기 때문
-
CloudFormation 내에 있는 모든 계정의 템플릿에서 사용할 수 있음
-
사용 예제-1
Transform: "AWS::Serverless-2016-10-31” # 변환 선언을 보여주는 예 (변환 선언 값은 리터럴 문자열이어야 하며 파라미터나 함수를 사용하여 변환 값을 지정할 수 없음)
-
사용 예제-2 (AWS SAM 구문을 사용하여 Lambda 함수 및 해당 실행 역활의 선언을 간소화)
Transform: AWS::Serverless-2016-10-31
Resources:
MyServerlessFunctionLogicalID:
Type: AWS::Serverless::Function
Properties:
Handler: index.handler
Runtime: nodejs8.10
CodeUri: 's3://testBucket/mySourceCode.zip'
- AWS::Include 변환
-
CloudFormation에서 호스팅된 매크로인 AWS::Include 변형을 사용하여 보일러플레이트 콘텐츠를 템플릿에 삽입
-
AWS::Include 변형을 사용하여 S3 버킷에서 템플릿 코드 조각에 대한 참조를 생성할 수 있음
-
AWS::Include 함수는 프래그래밍 언어로 include, copy 또는 import 지시문과 비슷하게 동작
-
사용 예제-1 (Transform 섹션에 있는 템플릿 최상위에 AWS::Include 변형을 포함)
Transform:
Name: 'AWS::Include'
Parameters:
Location: 's3://MyAmazonS3BucketName/MyFileName.yaml’ # 위치는 구체적인 파일 이름이 S3버킷인 URL
참조 URL
https://docs.aws.amazon.com/ko_kr/AWSCloudFormation/latest/UserGuide/cfn-whatis-concepts.html
https://www.slideshare.net/awskorea/6-infra-auto-deploy-awscloudformation-advanced-skill
'AWS' 카테고리의 다른 글
AWS Auto Scaling 종료 정책 (0) | 2019.04.09 |
---|---|
AWS CloudFormation 내장함수 (0) | 2019.04.09 |
AWS Resource Group (0) | 2019.04.09 |
AWS CodeBuild (0) | 2019.04.09 |
AWS CodeCommit (0) | 2019.04.09 |