Cloudformation의 함수를 정리했습니다. ( 1 )

2022.08.31

안녕하세요, 임채정입니다.
저는 요즘에 Cloudformation 을 사용해서 리소스 작성을 많이 하고 있습니다.
이 때, 템플릿에서 사용하는 함수에 대해서 정리해두면 도움이 될 것 같아서 이번 블로그에서는 Cloudformation 템플릿에 사용할 수 있는 함수를 정리해보려고 합니다.
하나의 블로그에서 전부 설명하기에는 함수가 많이 때문에 2개로 나눠서 진행하려고 합니다.
이 블로그에서 다룰 함수는 아젠다를 확인해주세요.

Cloudformation의 함수를 정리했습니다. ( 2 )

아젠다

  1. Fn::Base64
  2. Fn::Cidr
  3. 조건 함수
  4. Fn::FindInMap
  5. Fn::GetAtt
  6. Fn::GetAZs

1. Fn::Base64

함수의 정의

  • Fn::Base64 함수는 입력 문자열의 Base64 표시 반환합니다.
  • 일반적으로 UserData 속성으로 인코딩된 데이터를 아마존 EC2 인스턴스에 전달하는 데 사용합니다.

  • 파라미터 (매개변수)

    • valueToEncode
      • Base64로 변환할 문자열 값
  • 반환 값
    • Base64로 표시된 원래 문자열

사용법

Fn::Base64: valueToEncode
!Base64 valueToEncode

예시

EC2 인스턴스의 userdata 속성으로 인코딩된 데이터를 아마존 EC2 인스턴스에 전달할 때

#〜생략〜
DevAnsibleEC2:
	Type: AWS::EC2::Instance
	Properties:
		ImageId: !Ref AMIIDAnsible
		InstanceType: !Ref InstanceTypeAnsible
		DisableApiTermination: true
		IamInstanceProfile: !Ref ManagementEC2Profile
		BlockDeviceMappings:
			- DeviceName: "/dev/xvda"
				Ebs:
					VolumeType: gp2
					VolumeSize: 8
		KeyName: !Ref KeyName
		Monitoring: false
		UserData: !Base64 |
			#! /bin/bash
			yum update
			yum install git
			yum install ansible
#〜생략〜

2. Fn::Cidr

함수의 정의

  • Fn::Cidr 함수는 CIDR 주소 블록의 Array 를 반환합니다.
  • 반환된 CIDR 블록의 수는 count 파라미터에 따라 달라집니다.

  • 파라미터 (매개변수)

    • ipBlock
      • 작은 CIDR 블록으로 분할되는 사용자 지정 CIDR 주소 블록
    • count
      • 생성되는 CIDR 개수
      • 유효한 범위는 1~256
    • cidrBits
      • CIDR 에 대한 서브넷 비트수
      • 예를 들어 이 파라미터에 대한 값으로 「8」을 지정하면 「/24」 마스크의 CIDR이 생성됨
  • 반환 값
    • CIDR 주소 블록의 Array

사용법

Fn::Cidr: 
  - ipBlock 
  - count
  - cidrBits

!Cidr [ ipBlock, count, cidrBits ]

예시

OUTPUT에서 VPC의 CIDR(192.168.0.0/16)을 기준으로 10개의 서브넷 마스크가 '/24'의 CIDR을 출력

#〜생략〜
Resources:  
	VPC:  
		Type: AWS::EC2::VPC  
		Properties:  
			CidrBlock:  192.168.0.0/16
			nableDnsSupport:  true  
			EnableDnsHostnames:  true  

Outputs:  
	Subnets:  
		Description:  Output Fn::Cidr
		Value:  !Join  [  ":",  !Cidr  [  192.168.0.0/16,  10,  8  ]  ]

3. 조건 함수

함수의 정의

  • 조건 함수를 사용하여 스택 리소스를 조건부 생성
  • 스택 생성 및 업데이트 시 선언하는 입력 파라미터를 기준으로 이 조건을 평가

Fn::And

  • Fn::And는 AND 연산자의 역할
  • 포함할 수 있는 최소 조건수는 2, 최대치는 10
  • 파라미터 (매개변수)
    • condition
      • true 또는 false로 평과되는 조건
Fn::And: [condition]
!And [condition]

Fn::Equals

  • 두 값이 같은지 비교
  • 두 값이 같으면 true를 반환, 다르면 false를 반환
  • 파라미터 (매개변수)
    • value
      • 비교하려는 유형의 값
Fn::Equals: [value_1, value_2]
!Equals [value_1, value_2]

Fn::If

  • 지정된 조건이 true 로 평가될 경우 특정 값을 반환하고 지정된 조건이 false 로 평가될 경우 다른 값을 반환
  • 파라미터 (매개변수)
    • condition_name
      • 조건 섹션의 조건 참조
      • 조건의 이름을 사용하여 조건을 참조
    • value_if_true
      • 지정된 조건이 true로 평가될 경우 반환할 값
    • value_if_false
      • 지정된 조건이 false로 평가될 경우 반환할 값
Fn::If: [condition_name, value_if_true, value_if_false]
!If [condition_name, value_if_true, value_if_false]

Fn::Not

  • Fn::Not는 NOT 연산자의 역할
  • false로 평가되는 조건에 대해서 true를 반환하고 true로 평가되는 조건에 대해서 false를 반환
  • 파라미터 (매개변수)
    • condition
      • Fn::Equals 또는 true로 평가되는 조건
Fn::Not: [condition]
!Not [condition]

Fn::Or

  • Fn::Or는 OR 연산자의 역할
  • 지정된 모든 조건 중 하나라도 true로 평가되면 true가 반환, 조건 모두 false로 평가될 경우 false가 반환
  • 포함할 수 있는 최소 조건수는 2, 최대치는 10
  • 파라미터 (매개변수)
    • condition
      • true 또는 false로 평과되는 조건
Fn::Or: [condition, ...]
!Or [condition, ...]

예시

AWSTemplateFormatVersion: "2010-09-09"
Parameters:
  Env:
    Type: String
    Default: prod
    AllowedValues:
      - dev
      - prod
    Description: environment name. (dev or prod)
  Scope:
    Type: String
    Default: public
    AllowedValues:
      - public
      - private
  EC2Role:
    Type: String
    Description: enter the ec2 role name.
  KeyPair:
    Type: AWS::EC2::KeyPair::KeyName
    Description: KeyPair Name
Conditions:
  IsProduction: !Equals [!Ref Env, "prod"]
  IsEC2Role: !Not [!Equals [!Ref EC2Role, ""]]
  IsPublic: !Equals [!Ref Scope, "public"]
  ProdAndPub: !And [!Equals [!Ref Env, "prod"], !Equals [!Ref Scope, "public"]]
  ProdOrPub: !Or [!Equals [!Ref Env, "prod"], !Equals [!Ref Scope, "public"]]

Resources:
  EC2instance:
    Type: AWS::EC2::Instance
    Condition: IsPublic
    Properties:
      ImageId: ami-00000000
      InstanceType: !If [IsProduction, "t2.micro", "t2.nano"]
      IamInstanceProfile: !If [IsEC2Role, !Ref EC2Role, !Ref "AWS::NoValue"]
      BlockDeviceMappings:
        - DeviceName: '/dev/xvda'
          Ebs:
            VolumeType: 'gp2'
            VolumeSize: 10
      KeyName: !Ref KeyPair
      Tags:
      -
        Key: Name
        Value: !Sub "${AWS::StackName}-${Env}-${Scope}"
        
Outputs:
  ProdAndPub:
    Value: !If [ProdAndPub, true, false]
  ProdOrPub:
    Value: !If [ProdOrPub, true, false]

4. Fn::FindInMap

함수의 정의

  • Fn::FindInMap 함수는 Mappings 섹션에서 선언된 2수준 맵의 키에 해당하는 값을 반환합니다.

  • 파라미터 (매개변수)

    • MapName
      • 키 및 값이 포함된 매핑 섹션에서 선언된 매핑의 논리적 이름
    • TopLevelKey
      • 최상위 키의 이름
      • 이 값은 키-값 페어 목록
    • SecondLevelKey
      • TopLevelKey에 할당된 목록의 키 중 하나로 설정된 두 번째 수준 키 이름
  • 반환 값
    • SecondLevelKey에 할당된 값

사용법

Fn::FindInMap: [ MapName, TopLevelKey, SecondLevelKey ]
!FindInMap [ MapName, TopLevelKey, SecondLevelKey ]

예시

Mappings 에 설정되어 있는 CIDR 값을 Fn::FindInMap을 이용하여 리소스에 지정

#〜생략〜
Mappings:
	SubnetConfig: 
		VPC: 
			CIDR: '10.0.0.0/16' 
		PublicOne: 
			CIDR: '10.0.0.0/24' 
		PublicTwo: 
			CIDR: '10.0.1.0/24' 
		PrivateOne: 
			CIDR: '10.0.100.0/24' 
		PrivateTwo: 
			CIDR: '10.0.101.0/24'

Resources: 
	VPC: 
		Type: AWS::EC2::VPC 
		Properties: 
			EnableDnsSupport: true 
			EnableDnsHostnames: true 
			CidrBlock: !FindInMap [SubnetConfig, VPC, CIDR]

	PublicSubnetOne: 
		Type: AWS::EC2::Subnet 
		Properties: 
		#〜생략〜
		CidrBlock: !FindInMap [SubnetConfig, PublicOne, CIDR] 
		
#〜생략〜

5. Fn::GetAtt

함수의 정의

  • Fn::GetAtt 함수는 템플릿의 리소스에서 속성 값을 반환합니다.

  • 파라미터 (매개변수)

    • logicalNameOfResource
      • 원하는 속성을 포함한 자원의 논리명 (논리적 ID라고도 함)
    • attributeName
      • 필요로 하는 값이 있는 리소스 고유 속성의 이름
  • 반환 값
    • 속성 값

사용법

Fn::GetAtt: [ logicalNameOfResource, attributeName ]
!GetAtt logicalNameOfResource.attributeName

예시

rds의 IAM Role Arn 의 값을 RDS 인스턴스에 설정

#〜생략〜
# ------------
# RDS IAM Role
# ------------
RDSRole:
	Type: "AWS::IAM::Role"
	Properties:
		AssumeRolePolicyDocument:
			Version: "2012-10-17"
			Statement:
				- Effect: "Allow"
					Principal:
						Service:
							- "monitoring.rds.amazonaws.com"
					Action:
						- "sts:AssumeRole"
		ManagedPolicyArns:
			- "arn:aws:iam::aws:policy/service-role/AmazonRDSMonitoringRole"
		Path: "/"
		RoleName: rds-monitoring-role

#〜생략〜

# ------------
# PostgreSQL Instance
# ------------
PostgreSQLDBInstance1:
	Type: "AWS::RDS::DBInstance"
	Properties:
		AutoMinorVersionUpgrade: false
		AvailabilityZone: "ap-northeast-1a"
		#〜생략〜
		MonitoringInterval: 60
		MonitoringRoleArn: !GetAtt RDSRole.Arn
		Engine: aurora-postgresql
		EngineVersion: "11.11"
		EnablePerformanceInsights: True
#〜생략〜

6. Fn::GetAZs

함수의 정의

  • Fn::GetAZs 함수는 지정된 리전의 AZ를 알파벳 순으로 나열하는 Array를 반환합니다
  • 고객이 다른 AZ에 액세스할 수 있기 때문에 템플릿 작성자는 Fn::GetAZs 함수를 사용하여 호출하는 사용자의 액세스 권한으로 조정되는 템플릿을 만듭니다

  • 파라미터 (매개변수)

    • AZ를 가져올 지역 이름의 빈 문자열을 지정하면 「AWS::Region」 으로 지정
  • 반환 값
    • 리전의 AZ 리스트

사용법

Fn::GetAZs: region
!GetAZs region

예시

Public Subnet에 AZ 를 지정할 때

#〜생략〜
# -----
# Public Subnet
# -----
publicSubnet:
	Type: AWS::EC2::Subnet
	Properties:
		AvailabilityZone: !Select [ 0, !GetAZs  '' ]
		CidrBlock: !Select [0, !Cidr [!GetAtt  vpc.CidrBlock, 2, 8]]
		VpcId: 10.0.0.0/16
		Tags:
			- Key: Name
			  Value: public-subnet
#〜생략〜

본 블로그 게시글을 보시고 문의 사항이 있으신 분들은 클래스메소드코리아 (info@classmethod.kr)로 연락 주시면 빠른 시일 내 담당자가 회신 드릴 수 있도록 하겠습니다 !