728x90
■ AWS - CloudFormation 정의
- AWS에서 제공하는 인프라를 코드로 관리 할 수 있는 IaC (Infrastructure as Code)의 기능을 제공하며, AWS에 구성할 아키텍처와 AWS의 대부분의 리소스를 구성 할 수 있습니다.
■ AWS - CloudFormation 특징
- IaC (Infrastructure as Code): 생성이 필요한 리소스를 작업자가 수동으로 생성하지 않고 JSON 또는 YAML을 이용한 Code를 기반으로 인프라를 구성 합니다. 생성된 산출물은 " 템플릿 "이라고 하며 버전 정보를 가집니다.
- 생산성 향상: 템플릿을 기반으로 하여 클라우드 인프라 생성과 삭제가 자유로우며, 생성이 진행되는 이벤트를 추적 관리 할 수 있습니다.
- 높은 재사용: 생성한 템플릿은 S3에 저장되며 기존에 작성한 템플릿 재사용 또는 공유를 통한 재사용성을 높일 수 있습니다.
- 삭제 종속성: CloudFormation으로 생성된 리소스는 기본적으로 스택을 삭제하면 모두 삭제 됩니다. 삭제 종속성을 회피하기 위해서 스택 생성시 종료 방지를 활성화 하면 생성된 리소스를 보호할 수 있습니다.
■ AWS - CloudFormation 템플릿 구성요소
- 리소스(Resource, 필수): 클라우드포메이션을 활용하여 생성 할 AWS 리소스 명칭 입니다. (EC2, 보안그룹, EIP, ELB 와 같은 AWS 서비스)
- 구조: AWS::aws-production-name::data-type-name (AWS::EC2::Subnet)
- 리소스에 대한 전반적인 가이드: Learn template basics - AWS CloudFormation (amazon.com)
- 리소스가 정의되면 상호 참조가 가능 합니다. (아래 매개변수 참조)
- 매개변수(Parameter): 템플릿에서 사용할 동적 입력값 입니다. 매개변수를 사용하면 템플릿의 재사용성이 높아 집니다.
- 내부 참조: 템플릿 내부에서 정의된 리소스를 다른 리소스에서 참조 하고자 할 때 사용 합니다. 아래와 같이 Subnet이 연동되어야 하는 VPC에 대해서 참조할 때 사용되며 !Ref 를 붙이고 리소스 명칭을 추가하여 사용 합니다.
Resources: MySubnet: Type: 'AWS::EC2::Subnet' Properties: VpcId: !Ref MyVPC
- 외부 참조: 템플릿을 활용하여 스택 생성 시 사용자의 입력값을 필요로 하는 매개변수 입니다. Parameters 라는 항목 아래 필요로 하는 내용을 정의하고 인스턴스 생성 시 입력 받아야 할 Key Pair를 !Ref를 사용하여 참조 하였습니다. 해당 외 다양한 조건에서 사용할 수 있습니다.
Parameters: KeyName: Type: AWS::EC2::KeyPair::KeyName Description: Name of an existing EC2 KeyPair to enable SSH access to the instance Resources: MyInstance: Type: 'AWS::EC2::Instance' Properties: InstanceType: t2.micro ImageId: ami-081a36454cdf357cb KeyName: !Ref KeyName # 사용자 입렵이 필요한 매개변수 지정
- 내부 참조: 템플릿 내부에서 정의된 리소스를 다른 리소스에서 참조 하고자 할 때 사용 합니다. 아래와 같이 Subnet이 연동되어야 하는 VPC에 대해서 참조할 때 사용되며 !Ref 를 붙이고 리소스 명칭을 추가하여 사용 합니다.
- 매핑(Mapping): 템플릿에서 사용할 정적 변수 입니다. 사용자 환경이나 특수 목적을 위해서 사용되는 하드 코딩된 항목 입니다.
- 템플릿에서 사용할 정보들을 사전에 알고 있을 때 유용합니다. (리전, AMI ID, 가용 영역, AWS ID)
- 매핑 값에 접근하기 위해 Fn::FindInMap 함수를 사용 합니다.
- !FindInMap [ MapName, TopLevelKey, SecondLevelKey] 3개의 매개변수로 이루어져 있습니다.
Mappings: RegionMap: ap-northeast-1: "32": "ami-1" "64": "ami-2" ap-northeast-2: "32": "ami-1" "64": "ami-2" ap-northeast-3: "32": "ami-1" "64": "ami-2" Resources: MyEC2Instance: Type: AWS::EC2::Instance Properties: ImageId: !FindInMap [ResionMap, !Ref "AWS::Region", 64] # !FindInMap 함수를 사용하여 Mappings에 정의된 RegionMap을 참조 합니다. # !Ref "AWS::Region"을 사용하여 현재 리전 정보를 가져 옵니다. # 64를 사용하여 사용할 AMI ID값을 참조 합니다. InstanceType: t2.micro
- 출력(Output): 옵션값 이며, 출력을 설정하면 다른 스택에서 사용할 수 있습니다.
- 다른 템플릿에서 생성한 값을 공유할 때 사용합니다. 해당 값을 참조한 스택이 있을 경우 원본 스택은 삭제가 불가능 합니다.
- Fn::ImportValue 함수를 사용합니다.
Template1 . . Outputs: StackSSHSecurityGroups: Description: Only Allowed The SSH Group Value: !Ref CompanySSHSecurityGroup Export: Name: SSHSecurityGroup ##### Template2 . . Resources: MyInstance: Type: AWS::EC2::Instance Properties: ImageId: ami-a... InstanceType: t2.micro SecurityGroups: - !ImportValue: SSHSecurityGroup
- 조건(Condition): AWS 리소스를 생성할 때 수행하는 조건문 입니다. (IF문)
- 템플릿 내에서 특정 조건에 따라 리소스 생성 여부를 결정하는 데 사용됩니다.
- 조건은 Conditions 섹션에서 정의되며, Fn::If 함수를 사용하여 조건을 평가합니다. 조건이 true로 평가되면 해당 리소스가 생성되고, false로 평가되면 생성되지 않습니다
- 조건에서 논리적 연산자 (And, Equals, If, Not, Or)를 사용하며 아무런 연산자가 붙지 않으면 주어진 조건이 "참" 일 경우 구문이 실행 됩니다.
- 아래 코드에서 매개변수 Environment를 지정하고 조건절에서 평가 합니다. MyDevResource 항목에 있는 Condition에서 CreateDevResources 가 "True" 일경우 MyDevResource 에 있는 Properties 항목이 수행 됩니다.
Parameters: Environment: Type: String Default: Production Conditions: CreateDevResources: !Equals [!Ref Environment, Development] Resources: MyDevResource: Condition: CreateDevResources Type: AWS::Some::Resource Properties: # Dev resource properties here MyProdResource: Type: AWS::Some::Resource Properties: # Prod resource properties here
- 메타데이터(Metadata): 템플릿에 작성된 코드에 대한 설명을 추가하기 위한 데이터 입니다. 메타데이터 키 라는 기능을 활용하여 해당 섹션에서 정의하는 설정 또는 구성 정보를 가져옵니다.
Metadata: Instances: Description: "Information about the instances" Databases: Description: "Information about the databases"
- AWS::CloudFormation::Init 라는 유형을 사용하여 cfn-init 헬퍼 스크립트에 대한 Amazon EC2 인스턴스에 메타데이터를 포함합니다
참조: AWS - CloudFormation Advanced (tistory.com)
- AWS::CloudFormation::Init 라는 유형을 사용하여 cfn-init 헬퍼 스크립트에 대한 Amazon EC2 인스턴스에 메타데이터를 포함합니다
■ AWS - CloudFormation 내장 함수
- Ref
- 매개변수를 참조할 때 사용. 템플릿 내에서 다른 리소스를 참조할 때 사용하거나 매개변수의 값을 반환 할 때 사용 합니다.
- Fn::GetAtt
- 리소스의 속성값을 가져올 때 사용 합니다.
- !GetAtt 약어로 사용 합니다.
- Fn::FindInMap
- Mapping에 정의된 값을 가져올 때 사용합니다.
- Fn::ImportValue
- 내보내기 (Output)된 값들을 가져올 때 사용 합니다.
- Fn::Join
- 분리된 값을 구분자로 결합 할 때 사용 합니다.
- !Join [ 구분자, [데이터1, 데이터2] ]
- !Join [ ":" , [a, b, c] ] → a:b:c 가 생성 됩니다
- Fn::Sub
- Substitue의 약자로 Sub를 사용하며, 특정 텍스트를 다른 텍스트로 치환 합니다.
- !Sub 약어를 사용하며 문자열에 $기호가 있어야 합니다.
- 아래 예제 코드는 매개변수로 UserName을 정의하고 EC2 인스턴스에서 매개변수 UserName을 참조하여 John 이라는 문자열로 치환 됩니다.
Parameters: UserName: Type: String Default: John Resources: MyInstance: Type: AWS::EC2::Instance Properties: ImageId: ami-12345678 InstanceType: t2.micro UserData: Fn::Base64: !Sub | #!/bin/bash echo "Hello, ${UserName}!" > /tmp/hello.txt
- 템플릿 내부에 있는 코드중 !가 붙는 경우 CloudFormation의 내장 함수 입니다.
728x90
'AWS' 카테고리의 다른 글
AWS - CloudFormation EC2 사용자 정의 데이터 (0) | 2024.03.07 |
---|---|
AWS - CloudFormation (실습) (0) | 2024.03.07 |
AWS - S3 (Simple Storage Service) (0) | 2024.03.02 |
AWS - Elastic File Storage (EFS) (0) | 2024.03.02 |
AWS - Elastic Block Storage (EBS) (0) | 2024.03.02 |