템플릿 개요 - AWS CloudFormation

템플릿 개요

이 주제에서는 템플릿의 주요 부분과 사용 방법에 대해 소개합니다.

이 페이지의 섹션을 사용하여 템플릿에 대한 다음 내용을 알아볼 수 있습니다.

  • 리소스 및 해당 속성 선언

  • Ref 함수를 사용하여 다른 리소스 참조 및 Fn::GetAtt 함수를 사용하여 리소스 속성 참조

  • 파라미터를 사용하여 스택 생성 시 값 지정 및 제약 조건을 사용하여 파라미터 입력 확인

  • 매핑을 사용하여 조건 값 결정

  • Fn::Join 함수를 사용하여 파라미터, 리소스 속성 및 기타 문자열에 기초한 값 구성

  • 출력 값을 사용하여 스택의 리소스에 대한 정보를 수집합니다.

템플릿 정보

CloudFormation 템플릿이란 스택을 구성하는 AWS 리소스의 선언입니다. 템플릿은 JSON(JavaScript Object Notation) 또는 YAML 표준을 사용하여 특정 형식 지정 규칙을 따르는 텍스트 파일입니다. 템플릿은 텍스트 파일이기 때문에 텍스트 편집기에서 작성 및 편집하고 소스 코드의 나머지 부분과 함께 소스 제어 시스템에서 관리할 수 있습니다.

생성하려는 AWS 리소스를 템플릿에서 선언합니다. 템플릿에는 여러 섹션이 있을 수 있지만 Resources 섹션은 하나 이상의 리소스를 선언해야 하는 유일한 필수 섹션입니다.

사용 가능한 모든 섹션이 포함된 템플릿의 전체 구조를 보여주는 예는 템플릿 형식 섹션을 참조하세요. CloudFormation으로 생성할 수 있는 리소스 목록은 AWS 리소스 및 속성 유형 참조 섹션을 참조하세요.

리소스 및 속성

Resources 섹션에서는 스택의 일부로 생성될 AWS 리소스를 정의할 수 있습니다. 각 리소스는 선택한 형식(JSON 또는 YAML)의 구문 규칙에 따라 속성과 값의 집합으로 선언됩니다.

각 리소스에는 Type 속성이 있어야 하며, 이 속성은 AWS 리소스의 종류를 정의합니다. Type 속성은 특수한 형식으로 되어 있습니다.

AWS::ProductIdentifier::ResourceType

예를 들면 Amazon S3 버킷의 리소스 유형은 AWS::S3::Bucket입니다.

다음 예제는 사용할 수 있는 실제 버킷 이름의 자리 표시자 텍스트인 BucketName 속성이 amzn-s3-demo-bucket으로 설정된 AWS::S3::Bucket 유형의 단일 리소스를 선언합니다.

CloudFormation 템플릿의 컨텍스트 내에서 리소스는 고유 식별자 역할을 하는 논리명으로 식별됩니다. 이 특정한 경우 Amazon S3 버킷 리소스에 할당된 논리명은 MyBucket입니다. 이는 사용할 수 있는 실제 논리명에 대한 자리 표시자 텍스트입니다.

JSON

{ "Resources": { "MyBucket": { "Type": "AWS::S3::Bucket", "Properties": { "BucketName": "amzn-s3-demo-bucket" } } } }

YAML

Resources: MyBucket: Type: 'AWS::S3::Bucket' Properties: BucketName: amzn-s3-demo-bucket

이 리소스 선언을 사용하여 스택을 생성할 경우 CloudFormation에서는 기본 설정으로 Amazon S3 버킷을 생성합니다. Amazon EC2 인스턴스나 Auto Scaling 그룹 같은 기타 리소스의 경우 CloudFormation은 추가 정보를 요구합니다.

리소스 유형에 따라 AWS::EC2::Instance 리소스의 경우 ImageId, InstanceType 등의 일부 속성은 필수 속성이고 그밖의 속성은 선택적 속성입니다. 일부 속성에는 기본값이 있으므로 해당 속성을 지정하는 것은 선택 사항입니다. 그 밖의 속성은 필수는 아니지만, AWS::S3::Bucket 리소스의 WebsiteConfiguration 속성과 같이 원하는 기능을 추가하기도 합니다. 이러한 속성에 대한 값은 반드시 지정할 필요는 없으며, 필요에 따라 지정하면 됩니다.

Amazon S3 버킷과 기타 여러 리소스의 경우 사용자가 명시적으로 지정하지 않으면 CloudFormation이 리소스에 대한 고유한 물리명을 자동으로 생성합니다. 이 물리명은 CloudFormation 스택의 이름, CloudFormation 템플릿에 지정된 리소스의 논리명, 고유 ID의 조합을 기반으로 합니다. 예를 들어, MyStack이라는 스택에 논리명이 MyBucket인 Amazon S3 버킷이 있는 경우 CloudFormation은 MyStack-MyBucket-abcdefghijk1이라는 물리적 ID로 버킷의 이름을 지정할 수 있습니다.

각 리소스 유형에 대한 속성을 보려면 AWS 리소스 및 속성 유형 참조 단원의 주제를 참조하십시오.

리소스 간 참조

다른 리소스의 이름이나 속성을 기반으로 한 리소스의 속성을 설정해야 하는 경우가 있습니다. 예를 들어, S3 버킷이 지원하는 CloudFront 배포 또는 EC2 보안 그룹을 사용하는 EC2 인스턴스를 생성할 수 있습니다. 이러한 모든 리소스는 동일한 CloudFormation 템플릿에서 생성할 수 있습니다.

CloudFormation은 다른 리소스 및 해당 속성을 참조하는 데 사용할 수 있는 내장 함수를 제공합니다. 이러한 함수를 사용하면 리소스 간에 종속성을 생성하고 한 리소스에서 다른 리소스로 값을 전달할 수 있습니다.

Ref 함수는 동일한 CloudFormation 템플릿 내에 정의된 리소스의 식별 속성을 검색하는 데 사용됩니다. Ref 함수는 리소스 유형에 따라 달라지는 값을 반환합니다. 대부분의 리소스는 리소스의 물리명을 반환합니다. 그러나 일부 리소스 유형의 경우 AWS::EC2::EIP 리소스의 IP 주소나 Amazon SNS 주제의 Amazon 리소스 이름(ARN) 등의 다른 값을 반환할 수 있습니다. 자세한 내용은 Ref 함수를 참조하세요.

다음 예제는 Ref 함수를 사용하여 AWS::EC2::Instance 리소스에서 논리명 InstanceSecurityGroup 리소스를 사용하여 AWS::EC2::SecurityGroup 리소스를 참조하는 방법을 보여줍니다.

JSON

{ "Resources": { "Ec2Instance": { "Type": "AWS::EC2::Instance", "Properties": { "SecurityGroups": [ { "Ref": "InstanceSecurityGroup" } ], "KeyName": "MyKey", "ImageId": "ami-1234567890abcdef0" } }, "InstanceSecurityGroup": { "Type": "AWS::EC2::SecurityGroup", "Properties": { "GroupDescription": "Enable SSH access via port 22", "SecurityGroupIngress": [ { "IpProtocol": "tcp", "FromPort": 22, "ToPort": 22, "CidrIp": "0.0.0.0/0" } ] } } } }

YAML

Resources: Ec2Instance: Type: 'AWS::EC2::Instance' Properties: SecurityGroups: - !Ref InstanceSecurityGroup KeyName: MyKey ImageId: ami-1234567890abcdef0 InstanceSecurityGroup: Type: 'AWS::EC2::SecurityGroup' Properties: GroupDescription: Enable SSH access via port 22 SecurityGroupIngress: - IpProtocol: tcp FromPort: 22 ToPort: 22 CidrIp: 0.0.0.0/0

SecurityGroups 속성은 보안 그룹 목록이며, 이전 예제에서는 이 목록에 항목이 하나만 들어 있었습니다. 다음 예제에는 SecurityGroups 속성 목록에 추가 항목이 있습니다.

JSON

{ "Resources": { "Ec2Instance": { "Type": "AWS::EC2::Instance", "Properties": { "SecurityGroups": [ { "Ref": "InstanceSecurityGroup" }, "MyExistingSecurityGroup" ], "KeyName": "MyKey", "ImageId": "ami-1234567890abcdef0" } }, "InstanceSecurityGroup": { "Type": "AWS::EC2::SecurityGroup", "Properties": { "GroupDescription": "Enable SSH access via port 22", "SecurityGroupIngress": [ { "IpProtocol": "tcp", "FromPort": 22, "ToPort": 22, "CidrIp": "0.0.0.0/0" } ] } } } }

YAML

Resources: Ec2Instance: Type: 'AWS::EC2::Instance' Properties: SecurityGroups: - !Ref InstanceSecurityGroup - MyExistingSecurityGroup KeyName: MyKey ImageId: ami-1234567890abcdef0 InstanceSecurityGroup: Type: 'AWS::EC2::SecurityGroup' Properties: GroupDescription: Enable SSH access via port 22 SecurityGroupIngress: - IpProtocol: tcp FromPort: 22 ToPort: 22 CidrIp: 0.0.0.0/0

MyExistingSecurityGroup은 템플릿에 선언된 보안 그룹 대신에 기존 EC2 보안 그룹을 참조하는 문자열입니다. 리터럴 문자열을 사용하여 기존 AWS 리소스를 참조합니다.

위의 예제에서 AWS::EC2::InstanceKeyName 속성은 리터럴 문자열 MyKey입니다. 다시 말해서 이름 MyKey를 포함하는 키 페어가 스택을 생성 중인 리전에 존재해야 합니다. 그렇지 않으면 키 페어가 존재하지 않아서 스택이 생성되지 않습니다. 사용하는 키 페어는 스택을 생성 중인 리전마다 다르거나, 다른 사람과 템플릿을 공유하여 그들의 AWS 계정에서 사용하도록 할 수도 있습니다. 이 경우, 입력 파라미터를 사용하면 스택 생성 시 키 페어 이름을 지정할 수 있습니다. Ref 함수는 스택 생성 시 지정되는 입력 파라미터를 참조할 수 있습니다. 다음 예제는 KeyName 파라미터를 포함하는 Parameters 섹션을 추가합니다. 이 파라미터는 AWS::EC2::Instance 리소스의 KeyName 속성을 지정하는 데 사용됩니다. 파라미터 유형은 AWS::EC2::KeyPair::KeyName으로, 사용자가 스택을 생성 중인 리전과 자신의 계정에서 유효한 키 페어 이름을 지정하는지 확인합니다.

JSON

{ "Parameters": { "KeyName": { "Description": "The EC2 Key Pair to allow SSH access to the instance", "Type": "AWS::EC2::KeyPair::KeyName" } }, "Resources": { "Ec2Instance": { "Type": "AWS::EC2::Instance", "Properties": { "SecurityGroups": [ { "Ref": "InstanceSecurityGroup" }, "MyExistingSecurityGroup" ], "KeyName": { "Ref": "KeyName" }, "ImageId": "ami-1234567890abcdef0" } }, "InstanceSecurityGroup": { "Type": "AWS::EC2::SecurityGroup", "Properties": { "GroupDescription": "Enable SSH access via port 22", "SecurityGroupIngress": [ { "IpProtocol": "tcp", "FromPort": 22, "ToPort": 22, "CidrIp": "0.0.0.0/0" } ] } } } }

YAML

Parameters: KeyName: Description: The EC2 Key Pair to allow SSH access to the instance Type: 'AWS::EC2::KeyPair::KeyName' Resources: Ec2Instance: Type: 'AWS::EC2::Instance' Properties: SecurityGroups: - !Ref InstanceSecurityGroup - MyExistingSecurityGroup KeyName: !Ref KeyName ImageId: ami-1234567890abcdef0 InstanceSecurityGroup: Type: 'AWS::EC2::SecurityGroup' Properties: GroupDescription: Enable SSH access via port 22 SecurityGroupIngress: - IpProtocol: tcp FromPort: 22 ToPort: 22 CidrIp: 0.0.0.0/0

Ref 함수는 리소스에 대해 반환되는 파라미터나 값이 정확히 원하는 값인 경우에 유용합니다. 그러나 리소스의 다른 속성이 필요할 수 있습니다. 예를 들어 S3 오리진을 사용하여 CloudFront 배포를 생성하려는 경우 DNS 스타일 주소를 사용하여 버킷 위치를 지정해야 합니다. 일부 리소스에는 템플릿에서 사용할 수 있는 값이 지정되는 추가 속성이 있습니다. 이러한 속성을 가져오려면 Fn::GetAtt 함수를 사용합니다. 다음 예제는 Fn::GetAtt 함수를 사용하여 버킷의 DomainName 속성을 가져옴으로써 S3 버킷 리소스의 DNS 이름을 지정하는 CloudFront 배포 리소스를 생성합니다.

JSON

{ "Resources": { "MyBucket": { "Type": "AWS::S3::Bucket" }, "MyDistribution": { "Type": "AWS::CloudFront::Distribution", "Properties": { "DistributionConfig": { "Origins": [ { "DomainName": { "Fn::GetAtt": [ "MyBucket", "DomainName" ] }, "Id": "MyS3Origin", "S3OriginConfig": {} } ], "Enabled": "true", "DefaultCacheBehavior": { "TargetOriginId": "MyS3Origin", "ForwardedValues": { "QueryString": "false" }, "ViewerProtocolPolicy": "allow-all" } } } } } }

YAML

Resources: MyBucket: Type: 'AWS::S3::Bucket' MyDistribution: Type: 'AWS::CloudFront::Distribution' Properties: DistributionConfig: Origins: - DomainName: !GetAtt - MyBucket - DomainName Id: MyS3Origin S3OriginConfig: {} Enabled: 'true' DefaultCacheBehavior: TargetOriginId: MyS3Origin ForwardedValues: QueryString: 'false' ViewerProtocolPolicy: allow-all

Fn::GetAtt 함수는 두 개 파라미터, 리소스의 논리적 이름, 그리고 검색할 속성의 이름을 사용합니다. 리소스에 사용할 수 있는 전체 속성 목록은 Fn::GetAtt를 참조하십시오. Fn::GetAtt 함수는 두 파라미터를 어레이 형태로 나열합니다. 여러 파라미터를 사용하는 함수의 경우 어레이를 사용하여 파라미터를 지정합니다.

입력 파라미터를 사용하여 사용자 입력 수신

지금까지는 리소스에 대해 알아보았으며 템플릿 내에서 리소스를 함께 사용하는 방법도 조금 살펴보았습니다. 입력 파라미터를 참조하는 방법을 배웠지만 입력 파라미터를 자체적으로 정의하는 방법에 대해서는 아직까지 자세히 살펴보지 않았습니다. 이번에는 파라미터 선언과 사용자 입력을 제한하고 확인하는 방법에 대해 살펴보겠습니다.

파라미터는 템플릿의 Parameters 섹션에서 선언합니다. 파라미터에는 해당 값과 값에 대한 구속 조건을 정의하는 속성 목록이 포함됩니다. 유일한 필수 속성은 Type(String, Number 또는 CloudFormation에서 제공하는 파라미터 유형일 수 있음)입니다. 사용자가 지정해야 하는 값의 종류에 대해 설명하는 Description 속성을 추가할 수도 있습니다. 파라미터의 이름과 설명은 스택 생성 마법사에서 템플릿을 사용할 때 파라미터 지정 페이지에 나타납니다.

다음 예제는 파라미터 지정 페이지에 사용된 파라미터를 선언하는 Parameters 섹션입니다.

JSON

"Parameters": { "KeyName": { "Description" : "Name of an existing EC2 KeyPair to enable SSH access into the web server", "Type": "AWS::EC2::KeyPair::KeyName" }, "WordPressUser": { "Default": "admin", "NoEcho": "true", "Description" : "The WordPress database admin account user name", "Type": "String", "MinLength": "1", "MaxLength": "16", "AllowedPattern" : "[a-zA-Z][a-zA-Z0-9]*" }, "WebServerPort": { "Default": "8888", "Description" : "TCP/IP port for the web server", "Type": "Number", "MinValue": "1", "MaxValue": "65535" } }

YAML

Parameters: KeyName: Description: Name of an existing EC2 KeyPair to enable SSH access into the web server Type: AWS::EC2::KeyPair::KeyName WordPressUser: Default: admin NoEcho: true Description: The WordPress database admin account user name Type: String MinLength: 1 MaxLength: 16 AllowedPattern: "[a-zA-Z][a-zA-Z0-9]*" WebServerPort: Default: 8888 Description: TCP/IP port for the web server Type: Number MinValue: 1 MaxValue: 65535

기본값이 있는 파라미터의 경우 CloudFormation에서는 사용자가 다른 값을 지정하지 않을 경우 기본값이 사용됩니다. 기본 속성을 생략하는 경우 사용자가 해당 파라미터에 대한 값을 지정해야 합니다. 그러나 사용자에게 값을 입력하도록 요구한다고 해서 해당 값의 유효성이 보장되는 것은 아닙니다. 파라미터 값을 검증하려는 경우 제약을 선언하거나 AWS 특정 유형을 지정할 수 있습니다.

KeyName 파라미터에는 Default 속성이 없지만 다른 파라미터에는 있습니다. WordPressUser 파라미터에는 Default: admin 속성이 없지만 KeyName 파라미터에는 있습니다. 사용자는 스택 생성 시 키 이름 값을 지정해야 합니다. 지정하지 않을 경우 CloudFormation에서 스택을 생성할 수 없으며 다음 예외가 발생합니다.

Parameters: [KeyName] must have values

AWS 특정 파라미터 유형의 경우 CloudFormation에서는 사용자가 스택 리소스를 생성하기 전에 사용자가 스택을 생성 중인 리전과 사용자의 AWS 계정에서 기존 값과 대조하여 입력 값을 검증합니다. 샘플 템플릿에서 KeyName 파라미터는 AWS::EC2::KeyPair::KeyName의 AWS 특정 파라미터 유형입니다. CloudFormation은 스택을 생성하기 전에 사용자가 유효한 EC2 키 페어 이름을 지정하는지 확인합니다. AWS 특정 파라미터 유형의 또 한 가지 예는 AWS::EC2::VPC::Id이며 사용자는 유효한 VPC ID를 지정해야 합니다. 선행 검증에 더해 AWS 콘솔은 사용자가 스택 생성 마법사를 사용할 때 유효한 EC2 키 페어 이름이나 VPC ID와 같은 AWS 특정 파라미터 유형에 대한 유효 값의 드롭다운 목록을 표시합니다.

String 유형의 경우 MinLength, MaxLength, Default, AllowedValuesAllowedPattern 속성을 사용하여 제약을 선언할 수 있습니다. 위의 예제에서 WordPressUser 파라미터에는 세 가지 제약으로, 파라미터 값 길이는 1 ~ 16자여야 하며(MinLength, MaxLength), 문자로 시작하고 그 뒤에 문자와 숫자의 조합(AllowedPattern)이 이어져야 합니다.

Number 유형의 경우 MinValue, MaxValue, DefaultAllowedValues 제약을 선언할 수 있습니다. 숫자는 정수 또는 부동 소수점 값일 수 있습니다. 위의 예제에서 WebServerPort 파라미터는 1에서 65535 사이(포함)의 정수여야 합니다(MinValue, MaxValue).

이 섹션 앞부분에서, 사용해야 하지만 템플릿에 자체적으로 포함하지 않을 암호나 사용자 이름 같은 중요 또는 구현 관련 데이터를 지정하기에 파라미터가 바람직한 방법이라고 언급했습니다. NoEcho 속성을 true로 설정한 경우, 아래 지정된 위치에 저장된 정보를 제외하고 CloudFormation은 스택 또는 스택 이벤트를 설명하는 모든 호출에 대해 별표(*****)로 마스킹 처리된 파라미터 값을 반환합니다. 위의 예제에서 WordPressUser 파라미터 값은 스택 설정을 보고 있는 사람에게 표시되지 않으며, 해당 값이 별표로 반환됩니다.

중요

NoEcho 속성을 사용해도 다음에 저장된 정보는 마스킹되지 않습니다.

  • Metadata 템플릿 섹션. CloudFormation은 Metadata 섹션에 포함된 정보를 변환, 수정 또는 삭제하지 않습니다. 자세한 내용은 Metadata 단원을 참조하십시오.

  • Outputs 템플릿 섹션. 자세한 내용은 Outputs 단원을 참조하십시오.

  • 리소스 정의의 Metadata 속성입니다. 자세한 내용은 Metadata 속성 단원을 참조하십시오.

이러한 메커니즘을 사용하여 암호나 보안 정보와 같은 중요한 정보를 포함하지 않는 것이 좋습니다.

중요

AWS Systems Manager Parameter Store 또는 AWS Secrets Manager와 같이 CloudFormation 외부에서 저장 및 관리되는 중요한 정보를 참조하려면 CloudFormation 템플릿에 직접 중요한 정보를 포함하는 대신 스택 템플릿에 있는 동적 파라미터를 사용하는 것이 좋습니다.

자세한 내용은 템플릿에 자격 증명을 포함하지 않음 모범 사례를 참조하세요.

매핑을 사용하여 조건 값 지정

파라미터는 스택 리소스의 속성에 사용할 고유하거나 민감한 값을 지정하는 좋은 방법입니다. 그러나 리전에 따라 달라지는 설정이 있거나 다른 조건이나 종속성으로 인해 사용자가 파악하기 어려운 설정이 있을 수 있습니다. 이러한 경우 사용자가 원하는 결과를 얻기 위해 보다 간단한 값을 지정할 수 있도록(또는 전혀 지정할 필요가 없도록( 템플릿에 자체적으로 논리를 추가할 수도 있습니다.

예를 들어, 조건부 입력(이 예제는 스택이 생성되는 리전)에 따라 올바른 인스턴스 유형을 지정하는 방법이 필요합니다. 도움이 될 수 있는 2가지 템플릿 기능이 있으며, 각각 Mappings 섹션과 AWS::Region 가상 파라미터입니다.

AWS::Region 가상 파라미터는 CloudFormation에서 스택이 생성되는 리전으로 확인되는 값입니다. 가상 파라미터는 스택 생성 시 CloudFormation에서 확인됩니다. 매핑을 사용하면 다른 값을 결정하는 조건으로 입력 값을 사용할 수 있습니다. switch 문과 마찬가지로, 매핑은 값 세트 하나를 다른 세트와 연결합니다. 매핑과 함께 AWS::Region 파라미터를 사용하면 리전에서 사용 가능한 인스턴스 유형이 지정되도록 할 수 있습니다. 다음 템플릿에는 인스턴스 유형을 해당 리전에 매핑하는 데 사용되는 RegionMap이라는 매핑이 지정된 Mappings 섹션이 들어 있습니다.

다음 예제는 Systems Manager 파라미터 유형도 선언합니다. 그리고 EC2 인스턴스의 ImageId 속성에 대한 기본값으로 Systems Manager 파라미터 별칭(/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2)을 제공합니다. 이는 CloudFormation이 스택이 생성되는 리전의 최신 Amazon Linux 2 AMI에 대한 AMI ID 값으로 확인하는 값입니다.

JSON

{ "Parameters": { "LatestAmiId": { "Description": "The latest Amazon Linux 2 AMI from the Parameter Store", "Type": "AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>", "Default": "/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2" } }, "Mappings": { "RegionMap": { "us-east-1": { "InstanceType": "t2.micro" }, "us-west-1": { "InstanceType": "t2.micro" }, "eu-west-1": { "InstanceType": "t2.micro" }, "eu-north-1": { "InstanceType": "t3.micro" }, "me-south-1": { "InstanceType": "t3.micro" } } }, "Resources": { "Ec2Instance": { "Type": "AWS::EC2::Instance", "Properties": { "ImageId": { "Ref": "LatestAmiId" }, "InstanceType": { "Fn::FindInMap": [ "RegionMap", { "Ref": "AWS::Region" }, "InstanceType" ] } } } } }

YAML

Parameters: LatestAmiId: Description: The latest Amazon Linux 2 AMI from the Parameter Store Type: 'AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>' Default: '/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2' Mappings: RegionMap: us-east-1: InstanceType: t2.micro us-west-1: InstanceType: t2.micro eu-west-1: InstanceType: t2.micro eu-north-1: InstanceType: t3.micro me-south-1: InstanceType: t3.micro Resources: Ec2Instance: Type: 'AWS::EC2::Instance' Properties: ImageId: !Ref LatestAmiId InstanceType: !FindInMap - RegionMap - !Ref 'AWS::Region' - InstanceType

RegionMap에서 각 리전은 이름-값 페어로 매핑됩니다. 이름-값 페어는 레이블과, 매핑할 값입니다. RegionMap에서 InstanceType은 레이블이고 인스턴스 유형은 값입니다. 맵을 사용하여 값을 반환하려면 Fn::FindInMap 함수를 사용하여 맵의 이름, 매핑된 값을 찾는 데 사용되는 값, 그리고 반환할 매핑된 값의 레이블을 전달합니다. 위의 예제에서 리소스 Ec2InstanceInstanceType 속성은 Fn::FindInMap 함수를 사용하여 RegionMap을 사용할 맵으로, AWS::Region을 매핑할 소스 입력 값으로, InstanceType을 매핑할 값을 식별할 레이블로 지정하여 값을 결정합니다. 예를 들어 이 템플릿을 사용하여 미국 서부(캘리포니아 북부) 리전에서 스택을 생성한 경우 InstanceTypet2.micro으로 설정됩니다.

구성된 값과 출력 값

파라미터와 매핑은 스택 생성 시간에 특정 값을 전달하거나 확인할 수 있는 유용한 방법이지만, 파라미터의 값이나 기타 리소스 속성이 필요한 값의 일부일 뿐인 경우가 발생할 수 있습니다. 다음 예제에서 Fn::Join 함수는 필요한 값을 만들기 위해 WebServerPort 파라미터를 다른 리터럴 문자열과 연결하여 ElasticLoadBalancer 리소스에 대한 HealthCheck 속성의 Target 하위 속성을 구성합니다.

JSON

{ "Resources": { "ElasticLoadBalancer": { "Type": "AWS::ElasticLoadBalancing::LoadBalancer", "Properties": { "AvailabilityZones": { "Fn::GetAZs": "" }, "Instances": [ { "Ref": "Ec2Instance1" }, { "Ref": "Ec2Instance2" } ], "Listeners": [ { "LoadBalancerPort": "80", "InstancePort": { "Ref": "WebServerPort" }, "Protocol": "HTTP" } ], "HealthCheck": { "Target": { "Fn::Join": [ "", [ "HTTP:", { "Ref": "WebServerPort" }, "/" ] ] }, "HealthyThreshold": "3", "UnhealthyThreshold": "5", "Interval": "30", "Timeout": "5" } } } } }

YAML

Resources: ElasticLoadBalancer: Type: 'AWS::ElasticLoadBalancing::LoadBalancer' Properties: AvailabilityZones: !GetAZs '' Instances: - !Ref Ec2Instance1 - !Ref Ec2Instance2 Listeners: - LoadBalancerPort: '80' InstancePort: !Ref WebServerPort Protocol: HTTP HealthCheck: Target: !Join - '' - - 'HTTP:' - !Ref WebServerPort - / HealthyThreshold: '3' UnhealthyThreshold: '5' Interval: '30' Timeout: '5'

Fn::Join 함수는 연결할 값을 구분하는 구분 기호와 표시될 순서대로 나열된 값 어레이, 이렇게 두 파라미터를 사용합니다. 위의 예제에서 Fn::Join 함수는 빈 문자열을 구분 기호로 지정하고 HTTP:를 WebServerPort 파라미터로, / 문자를 연결할 값으로 지정합니다. WebServerPort의 값이 8888인 경우 Target 속성은 다음 값으로 설정됩니다.

HTTP:8888/

Fn::Join 함수에 대한 자세한 내용은 Fn::Join 단원을 참조하십시오.

Fn::Join 함수는 스택의 출력 값을 선언할 때도 유용합니다. 템플릿의 Outputs 섹션에는 스택이 생성된 후 사용 가능하도록 설정할 값에 대한 선언이 포함되어 있습니다. 출력은 리소스 또는 입력 파라미터에 대한 중요한 정보를 편리하게 수집할 수 있는 방법입니다. 예를 들어 WordPress 사이트를 생성하는 템플릿에 대해 다음과 같은 출력을 선언할 수 있습니다.

JSON

{ "Outputs": { "InstallURL": { "Value": { "Fn::Join": [ "", [ "http://", { "Fn::GetAtt": [ "ElasticLoadBalancer", "DNSName" ] }, "/wp-admin/install.php" ] ] }, "Description": "Installation URL of the WordPress website" }, "WebsiteURL": { "Value": { "Fn::Join": [ "", [ "http://", { "Fn::GetAtt": [ "ElasticLoadBalancer", "DNSName" ] } ] ] } } } }

YAML

Outputs: InstallURL: Value: !Join - '' - - 'http://' - !GetAtt - ElasticLoadBalancer - DNSName - /wp-admin/install.php Description: Installation URL of the WordPress website WebsiteURL: Value: !Join - '' - - 'http://' - !GetAtt - ElasticLoadBalancer - DNSName

각 출력 값에는 이름, 출력 값으로 반환된 값의 선언을 포함하는 Value 속성, 그리고 값에 대한 설명(선택 사항)이 포함되어 있습니다. 이전 예제에서 InstallURLFn::Join 함수 호출에 의해 반환되는 문자열로, http://, ElasticLoadBalancer 리소스의 DNS 이름, 그리고 /wp-admin/install.php가 연결됩니다. 출력 값은 다음과 비슷합니다.

http://mywptests-elasticl-1gb51l6sl8y5v-206169572.aws-region.elb.amazonaws.com/wp-admin/install.php

스택을 생성한 후 이 링크를 사용하여 앞서 생성한 WordPress 블로그의 설치 페이지로 이동할 수 있습니다. CloudFormation은 스택 생성이 완료된 후 출력 값을 생성합니다. CloudFormation 콘솔의 Outputs 탭이나 describe-stacks CLI 명령을 사용하여 출력 값을 볼 수 있습니다.

자세히 알아보기

조금 전에는 템플릿의 기본적인 부분과 이러한 부분들을 사용하는 방법에 대해 살펴보았습니다.

AWSTemplateFormatVersionDescription이라는 템플릿의 최상위 섹션 두 가지에 대해서는 살펴보지 않았습니다.

AWSTemplateFormatVersion은 단순히 템플릿 포맷 버전입니다. 지정하지 않을 경우 CloudFormation에서 최신 버전이 사용됩니다. 자세한 내용은 포맷 버전 단원을 참조하십시오.

Description은 유효한 JSON 또는 YAML 문자열입니다. 이 설명은 스택 생성 마법사의 파라미터 지정 페이지에 표시됩니다. 자세한 내용은 Description 단원을 참조하십시오.

물론, 더 전문적인 템플릿과 스택 기능도 있습니다. 다음은 자세히 알아보아야 할 몇 가지 중요 항목입니다.

  • DependsOn - 이 속성을 사용하면 한 리소스 다음에 다른 리소스 하나를 생성하도록 지정할 수 있습니다.

  • DeletionPolicy - 이 속성을 사용하면 CloudFormation에서 리소스 삭제를 처리하는 방법을 지정할 수 있습니다.

  • Metadata - 이 속성을 사용하면 리소스와 함께 구조화된 데이터를 지정할 수 있습니다.