본문 바로가기
IT CHANNEL/Infra

[AWS] CloudFormation : 문법 및 스택정책을 쉽게 이해하기

by TitanX 2023. 8. 27.

 

CloudFormation 은 AWS에서 사용하는 기술중 하나로 IaC 를 위한 서비스이다. CloudFormation 문법 및 스택정책을 알아야 사용할 수 있으므로 가볍게 알아보도록 하겠다

 

CloudFormation에 사용되는 용어 및 명령어

 

 

Infrastructure as Code (IAC)와 YAML

AWS CloudFormation은 Infrastructure as Code (IaC)를 가능하게 하는 서비스이다.

CloudFormation은 주로 YAML 또는 JSON 파일을 사용하여 인프라를 설계하고 구성한다.

 

 

!Ref

!Ref는 CloudFormation 템플릿 내에서 다른 요소를 참조하는 데 사용되는데, 주로 리소스의 속성이나 파라미터 값을 가져오는 데 사용된다.

 

!FindInMap

!FindInMap 함수는 매핑된 값을 찾아 반환한다ㅣ

!FindInMap [ MapName, TopLevelKey, SecondLevelKey ]

 

 

위의 두 변수를 활용한 예시

 

Mappings:
  RegionMap:
    us-east-1:
      "32": "AMI~~~~1"
      "64": "AMI~~~~7"
Resources:
  myEC2Instance:
    Type: "AWS::EC2::Instance"
    Properties:
      ImageId: !FindInMap [ RegionMap, !Ref "AWS::Region", "32" ]

 

 

CloudFormation에서 출력과 임포트하는 방법

 

Outputs

Outputs 섹션은 CloudFormation 스택의 출력 값을 정의하는데, 이 값을 다른 스택에서 **!ImportValue**를 사용하여 가져올 수 있다.

Outputs:
  StackSSHSecurityGroup:
    Value: sg-123456
    Export:
      Name: SSHSecurityGroup_1

!ImportValue 를 사용한 예시

Resources:
  MySecureInstance:
    Type: "AWS::EC2::Instance"
    Properties:
      ImageId: something
      SecurityGroups:
        - !ImportValue SSHSecurityGroup_1

 

 

CloudFormation 의 조건문과 논리 연산자

아래 명령어들은 조건문 개념을 사용하는 명령어들이다

 

  • !Equals: 두 값이 같은지 비교
  • !And: 모든 조건이 참인지 확인
  • !If: 조건에 따라 값을 반환
  • !Not: 조건이 거짓인지 확인
  • !Or: 하나 이상의 조건이 참인지 확인

 

CloudFormation 추가 기능

 

 

!GetAtt

!GetAtt는 특정 AWS 리소스의 속성 값을 가져온다

!Join

!Join 함수는 배열의 요소를 문자열로 결합하는데, Python의 str.join() 메서드와 비슷하다고 생각하자.

yamlCopy code
!Join [ ":", [ "a", "b", "c" ] ]  # 결과: "a:b:c"

 

Rollback

롤백 기능은 스택 생성 또는 업데이트가 실패할 경우 이전 상태로 되돌린다.

 

 

Stack 정책

 

스택 정책을 사용하면 특정 리소스에 대한 업데이트를 허용,제한 할 수 있다.

 

AWS::RDS::Instance 리소스 타입을 가진 리소스의 업데이트 제외 예시

{
  "Statement": [
    {
      "Effect": "Deny",
      "Action": "Update:*",
      "Resource": "*",
      "Condition": {
        "StringEquals": {
          "ResourceType": "AWS::RDS::Instance"
        }
      }
    },
    {
      "Effect": "Allow",
      "Action": "Update:*",
      "Resource": "*"
    }
  ]
}