この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
안녕하세요, 임채정입니다.
저는 요즘에 Cloudformation 을 사용해서 리소스 작성을 많이 하고 있습니다.
이 때, 템플릿에서 사용하는 함수에 대해서 정리해두면 도움이 될 것 같아서 이번 블로그에서는 Cloudformation 템플릿에 사용할 수 있는 함수를 정리해보려고 합니다.
하나의 블로그에서 전부 설명하기에는 함수가 많이 때문에 2개로 나눠서 진행하려고 합니다.
이 블로그에서 다룰 함수는 아젠다를 확인해주세요.
Cloudformation의 함수를 정리했습니다. ( 2 )
아젠다
- Fn::Base64
- Fn::Cidr
- 조건 함수
- Fn::FindInMap
- Fn::GetAtt
- Fn::GetAZs
1. Fn::Base64
함수의 정의
Fn::Base64
함수는 입력 문자열의 Base64 표시 반환합니다.- 일반적으로
UserData
속성으로 인코딩된 데이터를 아마존 EC2 인스턴스에 전달하는 데 사용합니다. -
파라미터 (매개변수)
- valueToEncode
- Base64로 변환할 문자열 값
- valueToEncode
- 반환 값
- 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이 생성됨
- ipBlock
- 반환 값
- 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
로 평과되는 조건
- condition
Fn::And: [condition]
!And [condition]
Fn::Equals
- 두 값이 같은지 비교
- 두 값이 같으면
true
를 반환, 다르면false
를 반환 - 파라미터 (매개변수)
- value
- 비교하려는 유형의 값
- 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
로 평가될 경우 반환할 값
- 지정된 조건이
- condition_name
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
로 평가되는 조건
- condition
Fn::Not: [condition]
!Not [condition]
Fn::Or
Fn::Or
는 OR 연산자의 역할- 지정된 모든 조건 중 하나라도 true로 평가되면
true
가 반환, 조건 모두 false로 평가될 경우false
가 반환 - 포함할 수 있는 최소 조건수는 2, 최대치는 10
- 파라미터 (매개변수)
- condition
true
또는false
로 평과되는 조건
- condition
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
에 할당된 목록의 키 중 하나로 설정된 두 번째 수준 키 이름
- MapName
- 반환 값
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
- 필요로 하는 값이 있는 리소스 고유 속성의 이름
- logicalNameOfResource
- 반환 값
- 속성 값
사용법
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)로 연락 주시면 빠른 시일 내 담당자가 회신 드릴 수 있도록 하겠습니다 !