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

2022.08.31

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

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

아젠다

  1. Fn::ImportValue
  2. Fn::Join
  3. Fn::Select
  4. Fn::Split
  5. Fn::Sub
  6. Fn::Transform
  7. Ref

1. Fn::ImportValue

함수의 정의

  • Fn::ImportValue 함수는 다른 스택에서 낸 출력 (OUTPUT) 값을 반환한다.
  • 각 AWS 계정의 Export 이름은 하나의 지역 내에서 고유하다

  • 파라미터 (매개변수)

    • sharedValueToImport
      • 가져올 스택의 출력 값
  • 반환 값
    • 스택의 출력 값

사용법

Fn::ImportValue: sharedValueToImport
!ImportValue sharedValueToImport

예시

템플릿(A)의 output 에서 지정한 리소스를 템플릿(B)에서 사용하는 경우

템플릿(A

#〜생략〜
Outputs:
	SubnetId:
	Value: !Ref SubnetId
	Description: ID of Subnet
	Export:
		Name: SubnetId
	
	SecurityGroupIds:
	Value: !Ref SecurityGroupIds
	Description: ID of Security Group
	Export:
		Name: SecurityGroupIds

템플릿(B)

#〜생략〜
EC2instance:
	Type: AWS::EC2::Instance
	Properties:
		ImageId: !Ref ImageId
		InstanceType: !Ref InstanceType
		SubnetId: !ImportValue SubnetId
		DisableApiTermination: true
		BlockDeviceMappings:
			- DeviceName: "/dev/xvda"
			Ebs:
				VolumeType: gp2
				VolumeSize: 30
				DeleteOnTermination: true
		SecurityGroupIds:
			- Fn::ImportValue: SecurityGroupIds
		KeyName: !Ref KeyName
#〜생략〜

2. Fn::Join

함수의 정의

  • Fn::Join 함수는 は、지정된 구분자로 구분된 일련의 값을 단일 값에 추가한다.
  • 구분자가 빈 문자열이면 일련의 값은 구분자 없이 연결된다.

  • 파라미터 (매개변수)

    • delimiter
      • 조각 둘 사이에서 발생하는 값
      • 구분자는 조각 간에만 발생하며 최종값은 종료되지 않음
    • ListOfValues
      • 결합하려는 값의 목록
  • 반환 값
    • 결합된 문자열

사용법

Fn::Join: [ delimiter, [ comma-delimited list of values ] ]
!Join [ delimiter, [ comma-delimited list of values ] ]

예시

여러 개의 CIDR이 출력 CIDR:CIDR:CIDR:CIDR....의 결과가 output 값으로 출력

#〜생략〜
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::Select

함수의 정의

Fn::Select 함수는 인덱스별 객체 목록에서 객체 1개 반환

  • 파라미터 (매개변수)
    • 인덱스
      • 가져올 객체의 인덱스
      • 값=0〜N-1
      • N=Array에 포함된 요소의 수
    • listOfObjects
      • 선택할 객체 목록
      • 이 목록은 null일 수 없으며 null 항목을 포함할 수도 없음
  • 반환 값
    • 선택된 객체

사용법

Fn::Select: [ index, listOfObjects ] 
!Select [ index, listOfObjects ]

예시

AvailabilityZone의 목록 중 0번째 항목 지정 CIDR의 목록 중 0번째 항목을 지정

#〜생략〜
# -----
# 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
#〜생략〜

4. Fn::Split

함수의 정의

  • Fn::Split 함수는 결과적으로 얻은 문자열 리스트에서 요소를 선택할 수 있도록 문자열을 문자열 값 리스트로 분할한다
  • 쉼표(,)과 같은 구분자를 이용하여 분할 위치 지정한다

  • 파라미터 (매개변수)

    • delimiter
      • 원본 문자열을 분할할 위치를 결정하는 문자열 값
    • source string
      • 분할하는 문자열의 값
  • 반환 값
    • 문자열 값의 목록

사용법

Fn::Split: [ delimiter, source string ]
!Split [ delimiter, source string ]

예시

지역명을 -를 기준으로 나누어 output 값으로 설정

#〜생략〜
Resources:
	MyVPC:
		Type: AWS::EC2::VPC
		Properties:
			CidrBlock: 10.0.0.0/16
			
Outputs:
	RegionPart:
		Value: !Select [1, !Split ["-", !Ref  "AWS::Region"]]
#〜생략〜

5. Fn::Sub

함수의 정의

Fn::Sub 함수는 입력 문자열의 변수를 지정한 값으로 변환한다.

  • 파라미터 (매개변수)
    • String
      • 변수가 포함된 문자열
    • VarName
      • String 파라미터에 포함할 변수의 이름
    • VarValue
      • AWS CloudFormation은 실행 시간일 때 연결된 변수 이름을 이 값으로 변환
  • 반환 값
    • 모든 변수를 이 값으로 바꾸어 원본 문자열을 반환

사용법

Fn::Sub:
  - String
  - Var1Name: Var1Value
    Var2Name: Var2Value

!Sub
  - String
  - Var1Name: Var1Value
    Var2Name: Var2Value

Fn::Sub: String
!Sub String

예시

Properties:  
	Name:  !Sub  
		-  www.${Env}.${DnsDomain}  
		-  Env:  {'Fn::ImportValue':  !Sub  '${text}-env'}  
		  DnsDomain:  {'Fn::ImportValue':  !Sub  '${text}-domain'}

또는

#〜생략〜
Parameters:
	Env:
		Default: "dev"
		Type: String
		Description: "Environment name"
	SystemName:
		Default: "SystemName"
		Type: String
		Description: "System name"

Resources:
  EC2instance:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: ami-00000000
      InstanceType: "t2.micro"
    #〜생략〜
	Tags:
		- Key: Name
		  Value: !Sub ${SystemName}-${Env}
#〜생략〜

6. Fn::Transform

함수의 정의

Fn::Transform 함수는 스택 템플릿의 일부분인 사용자 지정 처리를 할 매크로 지정 매크로를 통해 검색 및 변경 작업 등의 간단한 작업부터 템플릿 전체의 변형과 동일한 작업까지 템플릿에 대한 사용자 지정 처리 수행

  • 파라미터 (매개변수)
    • name
      • 처리를 실행하려는 매크로 이름
    • parameter
      • 매크로에 전달할 키-값 쌍으로 지정된 목록 파라미터
  • 반환 값
    • 처리된 스택 템플릿에 포함된 처리된 템플릿 코드 조각

사용법

Fn::Transform:
  Name : macro name
  Parameters :
          Key : value

Transform:
  Name: macro name
  Parameters:
    Key: value

예시

AWS::Include변형을 호출하여 템플릿 코드의 조각을 검색하는 위치가 InputValue 파라미터에 전달되도록 지정

#〜생략〜
Fn::Transform:
	Name: AWS::Include
	Parameters:
		Location: {Location:  {Ref:  InputValue}}
#〜생략〜

7. Ref

함수의 정의

Ref 함수는 지정된 파라미터 또는 리소스에 관한 정보는 반환한다.

  • 파라미터 (매개변수)
    • logicalName
      • 역참조하고자 하는 리소스 또는 파라미터의 논리 이름
  • 반환 값
    • 리소스의 물리적 ID 또는 파라미터 값

사용법

Ref: logicalName
!Ref logicalName

예시

#〜생략〜
Parameters:
	KeyPair:
	    Type: AWS::EC2::KeyPair::KeyName
	    Description: KeyPair Name

Resources:
  EC2instance:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: ami-00000000
      InstanceType: "t2.micro"
      #〜생략〜
      BlockDeviceMappings:
        - DeviceName: '/dev/xvda'
          Ebs:
            VolumeType: 'gp2'
            VolumeSize: 10
      KeyName: !Ref KeyPair
#〜생략〜

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