CloudFormation 내장 함수
1 AWS CloudFormation 내장 함수 (Intrinsic Functions) 총정리
- AWS CloudFormation은 템플릿 작성 시 유용하게 사용할 수 있는 다양한 내장 함수를 제공합니다.
- 이러한 함수들은 템플릿의 유연성을 높이고, 동적인 값 처리를 가능하게 합니다.
- 이 글에서는 CloudFormation의 주요 내장 함수들을 자세히 살펴보고, 그 사용법을 알아보겠습니다.
2 내장 함수 소개
- CloudFormation 내장 함수는 템플릿 내에서 동적인 값을 생성하거나 조작하는 데 사용됩니다.
- 이 함수들은 리소스 속성 값을 설정하거나, 조건을 평가하거나, 출력 값을 생성하는 데 활용됩니다.
- 주요 내장 함수들은 다음과 같습니다:
- Ref
- Fn::GetAtt
- Fn::Join
- Fn::Split
- Fn::Sub
- Fn::ImportValue
- Fn::FindInMap
- Condition Functions (Fn::If, Fn::And, Fn::Or, Fn::Not, Fn::Equals)
3 내장 함수 문법: '!' vs 'Fn::'
- CloudFormation 템플릿에서 내장 함수를 사용할 때 두 가지 문법을 사용할 수 있습니다: '!' 접두사와 'Fn::' 접두사
- 이 두 문법은 동일한 기능을 제공하지만, 사용되는 상황과 형식이 다릅니다.
3.1 '!' 접두사
- '!' 접두사는 YAML 형식의 템플릿에서 주로 사용됩니다.
- 이 문법은 더 간결하고 가독성이 좋습니다.
- 예시:
MyBucket:
Type: 'AWS::S3::Bucket'
Properties:
BucketName: !Ref BucketNameParameter
3.2 'Fn::' 접두사
- 'Fn::' 접두사는 JSON 형식의 템플릿에서 주로 사용됩니다.
- YAML 형식에서도 사용 가능하지만, 더 장황한 형태입니다.
- 예시:
{
"MyBucket": {
"Type": "AWS::S3::Bucket",
"Properties": {
"BucketName": {
"Fn::Ref": "BucketNameParameter"
}
}
}
}
3.3 주의사항
- 모든 함수가 '!' 문법을 지원하는 것은 아닙니다. (예: Fn::GetAZs는 !GetAZs를 지원하지 않습니다)
- 일부 함수는 '!' 문법을 사용할 때 약간 다른 형식을 가집니다. (예: !Sub는 Fn::Sub와 약간 다른 문법을 가집니다)
- 동일한 템플릿 내에서 두 가지 문법을 혼용해서 사용할 수 있습니다.
4 주요 내장 함수 상세 설명
4.1 Ref
Ref함수는 파라미터나 리소스의 값을 참조할 때 사용합니다.- 파라미터를 참조할 경우 해당 파라미터의 값을 반환합니다.
- 리소스를 참조할 경우 해당 리소스의 식별자(예: 물리적 ID)를 반환합니다.
사용 예시
Parameters:
InstanceType:
Type: String
Default: t2.micro
Resources:
MyEC2Instance:
Type: AWS::EC2::Instance
Properties:
InstanceType: !Ref InstanceType
ImageId: ami-1234567890abcdef0
- 위 예시에서
!Ref InstanceType은Parameters섹션에서 정의된InstanceType파라미터의 값을 참조합니다.
4.2 Fn::GetAtt
Fn::GetAtt함수는 리소스의 속성 값을 가져올 때 사용합니다.- 리소스의 논리적 이름과 속성 이름을 인자로 받습니다.
사용 예시
Resources:
MyBucket:
Type: AWS::S3::Bucket
Outputs:
BucketARN:
Value: !GetAtt MyBucket.Arn
- 위 예시에서
!GetAtt MyBucket.Arn은MyBucket리소스의Arn속성 값을 가져옵니다.
4.3 Fn::Join
Fn::Join함수는 AWS CloudFormation에서 여러 값을 하나의 문자열로 결합할 때 사용하는 내장 함수입니다.- 이 함수는 문자열 조합을 유연하게 할 수 있어, 동적인 리소스 이름이나 ARN을 생성할 때 특히 유용합니다.
Fn::Join함수는 두 개의 파라미터를 받습니다:- delimiter (구분자): 값들 사이에 삽입될 문자열입니다.
- list of values (값들의 리스트): 결합할 값들의 목록입니다.
예시
!Join
- delimiter
- [ value1, value2, ... ]
사용 예시
!Join
- ':'
- - 'arn'
- 'aws'
- 'iam'
- !Ref 'AWS::AccountId'
- 'role/my-role-name'
- 위 예시는 'arn:aws:iam:123456789012:role/my-role-name'과 같은 문자열을 생성합니다. (여기서 '123456789012'는 실제 AWS 계정 ID로 대체됩니다)
4.4 Fn::Split
Fn::Split함수는 문자열을 구분자를 기준으로 분할하여 리스트로 만듭니다.- 구분자와 분할할 문자열을 인자로 받습니다.
사용 예시
!Split
- ','
- !ImportValue 'ExportedSubnetIDs'
- 위 예시에서
ExportedSubnetIDs가 'subnet-1234,subnet-5678,subnet-9012'와 같은 값이라면, 이를 ['subnet-1234', 'subnet-5678', 'subnet-9012'] 리스트로 분할합니다.
4.5 Fn::Sub
Fn::Sub함수는 문자열 내의 변수를 실제 값으로 대체합니다.${VariableName}형식으로 변수를 지정하고, 이를 실제 값으로 대체합니다.
사용 예시
!Sub
- 'arn:aws:ec2:${AWS::Region}:${AWS::AccountId}:instance/${InstanceId}'
- InstanceId: !Ref MyEC2Instance
- 위 예시는 지정된 EC2 인스턴스의 ARN을 생성합니다.
${AWS::Region}과${AWS::AccountId}는 자동으로 현재 리전과 계정 ID로 대체됩니다.
4.6 Fn::ImportValue
Fn::ImportValue함수는 다른 스택에서 내보낸(exported) 출력 값을 가져올 때 사용합니다.- 스택 간 값을 공유할 때 유용합니다.
사용 예시
Resources:
MySecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
VpcId: !ImportValue MyVPCStack-VPCID
- 위 예시에서
MyVPCStack-VPCID는 다른 스택에서 내보낸 VPC ID 값을 가져옵니다.
4.7 Fn::FindInMap
Fn::FindInMap함수는 템플릿에 정의된 매핑에서 키에 해당하는 값을 찾을 때 사용합니다.- 매핑 이름, 최상위 키, 두 번째 레벨 키를 인자로 받습니다.
사용 예시
Mappings:
RegionMap:
us-east-1:
HVM64: ami-0ff8a91507f77f867
us-west-1:
HVM64: ami-0bdb828fd58c52235
Resources:
MyEC2Instance:
Type: AWS::EC2::Instance
Properties:
ImageId: !FindInMap
- RegionMap
- !Ref 'AWS::Region'
- HVM64
- 위 예시에서
!FindInMap은 현재 리전에 따라 적절한 AMI ID를 선택합니다.
4.8 Condition Functions
- Condition Functions는 조건을 평가하고 결과에 따라 리소스를 생성하거나 속성을 설정할 때 사용합니다.
- 주요 Condition Functions: Fn::If, Fn::And, Fn::Or, Fn::Not, Fn::Equals
Fn::If 사용 예시
Conditions:
CreateProdResources: !Equals
- !Ref EnvType
- prod
Resources:
MyEC2Instance:
Type: AWS::EC2::Instance
Properties:
InstanceType: !If
- CreateProdResources
- t2.large
- t2.micro
- 위 예시에서
EnvType파라미터가 'prod'일 경우 t2.large 인스턴스를, 그렇지 않으면 t2.micro 인스턴스를 생성합니다.