AWS

[AWS] aws 강의 섹션 18 (CloudFormation - StackSets, Parameters, Mappings, Outputs, Conditions, 내장 함수, Ref, GetAtt, findMap, Service Role, capabilities)

대기업 가고 싶은 공돌이 2024. 10. 13. 00:03

AWS CloudFormation

  • 클라우드 포메이션은 코드를 작성해서 AWS 인프라의 모든 리소스를 정의하는 방법이다.
  • 예를 들어
    • 보안 그룹이 필요해
    • 해당 보안그룹을 사용하는 Ec2 인스턴스 두 개가 필요해
    • EC2 인스턴스에 적용할 탄력적 ip가 필요해
    • S3 버킷이 필요해
    • Ec2 앞에 둘 ELB가 필요해
  • 라고 정의하면 클라우드 포메이션은 사용자가 적어둔 구성을 사용하여 순서대로 해당 항목들을 생성한다.
  • 따라서 수동 구성 및 수동 작업이 필요 없으며 모든 것이 클라우드 포메이션을 통해 예약된다.

  • 위와 같은 방식으로 모두 코드로 작성된다.
  • 그 다음 Application Composer를 사용하여 인프라를 시각화 한 뒤 
    구성 요소가 서로 어떻게 연관되어 있는지 확인할 수 있다.

이렇게 composer에서 구성요소를 클릭하면 해당 구성요소에 해당하는 템플릿의 일부 코드를 확인할 수 있다.

왜 클라우드 포메이션을 사용해야 할까?

  1. 코드로 표현된 인프라
    • 모든 것을 코드로 선언하고 제어하기 때문에, 제어 측면에서 뛰어나다.
    • 코드는 모두 git 등을 사용하여 버전 컨트롤이 가능하다.
    • 인프라에 대한 변경사항이 있다면 코드 리뷰를 통해 확인할 수 있다.
  2. 비용 측면
    • 클라우드 포메이션 스택 내의 모든 리소스에는 식별자가 태그로 지정되므로
      스택에 드는 비용을 쉽게 확인할 수 있다.
    • 클라우드 포메이션 템플릿에서 리소스 비용을 추정할 수도 있다.
    • 절약 전략을 세울 수 있다.
      • 5시에 템플릿을 삭제하고, 8시에 템플릿을 재 생성하는 방식으로 절약이 가능하다.
  3. 생산성
    • 인프라를 즉시 없애거나, 재생성 할 수 있다.
    • 템플릿에 대한 다이어그램을 자동으로 생성할 수 있다.
    • 선언적 프로그래밍으로, 리소스 생성 순서와 조정 작업을 고민할 필요가 없다고 한다.
      모든 작업은 클라우드 포메이션에서 수행된다.
  4. 관심사 분리
    • 각 계층 별로 다른 클라우드 포메이션 스택을 생성할 수 있다.
      스택이란 템플릿에서 정의된 리소스의 집합을 의미하며,
      배포 업데이트 등등을 진행할 리소스들의 집합을 의미한다.
      1. VPC에 대한 스택
      2. 네트워크에 대한 스택
      3. 애플리케이션을 위한 스택
    • 각 계층 별로 독립적으로 리소스를 관리할 수 있다.
  5. 기존 템플릿과 설명서를 활용하여 클라우드 포메이션 템플릿을 빠르게 만들 수 있다. 

클라우드 포메이션 작동 방식 

  1. 템플릿을 아마존 S3에 업로드한 다음 클라우드 포메이션이 S3를 참조해야한다.
  2. 클라우드 포메이션이 템플릿을 보고 스택을 생성한다.
  3. 이후 스택을 통해 AWs 리소스를 만든다.

  • 템플릿을 업데이트 하려는 경우 이전 템플릿을 편집할 수 없다.
  • 새 버전의 템플릿을 S3에 다시 업로드한 다음 스택을 업데이트 시켜야 한다.
  • 스택은 리전 단위에서 이름으로 식별되며, 
    스택을 삭제하면, 클라우드 포메이션에서 생성한 모든 아티팩트와 리소스가 삭제된다. 

클라우드 포메이션 템플릿 배포 방법

  • Application composer나 코드 편집기를 사용하여 템플릿을 생성한 다음
    콘솔을 사용하여 파라미터를 입력하는 수동적인 방법이 있다.
  • 자동화된 방식도 있다.
  • 템플릿을 yaml 파일로 편집한 다음
  • AWS CLI를 사용하여 템플릿을 배포할 수도 있고, CD 툴을 사용할 수도 있다.
  • 완전 자동화를 원하는 경우 권장되는 방법이다. 

클라우드 포메이션 템플릿 구성요소

  • 템플릿
    • AWSTemplateFormatVersion: 템플릿 읽는 방법 버전을 정의한다.
      • AWS 내부에서 사용하기 위한 것이다.
    • Description: 템플릿에 대한 설명이다.
    • Resource: 템플릿에 선언된 모든 AWS 리소스를 정의하는 반드시 필요한 유일한 요소다. 
    • Parameters: 템플릿에 필요한 동적 변수이다.
    • Mappings: 템플릿 내부에서 사용하는 정적 변수이다. 
    • Outputs: 템플릿에서 생성된 것에 대한 references이다.
    • Conditionals: 리소스 생성을 수행하기 위한 조건 목록이다.
  • 템플릿 헬퍼
    • 참조와 함수 기능 제공

스택 업데이트

  • 스택을 업데이트하는 유일한 방법은 템플릿을 새로운 것으로 바꾸는 것이다.
  • 스택을 삭제하면 모든 리소스가 같이 삭제된다.

Yaml 언어

  • cloud frmation 템플릿을 작성할 수 있는 언어다.
  • 강의자는 json으로 템플릿을 작성하면 가독성이 쓰레기라고 생각한다고 한다.

  • 야밀 파일은 키와 밸류 쌍으로 이뤄져있다.
  • - 는 배열을 나타낸다
    • product의 배열로 두 가지가 존재한다.
  • 여러 줄로 문자열 작성하는 것을 지원한다.
    • lines를 확인하면 | 로 여러 줄임을 명시하고 문자열을 입력했다.

클라우드 포메이션 - 리소스

  • 템플릿에서 다른 건 다 안 적어도 실행이 가능하지만 리소스는 템플릿에 명시해줘야지만 스택 생성이 가능하다.
  • 리소스는 템플릿으로부터 생성되는 다양한 AWS 구성 요소를 의미한다. 
  • AWS가 리소스 생성, 업데이트, 삭제를 자동으로 파악한다. 
  • 700가지 이상의 리소스 유형이 있다.
  • 리소스 유형 식별자는 다음과 같다.

동적인 수의 리소스를 생성할 수 있나요?

  • 예 cloudFormation Macros와 Transform을 사용해야 합니다.

모든 AWS 서비스가 지원되나요?

  • 몇 가지를 제외하고 모두 가능합니다.
  • 시험에서 사용 불가능 것을 사용하는 방법을 묻는다면 클라우드 포메이션 사용자 정의 리소스를 사용하면 된다.

클라우드 포메이션 - 파라미터

  • 파라미터는 템플릿에 인풋값을 넣는 방법이다.
  • 템플릿에 정의해야할 특정 값이 필요할 때 파라미터를 템플릿에 정의해서 템플릿을 작성하는 것이다.

파라미터를 언제 사용해야 할까?

위는 보안 그룹의 파라미터 정의다.

  • 지금 만드는 클라우드 포메이션의 리소스 구성이 향후 변경될 가능성이 있는가?
    • 있다면 파라미터를 구성해서 템플릿을 다시 업로드할 필요가 없게 만들어라 
  • 또한 미리 결정할 수 없는 경우에도 파라미터로 만들면 편리하다.
  • 예를 들어, EC2 인스턴스 타입, S3 버킷 이름 등등을 파라미터로 사용해서 
    인풋 값을 바꿔 유연하게 리소스 구성을 바꿀 수 있다.

파라미터 Setting

  • 파라미터에는 여러 설정이 있다. 
    1. 유형 Type
      • String
      • Number
      • CommaDelimitedList
      • List<Number>
      • AWS-Specific Parameter
      • List<AWS-specific Parameter>
      • SSM Parameter
    2. Description
    3. ConstraintDescription
    4. Min/Max Length
    5. Min/Max Value
    6. Default
    7. AllowedValues
    8. AllowedPattern
    9. NoEcho
  • 이러한 제약 조건과 유효성 검사들로 파라미터 값을 필터링 할 수 있다.

파라미터 예시

Allowed Values

  • 위와 같이 사용자에게 선택을 셋 중 하나로 강제할 수 있다.

NoEcho

  • 데이터베이스 비밀번호를 파라미터로 받는다면 어디에도 기록이 남지 않게 해야한다.
    이를 위해 NoEcho를 true로 설정하면 어디에도 기록이 남지 않는다

파라미터를 템플릿에 어떻게 사용할까

위와 같이 Ref를 사용하여 변수로 쓸 수 있다.

  • yaml 파일에서는 Ref 앞에 !를 붙여 약어로 사용한다.
  • json은 모르겠다.
  • 아무튼 Ref 함수를 사용하면 파라미터를 참조할 수 있을 뿐만 아니라
    템플릿 내의 다른 요소도 참조할 수 있다.

실제 사용 예시다.

pseudo(가상) 파라미터

  • 가상 파라미터를 지원한다.
  • 만들지 않아도 이미 존재하는 것이다.
  • 언제든지 사용할 수 있으며 기본적으로 활성화되어 있다.

예를 들어 참조 값 AWS::AccountId에 Ref 함수를 사용하면 반환 값은 실제 계정 Id가 나온다. 

계정 id 스택 id 스택 이름 등등의 가상 파라미터를 사용할 수 있다.

  • 또한 가상 파라미터에 사용자의 리전이 정의돼 있기 때문에
    사용자가 따로 입력해주지 않아도 클라우드 포메이션은 리전값을 이미 알고 있다.

클라우드 포메이션 - Mappings

  • 매핑은 클라우드 포메이션 템플릿 내의 고정 변수다.
  • 서로 다른 환경을 구별하려는 경우 매우 편리하다.
Mappings:
  RegionMap:
    us-east-1:
      AMI: ami-0ff8a91507f77f867
      HVM64: ami-0ff8a91507f77f867
    us-west-1:
      AMI: ami-0bdb828fd58c52235
      HVM64: ami-0bdb828fd58c52235
    eu-west-1:
      AMI: ami-047bb4163c506cd98
      HVM64: ami-047bb4163c506cd98

 

  • 이렇게 지역별로 AMI와 HVM을 다 다른 값으로 매핑 시켜놓으면 된다.
  • 동적으로 입력받는 것이 아닌, 리전을 보고 자동으로 템플릿 내에서 MAI와 HVM을 선택한다.
  • 만약 스택이 us-west-1에서 생성되면 자동으로 매핑이 된 값이 사용된다. 

위와 같은 형식으로 사용해주면 된다. 

언제 매핑을 사용하고 언제 파라미터를 사용할까?

  • 매핑은 리전, 가용 영역, AWS 계정, 환경 등과 같은 변수에서 설정할 값을 미리 다 알고 있을 때 사용하기 적합하다.
  • 파라미터는 정확한 값을 알지 못하고 사용자 마다 다른 값이 사용될 거 같을 때 파라미터를 사용한다.

클라우드 포메이션 - Outputs

  • 출력은 선택사항이다. 
  • 스택이 생성, 업데이트 또는 삭제된 후 생성된 리소스의 중요한 정보를 반환하는 기능이다.
  • outputs를 사용하면 클라우드 포메이션이 만든 리소스의 값을 외부에서 참조하거나,
    다른 스택에서 해당 정보를 가져다 쓸 수 있다.
    • 스택이 생성한 리소스의 URL, ID, ARN과 같은 정보를 제공한다.
    • outputs의 값을 기반으로 다른 스택에서 해당 리소스에 연결할 수 있다.
      즉 다른 스택과 리소스 공유가 가능해진다. 

SSH 보안 그룹의 값이 담긴 output이다.

  • export의 Name은 리전 단위에서 고유해야 한다.
  • 이제 이 value를 통해 SSH 접근을 할 수 있다.

 

이렇게 !ImportValue 그리고 설정한 이름으로 값을 참조할 수 있다. 

 

이제 스택끼리 연관관계를 갖게 됐기 때문에 

SSH SecurityGroup 값을 내보낸 첫번째 스택은 다른 모든 스택이 참조하지 않을 때까지 삭제되지 못한다.

클라우드 포메이션 - Conditions

  • 특정 조건을 바탕으로 리소스 또는 output 생성을 제어할 수 있다.
  • 예를 들어, 개발 스택과 같이 개발 환경에서만 생성되는 항목이 있고
  • 배포 환경에서만 생성되는 항목이 있다.
  • 배포 환경에서만 EBS 볼륨 생성을 허용한다. 같은 식으로 원하는 대로 조건을 만들 수 있다.
  • 일반적으로 개발, 배포 환경이나
    현재 있는 리전 또는 파라미터 값을 기반으로 조건을 생성한다. 
  • 각 조건은 서로 참조할 수 있으며 파라미터 값이나 매핑도 참조할 수 있다.

만약 EnvType이 prod와 같다면 해당 값은 true가 된다. 

이와 같은 여러 조건을 사용할 수 있다. 

 

다음과 같이 템플릿에 condition 이름을 적어주면 적용된다. 

 

  • condition이 true라면 MountPoints가 생성되고, 아니라면 생성되지 않는다.

클라우드 포메이션 - 내장 함수

  • 파란색은 꼭 알아야한다. 

Ref

  • 참조를 얻기위해 사용한다.
  • 파라미터의 참조일 수도 있고
  • 리소스의 물리적 ID를 반환하는 리소스에 대한 참조일 수도 있다. 
  • 항상 느낌표와 함께 !Ref 와 같이 사용된다.

GetAtt

  • 생성한 리소스의 속성 값을 얻기 위해 사용하는 함수다.
  • 리소스가 어떤 속성값을 갖고 있는지 알아보는 가장 좋은 방법은 문서를 살펴보는 것이다.
    • EC2 인스턴스 유형의 리소스에 대해 Ref 를 사용하면 인스턴스 ID를 반환받는다.
    • 하지만 GetAtt을 사용해서 속성을 가져오는 경우 더 많은 정보를 얻을 수 있다.
      • 가용영역
      • ID
      • priavate DNS name
      • private IP
      • public DNS name
      • public IP 등등 ,,
  • 문서에 정의된 속성, 클라우드 포메이션이 지원하는 내용만 얻을 수 있다. 
  • 따라서 EC2 인스턴스에서 가용 영역을 가져오려면

다음과 같이 GetAtt을 통해 얻어올 수 있다. 

EC2Instance는 정의한 리소스의 이름이다.

 

FindMap

  • 특정 맵의 특정 키에서 직접 값을 가져오는 함수다.

ImportValue

  • 다른 스택에서 내보낸 값( Outputs )을 가져오는 데 사용되는 함수다.

Base64

  • 문자열을 베이스64로 인코딩 해주는 함수다.

EC2 인스턴스의 userdata에 데이터를 전달할 때 많이 사용된다.

  • 사용자 데이터의 문자열을 정의하기 전에 Base64 함수를 사용하고 
  • 이는 자동으로 인코딩 되어 EC2 인스턴스로 전달된다. 

Condition Functions

  • 리소스나 아웃풋 생성에 조건을 거는 함수다. 

  • 이런 조건들이 가능하다.

클라우드 포메이션 - Rollbacks

  • 매우 중요
  • 스택 생성이 실패하는 경우 두 가지 옵션이 있다.
    • 기본 옵션: 모든 것이 롤백되어 삭제된다.
      • 리소스는 볼 수 없으나 클라우드 포메이션 로그에서 실패 이유를 알 수 있다.
    • 리소스중 하나에 문제가 있어 다 삭제하고 싶지 않다면
    • 롤백을 비활성화 하여 스택 생성 중에 발생한 문제를 해결할 수 있는 옵션이 있다. 
  • 스택 업데이트에 문제가 있는 경우:
    • 기본적으로 스택은 마지막 작업 상태로 자동 롤백되어 새로 생성된 모든 항목을 삭제한다.
    • 로그에서 일어난 일을 확인할 수있다.
  • 롤백이 실패하는 경우:
    • 스택에 문제가 있는 것이다. 
    • 수동으로 변경된 리소스가 있었을 것이다. 
    • 이 경우 해당 리소스를 수동으로 수정해야 한다.
    • 그 후 콘솔이나 API를 통해 ContinueUpdateRollback을 실행하여,
      롤백을 다시 시도하도록 지시할 수 있다.

클라우드 포메이션 - changeSets

CloudFormation의 ChangeSets는 스택을 업데이트할 때 발생할 변경 사항을 미리 검토할 수 있도록 해주는 기능이다. 이를 통해 스택을 실제로 업데이트하기 전에 어떤 리소스가 추가, 수정, 삭제될지 미리 확인할 수 있다. 즉, ChangeSets는 실수로 스택에 영향을 주는 변경을 막아주는 중요한 도구다.

  1. 변경 미리보기: ChangeSets를 생성하면 스택 업데이트 시 어떤 리소스가 어떻게 변경될지를 미리 볼 수 있다. 이를 통해 실제로 스택을 수정하기 전에 잠재적인 영향에 대해 검토할 수 있는 기회를 제공한다.
  2. 안전한 업데이트: CloudFormation 스택을 직접 수정하면 의도치 않게 리소스가 삭제되거나 변경될 위험이 있다. ChangeSets를 사용하면 변경 사항을 사전에 검토하고, 예상치 못한 변경이 있을 경우 이를 방지할 수 있다.
  3. 다양한 작업 검토:
    • 추가(Add): 새로운 리소스가 스택에 추가되는지 확인할 수 있다.
    • 수정(Modify): 기존 리소스가 수정되는지, 그리고 어떤 속성이 변경되는지 볼 수 있다.
    • 삭제(Remove): 스택에서 어떤 리소스가 삭제될 예정인지 미리 확인 가능하다.

클라우드 포메이션 - Service Role

  • 클라우드 포메이션의 Service Role이란 
    클라우드 포메이션이 스택을 생성, 업데이트 또는 삭제할 때 사용할 수 있는 IAM 역할을 의미한다.
    • EC2 인스턴스를 만들거나 S3 버킷을 생성하는 등의 작업을 수행할 때 IAM 역할을 참조해서 만든다.
  • 보안을 위해서는 최소 권한 원칙을 준수하도록 하자
  • 사용자에게 스택 리소스를 생성할 수 있는 모든 권한을 부여하고 싶지 않을 때
    서비스 권한을 설정해서 사용자는 못 만들고, 클라우드 포메이션에서만 리소스를 생성할 수 있게
    보안을 강화할 수도 있다.
    • 권한이 없는 사용자가 클라우드 포메이션을 통해 리소스를 생성하려면
      iam:PassRole이라는 이름의 권한이 있어야 한다.

클라우드 포메이션 - Capabilities

  • 스택 템플릿을 실행할 때 특정 작업에 대해 확인을 요청하는 것을 의미한다.
  • 클라우드 포메이션에서 리소스를 생성, 수정, 삭제할 때 특정 작업이 보안상 중요한 영향을 미칠 수 있기에
    이러한 작업을 수행할 때 capability 즉 동의를 구하는 것이다.
  • 종류는 다음과 같다

Capability_iam

  • IAM 리소스를 생성하거나 수정할 수 있도록 허용하는 권한이다.
  • IAM Role, User, Policy, Group 등이 포함된다.
  • IAM 관련 작업은 아주 중요한 보안 요소이기 때문에 직접적으로 권한을 명시해줘야 한다.

Capability_named_iam

  • 이름이 지정된 IAM 리소스를 생성하거나 수정할 수 있도록 허용하는 권한이다.
  • 예를 들어, myCustomRole 이라는 이름을 가진 IAM 역할을 생성하려는 경우 이 권한을 사용해야 한다.

Capability_auto_expand

  • 템플릿을 동적으로 확장하거나 수정할 수 있는 기능이다.
  • 템플릿에 매크로 또는 스택 안의 스택이 포함된 경우 필수적으로 권한을 명시해줘야 한다.

만약 InsufficientCapabilitiesException이 발생했다면,

클라우드 포메이션 템플릿에 capabilites가 필요했지만 사용자가 허가해주지 않았기에 발생한 것이다. 

 

이럴 경우, 템플릿 업로드를 다시 실행해야 하며, capabilities를 적절하게 사용해야 한다.

 

클라우드 포메이션 - DeletionPolicy Delete

  • 스택이 삭제될 때 특정 리소스가 어떻게 처리될 지를 정의하는 속성이다.
  • DeletionPolicy: Delete는 스택이 삭제될 때 해당 리소스를 완전히 제거하는 동작을 의미한다. 
    default값이다.
  • DeletionPolicy: Retain은 스택이 삭제될 때 리소스를 보존하거나 백업한다. 
  • DeletionPolicy: snapshot은 EBS, elasticache Cluster, elastiCache ReplicationGroup, 등등
    스냅샷이 가능한 것에만 적용된다. 삭제되기 전 스냅샷을 만든다.
    • 만약 S3에서 DeletionPolicy를 Delete로 설정해놨어도,
      S3가 비어있지 않다면 삭제되지 않는다.

      알아서 다 비워야 삭제가 진행된다. 

클라우드 포메이션 - 스택 정책

  • 스택 업데이트는, 기본적으로 원하는 모든 리소스에 적용이 가능하다.
  • 하지만 때에 따라 스택 또는 스택의 일부를 업데이트로부터 보호하고 싶을 수 있다.
    이 때 스택 정책을 사용하면 된다.
  • Json 문서이며, 스택 업데이트 중 특정 리소스에 허용되는 업데이트 작업을 정의한다.

두 번째 항목을 보면, ProductionDatabase가 리소스고 Deny라고 정의됐다

즉, ProductionDatabase는 모든 종류의 업데이트가 적용되지 않는다. 

  • 스택 정책의 목표는 의도치 않은 업데이트로부터 리소스를 보호하는 것이다. 
  • 스택 정책은 기본적으로 스택의 모든 리소스의 업데이트를 거부한다.
  • 따라서 업데이트를 허용할 리소스에 대해서는 명시적인 Allow 문을 사용해야 한다. 

클라우드 포메이션 - 삭제 방지(보호)

  • 우발적인 삭제로부터 스택을 보호하기 위해 사용한다.

클라우드 포메이션 - Custom Resource

  • 커스텀 리소스는 클라우드 포메이션에서 지원되지 않는 리소스를 사용하고 싶을 때 쓴다.
  • 자체 온프레미스 리소스 또는 타사 리소스와 같이 외부에 있을 수 있는 리소스에 대한
    로직을 정의할 수 있다. 
  • 또는 람다 함수를 통해 클라우드 포메이션의 스택 생성, 업데이트, 삭제 단계에서 Custom
    스크립트가 실행되도록 할 때도 사용할 수 있다. 
    • 예를 들어, S3 버킷을 삭제하기 전에 람다 함수를 실행해서 S3 버킷을 비우는 것이다.
  • custom 리소스를 정의하려면 템플릿에서 정의해야 하고 

  • Type은 이와 같은 형식으로 정의할 수 있다. 

람다 custom Resource 예시

  • ServiceToken은 ARN 또는 SNS ARN을 의미한다.
  • Parameters를 사용해서 람다함수에 입력 값을 제공할 수 있다. 

  • 이렇게 클라우드 포메이션에서 custom 리소스를 통해 람다 함수를 호출하고 S3 버킷을 비울 수 있다.

클라우드 포메이션 - StackSets

  • 스택세트는 여러 계정이나 리전에 걸쳐있는 스택을 
    create, update, delete 하나의 작업 또는 하나의 템플릿에서 해결하는 방법이다.
  •  관리자 계정에서 템플릿을 가져와서 스택 세트를 만들 수 있다.
  • 스택 세트를 사용해서 여러 지역의 여러 계정에 스택을 배포하는 것이다. 
    • 일반적인 사용 사례는 group 내의 모든 계정에 업데이트를 적용하는 것이다.
  • 관리자 계정 또는 관리자로 지정된 사람만 스택 세트를 만들 수 있다.