

새로운 *CloudFormation 템플릿 참조 안내서*입니다. 북마크와 링크를 업데이트하세요. CloudFormation을 시작하는 데 도움이 필요한 경우 [AWS CloudFormation 사용 설명서](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html)를 참조하세요.

# 내장 함수 참조
<a name="intrinsic-function-reference"></a>

CloudFormation은 스택을 관리하는 데 도움이 되는 여러 내장 함수를 제공합니다. 템플릿의 내장 함수를 사용하여 실행 시간까지 사용할 수 없는 속성에 값을 할당합니다.

**참고**  
내장 함수는 템플릿의 특정 부분에서만 사용할 수 있습니다. 현재 리소스 속성, 출력, 메타데이터 속성 및 업데이트 정책 속성에 내장 함수를 사용할 수 있습니다. 내장 함수를 사용하여 스택 리소스를 조건부로 생성할 수도 있습니다.

**Topics**
+ [`Fn::Base64`](intrinsic-function-reference-base64.md)
+ [`Fn::Cidr`](intrinsic-function-reference-cidr.md)
+ [조건 함수](intrinsic-function-reference-conditions.md)
+ [`Fn::FindInMap`](intrinsic-function-reference-findinmap.md)
+ [`Fn::ForEach`](intrinsic-function-reference-foreach.md)
+ [`Fn::GetAtt`](intrinsic-function-reference-getatt.md)
+ [`Fn::GetAZs`](intrinsic-function-reference-getavailabilityzones.md)
+ [`Fn::ImportValue`](intrinsic-function-reference-importvalue.md)
+ [`Fn::Join`](intrinsic-function-reference-join.md)
+ [`Fn::Length`](intrinsic-function-reference-length.md)
+ [`Fn::Select`](intrinsic-function-reference-select.md)
+ [`Fn::Split`](intrinsic-function-reference-split.md)
+ [`Fn::Sub`](intrinsic-function-reference-sub.md)
+ [`Fn::ToJsonString`](intrinsic-function-reference-ToJsonString.md)
+ [`Fn::Transform`](intrinsic-function-reference-transform.md)
+ [`Ref`](intrinsic-function-reference-ref.md)
+ [규칙 함수](intrinsic-function-reference-rules.md)

# `Fn::Base64`
<a name="intrinsic-function-reference-base64"></a>

`Fn::Base64` 내장 함수는 입력 문자열의 Base64 표시를 반환합니다. 이 함수는 일반적으로 `UserData` 속성을 통해 인코딩된 데이터를 Amazon EC2 인스턴스에 전달하는 데 사용됩니다.

## 선언
<a name="w2aac24c12b5"></a>

### JSON
<a name="intrinsic-function-reference-base64-syntax.json"></a>

```
{ "Fn::Base64" : valueToEncode }
```

### YAML
<a name="intrinsic-function-reference-base64-syntax.yaml"></a>

전체 함수 이름의 구문:

```
Fn::Base64: valueToEncode
```

짧은 형식의 구문:

```
!Base64 valueToEncode
```

**참고**  
짧은 형식을 사용하고 `valueToEncode` 파라미터에 다른 함수를 바로 포함시킬 경우 최소 하나 이상의 함수에 대해 전체 함수 이름을 사용합니다. 예를 들어, 다음 구문은 잘못되었습니다.  

```
!Base64 !Sub string
!Base64 !Ref logical_ID
```
대신, 다음 예에 표시된 대로 함수 중 하나 이상에 대해 전체 함수 이름을 사용합니다.  

```
!Base64
  "Fn::Sub": string

Fn::Base64:
  !Sub string
```

## Parameters
<a name="w2aac24c12b7"></a>

valueToEncode  
Base64로 변환할 문자열 값입니다.

## 반환 값:
<a name="w2aac24c12b9"></a>

Base64로 표시된 원래 문자열입니다.

## 예제
<a name="w2aac24c12c11"></a>

### JSON
<a name="intrinsic-function-reference-base64-example.json"></a>

```
{ "Fn::Base64" : "AWS CloudFormation" }
```

### YAML
<a name="intrinsic-function-reference-base64-example.yaml"></a>

```
Fn::Base64: AWS CloudFormation
```

## 지원되는 함수
<a name="w2aac24c12c13"></a>

`Fn::Base64` 함수 내부의 문자열을 반환하는 함수를 사용할 수 있습니다.

# `Fn::Cidr`
<a name="intrinsic-function-reference-cidr"></a>

내장 함수 `Fn::Cidr`은 CIDR 주소 블록의 어레이를 반환합니다. 반환된 CIDR 블록의 수는 `count` 파라미터에 따라 다릅니다.

## 선언
<a name="intrinsic-function-reference-cidr-declaration"></a>

### JSON
<a name="intrinsic-function-reference-cidr-syntax.json"></a>

```
{ "Fn::Cidr" : [ipBlock, count, cidrBits]}
```

### YAML
<a name="intrinsic-function-reference-cidr-syntax.yaml"></a>

전체 함수 이름의 구문:

```
Fn::Cidr: 
  - ipBlock
  - count
  - cidrBits
```

짧은 형식의 구문:

```
!Cidr [ ipBlock, count, cidrBits ]
```

## 파라미터
<a name="intrinsic-function-reference-cidr-parameters"></a>

ipBlock  <a name="ipBlock"></a>
작은 CIDR 블록으로 분할되는 사용자 지정 CIDR 주소 블록입니다.

count  <a name="count"></a>
생성할 CIDR의 수입니다. 유효한 범위는 1\$1256입니다.

cidrBits  <a name="cidrBits"></a>
CIDR에 대한 서브넷 비트의 수입니다. 예를 들어 이 파라미터에 대한 값으로 "8"을 지정하면 "/24" 마스크의 CIDR이 생성됩니다.  
서브넷 비트는 서브넷 마스크의 역입니다. 해당 서브넷 비트에 대해 필요한 호스트 비트를 계산하려면 IPv4의 경우 32에서, IPv6의 경우 128에서 서브넷 비트를 뺍니다.

## 반환 값
<a name="intrinsic-function-reference-cidr-return-values"></a>

CIDR 주소 블록의 어레이입니다.

## 예시
<a name="intrinsic-function-reference-cidr-examples"></a>

### 기본 사용법
<a name="intrinsic-function-reference-cidr-example1"></a>

이 예제에서는 "/24" 마스크의 CIDR 내부에서 "/27" 서브넷 마스크의 CIDR 6개를 생성합니다.

#### JSON
<a name="intrinsic-function-reference-cidr-example1.json"></a>

```
{ "Fn::Cidr" : [ "192.168.0.0/24", "6", "5"] }
```

#### YAML
<a name="intrinsic-function-reference-cidr-example1.yaml"></a>

```
!Cidr [ "192.168.0.0/24", 6, 5 ]
```

### IPv6 활성화 VPC 생성
<a name="intrinsic-function-reference-cidr-example2"></a>

이 예제 템플릿에서는 IPv6 활성화 서브넷을 생성합니다.

#### JSON
<a name="intrinsic-function-reference-cidr-example2.json"></a>

```
{
    "Resources": {
        "ExampleVpc": {
            "Type": "AWS::EC2::VPC",
            "Properties": {
                "CidrBlock": "10.0.0.0/16"
            }
        },
        "IPv6CidrBlock": {
            "Type": "AWS::EC2::VPCCidrBlock",
            "Properties": {
                "AmazonProvidedIpv6CidrBlock": true,
                "VpcId": {
                    "Ref": "ExampleVpc"
                }
            }
        },
        "ExampleSubnet": {
            "Type": "AWS::EC2::Subnet",
            "DependsOn": "IPv6CidrBlock",
            "Properties": {
                "AssignIpv6AddressOnCreation": true,
                "CidrBlock": {
                    "Fn::Select": [
                        0,
                        {
                            "Fn::Cidr": [
                                {
                                    "Fn::GetAtt": [
                                        "ExampleVpc",
                                        "CidrBlock"
                                    ]
                                },
                                1,
                                8
                            ]
                        }
                    ]
                },
                "Ipv6CidrBlock": {
                    "Fn::Select": [
                        0,
                        {
                            "Fn::Cidr": [
                                {
                                    "Fn::Select": [
                                        0,
                                        {
                                            "Fn::GetAtt": [
                                                "ExampleVpc",
                                                "Ipv6CidrBlocks"
                                            ]
                                        }
                                    ]
                                },
                                1,
                                64
                            ]
                        }
                    ]
                },
                "VpcId": {
                    "Ref": "ExampleVpc"
                }
            }
        }
    }
}
```

#### YAML
<a name="intrinsic-function-reference-cidr-example2.yaml"></a>

```
Resources:
  ExampleVpc:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.0.0.0/16
  IPv6CidrBlock:
    Type: AWS::EC2::VPCCidrBlock
    Properties:
      AmazonProvidedIpv6CidrBlock: true
      VpcId: !Ref ExampleVpc
  ExampleSubnet:
    Type: AWS::EC2::Subnet
    DependsOn: IPv6CidrBlock
    Properties:
      AssignIpv6AddressOnCreation: true
      CidrBlock: !Select
        - 0
        - !Cidr
          - !GetAtt ExampleVpc.CidrBlock
          - 1
          - 8
      Ipv6CidrBlock: !Select
        - 0
        - !Cidr
          - !Select
            - 0
            - !GetAtt ExampleVpc.Ipv6CidrBlocks
          - 1
          - 64
      VpcId: !Ref ExampleVpc
```

## 지원되는 함수
<a name="intrinsic-function-reference-cidr-functions"></a>

`Fn::Cidr` 함수에서 다음과 같은 함수를 사용할 수 있습니다.
+ [`Fn::Select`](intrinsic-function-reference-select.md)
+ [`Ref`](intrinsic-function-reference-ref.md)

# 조건 함수
<a name="intrinsic-function-reference-conditions"></a>

`Fn::If` 또는 `Fn::Equals` 등과 같은 내장 함수를 사용하여 조건부 로직을 기반으로 스택 리소스를 생성하고 구성할 수 있습니다. 이러한 조건은 스택 생성 또는 업데이트 중에 평가됩니다. 모든 조건을 정의한 후 템플릿의 `Resources` 및 `Outputs` 섹션에서 조건을 리소스 또는 리소스 속성과 연결할 수 있습니다.

고급 시나리오의 경우 `Fn::And` 또는 `Fn::Or` 함수를 사용하여 조건을 결합하거나`Fn::Not`을 사용하여 조건 값을 무효화할 수 있습니다. 조건을 중첩하여 더 복잡한 조건부 로직을 생성할 수도 있습니다.

템플릿에서 조건을 처음 사용하는 경우 먼저 *AWS CloudFormation 사용자 가이드*의 [CloudFormation 템플릿 Conditions 구문](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/conditions-section-structure.html) 주제를 검토하는 것이 좋습니다.

**참고**  
템플릿의 `Conditions` 섹션에서 `Fn::If` 조건을 제외한 모든 조건을 정의해야 합니다. `Metadata` 속성, `UpdatePolicy` 속성, `Resources` 및 `Outputs` 섹션에 있는 속성 값에서 `Fn::If` 조건을 사용할 수 있습니다.

**Topics**
+ [`Fn::And`](#intrinsic-function-reference-conditions-and)
+ [`Fn::Equals`](#intrinsic-function-reference-conditions-equals)
+ [`Fn::If`](#intrinsic-function-reference-conditions-if)
+ [`Fn::Not`](#intrinsic-function-reference-conditions-not)
+ [`Fn::Or`](#intrinsic-function-reference-conditions-or)
+ [지원되는 함수](#w2aac24c20c25)
+ [샘플 템플릿](#conditions-sample-templates)

## `Fn::And`
<a name="intrinsic-function-reference-conditions-and"></a>

지정된 모든 조건이 true로 평가되면 `true`가 반환되고, 조건 중 하나라도 false로 평가되는 경우 `false`가 반환됩니다. `Fn::And`는 AND 연산자 역할을 합니다. 포함할 수 있는 최소 조건 수는 2이고 최대값은 10입니다.

### 선언
<a name="intrinsic-function-reference-conditions-and-syntax"></a>

#### JSON
<a name="intrinsic-function-reference-conditions-and-syntax.json"></a>

```
"Fn::And": [{condition}, {...}]
```

#### YAML
<a name="intrinsic-function-reference-conditions-and-syntax.yaml"></a>

전체 함수 이름의 구문:

```
Fn::And: [condition]
```

짧은 형식의 구문:

```
!And [condition]
```

### Parameters
<a name="w2aac24c20c13b7"></a>

condition  <a name="fn-and-condition"></a>
`true` 또는 `false`로 평가되는 조건입니다.

### `Fn::And` 사용 예
<a name="w2aac24c20c13b9"></a>

다음 `MyAndCondition`이 true로 평가되려면 참조된 보안 그룹 이름이 `sg-mysggroup`과 같고 `SomeOtherCondition`이 true로 평가되어야 합니다.

#### JSON
<a name="intrinsic-function-reference-conditions-and-example.json"></a>

```
"MyAndCondition": {
   "Fn::And": [
      {"Fn::Equals": ["sg-mysggroup", {"Ref": "ASecurityGroup"}]},
      {"Condition": "SomeOtherCondition"}
   ]
}
```

#### YAML
<a name="intrinsic-function-reference-conditions-and-example.yaml"></a>

```
MyAndCondition: !And
  - !Equals ["sg-mysggroup", !Ref ASecurityGroup]
  - !Condition SomeOtherCondition
```

## `Fn::Equals`
<a name="intrinsic-function-reference-conditions-equals"></a>

두 값이 같은지 여부를 비교합니다. 두 값이 같으면 `true`를 반환하고 다르면 `false`를 반환합니다.

### 선언
<a name="intrinsic-function-reference-conditions-equals-syntax"></a>

#### JSON
<a name="intrinsic-function-reference-conditions-equals-syntax.json"></a>

```
"Fn::Equals" : ["value_1", "value_2"]
```

#### YAML
<a name="intrinsic-function-reference-conditions-equals-syntax.yaml"></a>

전체 함수 이름의 구문:

```
Fn::Equals: [value_1, value_2]
```

짧은 형식의 구문:

```
!Equals [value_1, value_2]
```

### Parameters
<a name="w2aac24c20c15b7"></a>

value  
비교하려는 문자열 값.

### `Fn::Equals` 사용 예
<a name="w2aac24c20c15b9"></a>

다음 `IsProduction` 조건이 true로 평가되려면 `EnvironmentType` 파라미터 값이 `prod`와 같아야 합니다.

#### JSON
<a name="intrinsic-function-reference-conditions-equals-example.json"></a>

```
"IsProduction" : {
   "Fn::Equals": [
      {"Ref": "EnvironmentType"},
      "prod"
   ]
}
```

#### YAML
<a name="intrinsic-function-reference-conditions-equals-example.yaml"></a>

```
IsProduction:
  !Equals [!Ref EnvironmentType, prod]
```

## `Fn::If`
<a name="intrinsic-function-reference-conditions-if"></a>

지정된 조건이 `true`로 평가되면 특정 값을 반환하고 지정된 조건이 `false`로 평가되면 다른 값을 반환합니다. 현재 CloudFormation에서는 `Metadata` 속성, `UpdatePolicy` 속성, 템플릿의 `Resources` 섹션과 `Outputs` 섹션에 있는 속성 값에서 `Fn::If` 내장 함수를 지원합니다. `AWS::NoValue` 가상 파라미터를 반환 값으로 사용하여 해당 속성을 제거할 수 있습니다.

### 선언
<a name="intrinsic-function-reference-conditions-if-syntax"></a>

#### JSON
<a name="intrinsic-function-reference-conditions-if-syntax.json"></a>

```
"Fn::If": [condition_name, value_if_true, value_if_false]
```

#### YAML
<a name="intrinsic-function-reference-conditions-if-syntax.yaml"></a>

전체 함수 이름의 구문:

```
Fn::If: [condition_name, value_if_true, value_if_false]
```

짧은 형식의 구문:

```
!If [condition_name, value_if_true, value_if_false]
```

### Parameters
<a name="w2aac24c20c19b7"></a>

condition\$1name  <a name="condition_name"></a>
조건 섹션의 조건에 대한 참조입니다. 조건의 이름을 사용하여 조건을 참조합니다.

value\$1if\$1true  <a name="value_if_true"></a>
지정된 조건이 true로 평가되는 경우에 반환될 값입니다.

value\$1if\$1false  <a name="value_if_false"></a>
지정된 조건이 `false`로 평가되는 경우에 반환될 값입니다.

### `Fn::If` 사용 예
<a name="w2aac24c20c19b9"></a>

**Topics**
+ [조건부로 리소스 선택](#w2aac24c20c19b9b5)
+ [조건부 출력](#w2aac24c20c19b9b7)
+ [조건부 배열 값](#w2aac24c20c19b9b9)
+ [조건부 속성 및 속성 값](#w2aac24c20c19b9c11)
+ [조건부 업데이트 정책](#w2aac24c20c19b9c13)

#### 조건부로 리소스 선택
<a name="w2aac24c20c19b9b5"></a>

다음 예제에서는 Amazon EC2 리소스 정의의 `Fn::If` 함수를 사용하여 인스턴스와 연결할 보안 그룹 리소스를 결정합니다. `CreateNewSecurityGroup` 조건이 true로 평가되면, CloudFormation은 참조된 값 `NewSecurityGroup`(템플릿의 다른 곳에서 생성된 보안 그룹)을 사용하여 `SecurityGroupIds` 속성을 지정합니다. `CreateNewSecurityGroup`이 false인 경우 CloudFormation은 참조된 값 `ExistingSecurityGroupId`(기존 보안 그룹을 참조하는 파라미터)을 사용합니다.

##### JSON
<a name="intrinsic-function-reference-conditions-if-example1.json"></a>

```
"Resources": {
  "EC2Instance": {
    "Type": "AWS::EC2::Instance",
    "Properties": {
      "ImageId": "ami-0abcdef1234567890",
      "InstanceType": "t3.micro",
      "SecurityGroupIds": {
        "Fn::If": [
          "CreateNewSecurityGroup",
          [{"Ref": "NewSecurityGroup"}],
          [{"Ref": "ExistingSecurityGroupId"}]
        ]
      }]
    }
  }
}
```

##### YAML
<a name="intrinsic-function-reference-conditions-if-example1.yaml"></a>

```
Resources:
  EC2Instance:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: ami-0abcdef1234567890
      InstanceType: t3.micro
      SecurityGroupIds: !If
        - CreateNewSecurityGroup
        - [!Ref NewSecurityGroup]
        - [!Ref ExistingSecurityGroupId]
```

#### 조건부 출력
<a name="w2aac24c20c19b9b7"></a>

템플릿의 `Output` 섹션에서 `Fn::If` 함수를 사용하여 정보를 조건부로 출력할 수 있습니다. 다음 코드 조각에서 `CreateNewSecurityGroup` 조건이 true로 평가되면 CloudFormation에서 `NewSecurityGroup` 리소스의 보안 그룹 ID를 출력합니다. 조건이 false이면 CloudFormation은 `ExistingSecurityGroup` 리소스의 보안 그룹 ID를 출력합니다.

##### JSON
<a name="intrinsic-function-reference-conditions-if-example2.json"></a>

```
"Outputs" : {
  "SecurityGroupId" : {
    "Description" : "Group ID of the security group used.",
    "Value" : {
      "Fn::If" : [
        "CreateNewSecurityGroup",
        {"Ref" : "NewSecurityGroup"},
        {"Ref" : "ExistingSecurityGroupId"}
      ]
    }
  }
}
```

##### YAML
<a name="intrinsic-function-reference-conditions-if-example2.yaml"></a>

```
Outputs:
  SecurityGroupId: 
    Description: Group ID of the security group used.
    Value: !If [CreateNewSecurityGroup, !Ref NewSecurityGroup, !Ref ExistingSecurityGroupId]
```

#### 조건부 배열 값
<a name="w2aac24c20c19b9b9"></a>

다음 예제에서는 `Fn::If`를 사용하여 조건에 따라 다른 배열 값을 조건부로 제공합니다. `MoreThan2AZs` 조건이 true로 평가되면 3개의 퍼블릭 서브넷을 사용합니다. 그렇지 않으면 2개의 퍼블릭 서브넷만 사용합니다.

##### JSON
<a name="intrinsic-function-reference-conditions-if-example-arrays.json"></a>

```
"Subnets": {
  "Fn::If": [
    "MoreThan2AZs",
    [
      {"Fn::ImportValue": "PublicSubnet01"},
      {"Fn::ImportValue": "PublicSubnet02"},
      {"Fn::ImportValue": "PublicSubnet03"}
    ],
    [
      {"Fn::ImportValue": "PublicSubnet01"},
      {"Fn::ImportValue": "PublicSubnet02"}
    ]
  ]
}
```

##### YAML
<a name="intrinsic-function-reference-conditions-if-example-arrays.yaml"></a>

```
Subnets:
  Fn::If:
    - MoreThan2AZs
    - - Fn::ImportValue: PublicSubnet01
      - Fn::ImportValue: PublicSubnet02
      - Fn::ImportValue: PublicSubnet03
    - - Fn::ImportValue: PublicSubnet01
      - Fn::ImportValue: PublicSubnet02
```

#### 조건부 속성 및 속성 값
<a name="w2aac24c20c19b9c11"></a>

다음 예제에서는 `Fn::If` 함수에서 `AWS::NoValue` 가상 파라미터를 사용합니다. 스냅샷 ID가 제공된 경우에만 조건에서 Amazon RDS DB 인스턴스에 대한 스냅샷을 사용합니다. `UseDBSnapshot` 조건이 true로 평가되면 CloudFormation에서는 `DBSnapshotIdentifier` 속성에 대한 `DBSnapshotName` 파라미터 값을 사용합니다. 조건이 false로 평가되면 CloudFormation이 `DBSnapshotIdentifier` 속성을 제거합니다.

또한 Amazon RDS DB 인스턴스의 `AllocatedStorage` 속성에 `Fn::If` 함수를 사용합니다. `IsProduction` 조건이 true로 평가되면 스토리지 크기가 `100`으로 설정됩니다. 그렇지 않으면 `20`로 설정됩니다.

##### JSON
<a name="intrinsic-function-reference-conditions-if-example3.json"></a>

```
"MyDatabase" : {
  "Type" : "AWS::RDS::DBInstance",
  "Properties": {
    "DBInstanceClass": "db.t3.micro",
    "AllocatedStorage": {
      "Fn::If": [
        "IsProduction",
        100,
        20
      ]
    },
    "Engine" : "MySQL",
    "EngineVersion" : "5.5",
    "MasterUsername" : { "Ref" : "DBUser" },
    "MasterUserPassword" : { "Ref" : "DBPassword" },
    "DBParameterGroupName" : { "Ref" : "MyRDSParamGroup" },
    "DBSnapshotIdentifier" : {
      "Fn::If" : [
        "UseDBSnapshot",
        {"Ref" : "DBSnapshotName"},
        {"Ref" : "AWS::NoValue"}
      ]
    }
  }
}
```

##### YAML
<a name="intrinsic-function-reference-conditions-if-example3.yaml"></a>

```
MyDatabase:
  Type: AWS::RDS::DBInstance
  Properties:
    DBInstanceClass: db.t3.micro
    AllocatedStorage: !If [IsProduction, 100, 20]
    Engine: MySQL
    EngineVersion: 5.5
    MasterUsername: !Ref DBUser
    MasterUserPassword: !Ref DBPassword
    DBParameterGroupName: !Ref MyRDSParamGroup
    DBSnapshotIdentifier: !If [UseDBSnapshot, !Ref DBSnapshotName, !Ref "AWS::NoValue"]
```

#### 조건부 업데이트 정책
<a name="w2aac24c20c19b9c13"></a>

다음은 `RollingUpdates` 조건이 true로 평가되는 경우에만 Auto Scaling 업데이트 정책을 제공하는 코드 조각입니다. 조건이 false로 평가되면 CloudFormation이 `AutoScalingRollingUpdate` 업데이트 정책을 제거합니다.

##### JSON
<a name="intrinsic-function-reference-conditions-if-example4.json"></a>

```
"UpdatePolicy": {
  "Fn::If": [
    "RollingUpdates",
    {
      "AutoScalingRollingUpdate": {
        "MaxBatchSize": 2,
        "MinInstancesInService": 2,
        "PauseTime": "PT0M30S"
      }
    },
    {
      "Ref": "AWS::NoValue"
    }
  ]
}
```

##### YAML
<a name="intrinsic-function-reference-conditions-if-example4.yaml"></a>

```
UpdatePolicy: !If
  - RollingUpdates
  - AutoScalingRollingUpdate:
      MaxBatchSize: 2
      MinInstancesInService: 2
      PauseTime: PT0M30S
  - !Ref "AWS::NoValue"
```

## `Fn::Not`
<a name="intrinsic-function-reference-conditions-not"></a>

`false`로 평가되는 조건에 대해 `true`를 반환하고 `true`로 평가되는 조건에 대해 `false`를 반환합니다. `Fn::Not`는 NOT 연산자 역할을 합니다.

### 선언
<a name="intrinsic-function-reference-conditions-not-syntax"></a>

#### JSON
<a name="intrinsic-function-reference-conditions-not-syntax.json"></a>

```
"Fn::Not": [{condition}]
```

#### YAML
<a name="intrinsic-function-reference-conditions-not-syntax.yaml"></a>

전체 함수 이름의 구문:

```
Fn::Not: [condition]
```

짧은 형식의 구문:

```
!Not [condition]
```

### Parameters
<a name="w2aac24c20c21b7"></a>

condition  <a name="condition"></a>
`Fn::Equals` 또는 `true`로 평가되는 조건(예: `false`)입니다.

### `Fn::Not` 사용 예
<a name="w2aac24c20c21b9"></a>

다음 `EnvCondition` 조건이 true로 평가되려면 `EnvironmentType` 파라미터 값이 `prod`와 같지 않아야 합니다.

#### JSON
<a name="intrinsic-function-reference-conditions-not-example.json"></a>

```
"MyNotCondition" : {
   "Fn::Not" : [{
      "Fn::Equals" : [
         {"Ref" : "EnvironmentType"},
         "prod"
      ]
   }]
}
```

#### YAML
<a name="intrinsic-function-reference-conditions-not-example.yaml"></a>

```
MyNotCondition:
  !Not [!Equals [!Ref EnvironmentType, prod]]
```

## `Fn::Or`
<a name="intrinsic-function-reference-conditions-or"></a>

지정된 모든 조건 중 하나라도 true로 평가되면 `true`가 반환되고, 조건 모두가 false로 평가되는 경우 `false`가 반환됩니다. `Fn::Or`는 OR 연산자 역할을 합니다. 포함할 수 있는 최소 조건 수는 2이고 최대값은 10입니다.

### 선언
<a name="intrinsic-function-reference-conditions-or-syntax"></a>

#### JSON
<a name="intrinsic-function-reference-conditions-or-syntax.json"></a>

```
"Fn::Or": [{condition}, {...}]
```

#### YAML
<a name="intrinsic-function-reference-conditions-or-syntax.yaml"></a>

전체 함수 이름의 구문:

```
Fn::Or: [condition, ...]
```

짧은 형식의 구문:

```
!Or [condition, ...]
```

### Parameters
<a name="w2aac24c20c23b7"></a>

condition  
`true` 또는 `false`로 평가되는 조건입니다.

### `Fn::Or` 사용 예
<a name="w2aac24c20c23b9"></a>

다음 `MyOrCondition`이 true로 평가되려면 참조된 보안 그룹 이름이 `sg-mysggroup`과 같거나 `SomeOtherCondition`이 true로 평가되어야 합니다.

#### JSON
<a name="intrinsic-function-reference-conditions-or-example.json"></a>

```
"MyOrCondition" : {
   "Fn::Or" : [
      {"Fn::Equals" : ["sg-mysggroup", {"Ref" : "ASecurityGroup"}]},
      {"Condition" : "SomeOtherCondition"}
   ]
}
```

#### YAML
<a name="intrinsic-function-reference-conditions-or-example.yaml"></a>

```
MyOrCondition:
  !Or [!Equals [sg-mysggroup, !Ref ASecurityGroup], Condition: SomeOtherCondition]
```

## 지원되는 함수
<a name="w2aac24c20c25"></a>

`Fn::If` 조건에서 다음과 같은 함수를 사용할 수 있습니다.
+ `Fn::Base64`
+ `Fn::FindInMap`
+ `Fn::GetAtt`
+ `Fn::GetAZs`
+ `Fn::If`
+ `Fn::Join`
+ `Fn::Select`
+ `Fn::Sub`
+ `Ref`

`Fn::Equals` 및 `Fn::Or` 등 나머지 모든 조건 함수에서 다음과 같은 함수를 사용할 수 있습니다.
+ `Fn::FindInMap`
+ `Ref`
+ 기타 조건 함수

## 샘플 템플릿
<a name="conditions-sample-templates"></a>

### 프로덕션, 개발 또는 테스트 스택에 대한 리소스를 조건부로 생성
<a name="w2aac24c20c27b3"></a>

비슷하지만 약간 조정된 스택을 생성하려는 경우도 있습니다. 예를 들어, 프로덕션 애플리케이션에 사용할 템플릿이 필요할 수 있습니다. 개발 또는 테스트에 사용할 수 있도록 동일한 프로덕션 스택을 생성하려고 합니다. 하지만 개발 및 테스트의 경우 프로덕션 레벨 스택에 포함되는 추가 용량 중 일부가 필요하지 않을 수도 있습니다. 그 대신 다음 예제와 같이 환경 유형 입력 파라미터를 사용하여 프로덕션, 개발 또는 테스트에 특정한 스택 리소스를 조건부로 생성할 수 있습니다.

`prod` 파라미터에 대해 `dev`, `test` 또는 `EnvType`를 지정할 수 있습니다. 템플릿에서는 환경 유형별로 다른 인스턴스 유형을 지정합니다. 인스턴스 유형은 대용량의 컴퓨팅 최적화된 인스턴스 유형부터 작은 범용 인스턴스 유형까지 다양합니다. 인스턴스 유형을 조건부로 지정하려면 템플릿의 `Conditions` 섹션에서 `CreateProdResources` 조건(`EnvType` 파라미터 값이 `prod`와 같으면 true로 평가됨)과 `CreateDevResources` 조건(파라미터 값이 `dev`와 같으면 true로 평가됨)을 정의합니다.

`InstanceType` 속성에서 템플릿은 두 `Fn::If` 내장 함수를 중첩하여 사용할 인스턴스 유형을 결정합니다. `CreateProdResources` 조건이 true이면 인스턴스 유형은 `c5.xlarge`이고, false이면 `CreateDevResources` 조건이 평가됩니다. `CreateDevResources` 조건이 true이면 인스턴스 유형이 `t3.medium`이고, 그렇지 않으면 `t3.small`입니다.

인스턴스 유형 이외에 프로덕션 환경에서는 Amazon EC2 볼륨을 생성하여 인스턴스에 연결합니다. 조건이 true로 평가되는 경우에만 리소스가 생성되도록 `MountPoint` 및 `NewVolume` 리소스는 `CreateProdResources` 조건과 연결됩니다.

**Example JSON**  

```
{
  "AWSTemplateFormatVersion" : "2010-09-09",
  "Parameters" : {
    "EnvType" : {
      "Description" : "Environment type.",
      "Default" : "test",
      "Type" : "String",
      "AllowedValues" : ["prod", "dev", "test"],
      "ConstraintDescription" : "must specify prod, dev, or test."
    }
  },
  "Conditions" : {
    "CreateProdResources" : {"Fn::Equals" : [{"Ref" : "EnvType"}, "prod"]},
    "CreateDevResources" : {"Fn::Equals" : [{"Ref" : "EnvType"}, "dev"]}
  },
  "Resources" : {
    "EC2Instance" : {
      "Type" : "AWS::EC2::Instance",
      "Properties" : {
        "ImageId" : "ami-1234567890abcdef0",
        "InstanceType" : { "Fn::If" : [
          "CreateProdResources",
          "c5.xlarge",
          {"Fn::If" : [
            "CreateDevResources",
            "t3.medium",
            "t3.small"
          ]}
        ]}
      }
    },
    "MountPoint" : {
      "Type" : "AWS::EC2::VolumeAttachment",
      "Condition" : "CreateProdResources",
      "Properties" : {
        "InstanceId" : { "Ref" : "EC2Instance" },
        "VolumeId"  : { "Ref" : "NewVolume" },
        "Device" : "/dev/sdh"
      }
    },
    "NewVolume" : {
      "Type" : "AWS::EC2::Volume",
      "Condition" : "CreateProdResources",
      "Properties" : {
        "Size" : "100",
        "AvailabilityZone" : { "Fn::GetAtt" : [ "EC2Instance", "AvailabilityZone" ]}
      }
    }
  }
}
```

**Example YAML**  

```
AWSTemplateFormatVersion: "2010-09-09"
Parameters:
  EnvType:
    Description: Environment type.
    Default: test
    Type: String
    AllowedValues: [prod, dev, test]
    ConstraintDescription: must specify prod, dev, or test.
Conditions:
  CreateProdResources: !Equals [!Ref EnvType, prod]
  CreateDevResources: !Equals [!Ref EnvType, "dev"]
Resources:
  EC2Instance:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: ami-1234567890abcdef0
      InstanceType: !If [CreateProdResources, c5.xlarge, !If [CreateDevResources, t3.medium, t3.small]]    
  MountPoint:
    Type: AWS::EC2::VolumeAttachment
    Condition: CreateProdResources
    Properties:
      InstanceId: !Ref EC2Instance
      VolumeId: !Ref NewVolume
      Device: /dev/sdh
  NewVolume:
    Type: AWS::EC2::Volume
    Condition: CreateProdResources
    Properties:
      Size: 100
      AvailabilityZone: !GetAtt EC2Instance.AvailabilityZone
```

**참고**  
조건을 사용하여 리소스를 생성하는 더 복잡한 예는 [`Condition` 속성](aws-attribute-condition.md) 주제를 참조하세요.

# `Fn::FindInMap`
<a name="intrinsic-function-reference-findinmap"></a>

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

## 선언
<a name="w2aac24c25b5"></a>

### JSON
<a name="intrinsic-function-reference-findinmap-syntax.json"></a>

```
{ "Fn::FindInMap" : [ "MapName", "TopLevelKey", "SecondLevelKey"] }
```

### YAML
<a name="intrinsic-function-reference-findinmap-syntax.yaml"></a>

전체 함수 이름의 구문:

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

짧은 형식의 구문:

```
!FindInMap [ MapName, TopLevelKey, SecondLevelKey ]
```

**참고**  
두 함수의 인스턴스 두 개는 짧은 형식으로 중첩할 수 없습니다.

## 파라미터
<a name="w2aac24c25b7"></a>

MapName  <a name="MapName"></a>
키 및 값이 포함된 매핑 섹션에서 선언된 매핑의 논리적 이름입니다.

TopLevelKey  <a name="TopLevelKey"></a>
최상위 키 이름입니다. 이 값은 키-값 페어 목록입니다.

SecondLevelKey  <a name="SecondLevelKey"></a>
`TopLevelKey`에 할당된 목록의 키 중 하나로 설정된 두 번째 수준 키 이름입니다.

## 반환 값
<a name="w2aac24c25b9"></a>

`SecondLevelKey`에 할당된 값입니다.

## 예제
<a name="intrinsic-function-reference-findinmap-examples"></a>

다음은 `Fn::FindInMap` 함수의 사용 방법을 설명하는 예제입니다.

**Topics**
+ [리전별 값과 함께 Fn::FindInMap 사용](#intrinsic-function-reference-findinmap-region-example)
+ [환경별 구성에 Fn::FindInMap 사용](#intrinsic-function-reference-findinmap-environment-example)

### 리전별 값과 함께 Fn::FindInMap 사용
<a name="intrinsic-function-reference-findinmap-region-example"></a>

다음 예제에서는 `AWSInstanceType2Arch` 및 `AWSRegionArch2AMI`의 두 가지 매핑이 포함된 템플릿에서 `Fn::FindInMap`를 사용하는 방법을 보여줍니다. 또한 `t3.micro` 및 `t4g.nano` 중에서 선택할 수 있는 `InstanceType` 파라미터도 포함되어 있습니다. 기본값은 `t3.micro`이지만 스택 생성 중 재정의할 수 있습니다.

`Fn::FindInMap`는 먼저 선택한 인스턴스 유형을 기반으로 아키텍처(`HVM64` 또는 `ARM64`)를 확인한 다음 현재 AWS 리전에서 해당 아키텍처에 대한 올바른 AMI ID를 조회합니다.

**참고**  
이 예제에 표시된 AMI ID는 데모용 자리 표시자입니다. 가능하면 `Mappings` 섹션의 대안으로 AWS Systems Manager 파라미터에 대한 동적 참조를 사용하는 것이 좋습니다. 사용하려는 AMI가 변경될 때마다 모든 템플릿을 새 ID로 업데이트하지 않으려면 스택이 생성되거나 업데이트될 때 AWS Systems Manager 파라미터를 사용하여 최신 AMI ID를 검색하세요. 일반적으로 사용되는 AMI의 최신 버전도 Systems Manager의 퍼블릭 파라미터로 사용할 수 있습니다. 자세한 내용은 [동적 참조를 사용하여 다른 서비스에 저장된 값 가져오기](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/dynamic-references.html)를 참조하세요.

#### JSON
<a name="intrinsic-function-reference-findinmap-region-example.json"></a>

```
{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Parameters": {
    "InstanceType": {
      "Description": "The EC2 instance type",
      "Type": "String",
      "AllowedValues": [
        "t3.micro",
        "t4g.nano"
      ],
      "Default": "t3.micro"
    }
  },
  "Mappings": {
    "AWSInstanceType2Arch": {
      "t3.micro": {
        "Arch": "HVM64"
      },
      "t4g.nano": {
        "Arch": "ARM64"
      }
    },
    "AWSRegionArch2AMI": {
      "us-east-1" : { 
        "HVM64" : "ami-12345678901234567", "ARM64" : "ami-23456789012345678" 
      },
      "us-west-1" : { 
        "HVM64" : "ami-34567890123456789", "ARM64" : "ami-45678901234567890"
      },
      "eu-west-1" : { 
        "HVM64" : "ami-56789012345678901", "ARM64" : "ami-67890123456789012" 
      },
      "ap-southeast-1" : { 
        "HVM64" : "ami-78901234567890123", "ARM64" : "ami-89012345678901234" 
      },
      "ap-northeast-1" : { 
        "HVM64" : "ami-90123456789012345", "ARM64" : "ami-01234567890123456" 
      }
    }
  },
  "Resources" : {
    "MyEC2Instance" : {
      "Type" : "AWS::EC2::Instance",
      "Properties" : {
        "InstanceType" : { "Ref": "InstanceType" },
        "ImageId" : {
          "Fn::FindInMap" : [ "AWSRegionArch2AMI", { "Ref": "AWS::Region" }, { "Fn::FindInMap": [ "AWSInstanceType2Arch", { "Ref": "InstanceType" }, "Arch" ]}]
        }
      }
    }
  }
}
```

#### YAML
<a name="intrinsic-function-reference-findinmap-region-example.yaml"></a>

```
AWSTemplateFormatVersion: 2010-09-09
Parameters:
  InstanceType:
    Description: The EC2 instance type
    Type: String
    AllowedValues:
      - t3.micro
      - t4g.nano
    Default: t3.micro
Mappings: 
  AWSInstanceType2Arch:
    t3.micro:
      Arch: HVM64
    t4g.nano:
      Arch: ARM64
  AWSRegionArch2AMI:
    us-east-1: 
      HVM64: ami-12345678901234567
      ARM64: ami-23456789012345678
    us-west-1: 
      HVM64: ami-34567890123456789
      ARM64: ami-45678901234567890
    eu-west-1: 
      HVM64: ami-56789012345678901
      ARM64: ami-67890123456789012
    ap-southeast-1: 
      HVM64: ami-78901234567890123
      ARM64: ami-89012345678901234
    ap-northeast-1: 
      HVM64: ami-90123456789012345
      ARM64: ami-01234567890123456
Resources: 
  myEC2Instance: 
    Type: AWS::EC2::Instance
    Properties:
      InstanceType: !Ref InstanceType
      ImageId:
        Fn::FindInMap:
        - AWSRegionArch2AMI
        - Ref: AWS::Region
        - Fn::FindInMap:
          - AWSInstanceType2Arch
          - Ref: InstanceType
          - Arch
```

### 환경별 구성에 Fn::FindInMap 사용
<a name="intrinsic-function-reference-findinmap-environment-example"></a>

다음 예제에서는 단일 맵 `SecurityGroups`이 포함된 `Mappings` 섹션이 있는 템플릿에 `Fn::FindInMap`을 사용하는 방법을 보여줍니다. 또한 환경이 `Dev`인지 `Prod`인지 지정할 수 있는 `EnvironmentType` 파라미터도 포함되어 있습니다. 기본적으로 `Dev`이지만 스택 생성 중 재정의할 수 있습니다.

`Fn::FindInMap`은 `EnvironmentType` 파라미터를 기반으로 적절한 `SecurityGroupIds`를 반환합니다. 그런 다음 `Fn::Split`은 보안 그룹 ID의 쉼표로 구분된 문자열을 [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-instance.html#cfn-ec2-instance-securitygroupids](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-instance.html#cfn-ec2-instance-securitygroupids)에 대한 예상 형식인 목록으로 분할합니다.

`EnvironmentType`을 `Dev`로 설정하여 이 스택을 배포하는 경우 `EC2Instance`의 `SecurityGroupIds`는 `sg-12345678`이 됩니다. `EnvironmentType`을 `Prod`로 설정하는 경우 `sg-abcdef01`과 `sg-ghijkl23`이 사용됩니다.

#### JSON
<a name="intrinsic-function-reference-findinmap-environment-example.json"></a>

```
{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Parameters":{
    "EnvironmentType":{
      "Description":"The environment type (Dev or Prod)",
      "Type":"String",
      "Default":"Dev",
      "AllowedValues":[
        "Dev",
        "Prod"
      ]
    }
  },
  "Mappings":{
    "SecurityGroups":{
      "Dev":{
        "SecurityGroupIds":"sg-12345678"
      },
      "Prod":{
        "SecurityGroupIds":"sg-abcdef01,sg-ghijkl23"
      }
    }
  },
  "Resources":{
    "Ec2Instance":{
      "Type":"AWS::EC2::Instance",
      "Properties":{
        "ImageId": "{{resolve:ssm:/aws/service/ami-amazon-linux-latest/al2023-ami-kernel-6.1-x86_64}}",
        "InstanceType": "t2.micro",
        "SecurityGroupIds":{
          "Fn::Split":[
            ",",
            {
              "Fn::FindInMap":[
                "SecurityGroups",
                {
                  "Ref":"EnvironmentType"
                },
                "SecurityGroupIds"
              ]
            }
          ]
        }
      }
    }
  }
}
```

#### YAML
<a name="intrinsic-function-reference-findinmap-environment-example.yaml"></a>

```
AWSTemplateFormatVersion: 2010-09-09
Parameters:
  EnvironmentType:
    Description: The environment type (Dev or Prod)
    Type: String
    Default: Dev
    AllowedValues:
      - Dev
      - Prod
Mappings:
  SecurityGroups:
    Dev:
      SecurityGroupIds: sg-12345678
    Prod:
      SecurityGroupIds: sg-abcdef01,sg-ghijkl23
Resources:
  Ec2Instance:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: '{{resolve:ssm:/aws/service/ami-amazon-linux-latest/al2023-ami-kernel-6.1-x86_64}}'
      InstanceType: t2.micro
      SecurityGroupIds:
        Fn::Split:
          - ","
          - Fn::FindInMap: [ SecurityGroups, !Ref EnvironmentType, SecurityGroupIds ]
```

## 지원되는 함수
<a name="w2aac24c25c13"></a>

`Fn::FindInMap` 함수에서 다음과 같은 함수를 사용할 수 있습니다.
+ `Fn::FindInMap`
+ `Ref`

## 관련 리소스
<a name="w2aac24c25c15"></a>

`Fn::FindInMap` 함수에서 다른 내장 함수나 기본값을 사용하려면 템플릿 내에서 `AWS::LanguageExtensions` 변환을 선언해야 합니다. 자세한 내용은 [`Fn::FindInMap enhancements`](intrinsic-function-reference-findinmap-enhancements.md) 섹션을 참조하세요.

이러한 관련 주제는 `Fn::FindInMap` 함수를 사용하는 템플릿을 개발할 때 도움이 될 수 있습니다.
+ [`Fn::Sub`](intrinsic-function-reference-sub.md)
+ *AWS CloudFormation 사용 설명서*의 [CloudFormation 템플릿 Mappings 구문](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/mappings-section-structure.html)

# `Fn::ForEach`
<a name="intrinsic-function-reference-foreach"></a>

`Fn::ForEach` 내장 함수는 컬렉션과 조각을 가져와서 컬렉션의 항목을 제공된 조각의 식별자에 적용합니다. `Fn::ForEach`는 `Fn::ForEach`를 비롯한 다른 내장 함수를 포함할 수 있으며, `Conditions`, `Outputs`, `Resources`(리소스 속성 포함) 섹션 내에서 사용될 수 있습니다. `AWSTemplateFormatVersion`, `Description`, `Metadata`, `Transform`, `Parameters`, `Mappings`, `Rules` 또는 `Hooks` 섹션에서는 사용할 수 없습니다.

템플릿에서 `Fn::ForEach` 내장 함수를 사용하는 경우 [`AWS::LanguageExtensions` 변환](transform-aws-languageextensions.md)도 사용해야 합니다.

`Fn::ForEach` 내장 함수를 사용해도 결과 템플릿에 적용되는 할당량은 변경되지 않습니다. 할당량에는 템플릿의 최대 크기와 템플릿의 최대 리소스 수가 포함됩니다. 자세한 내용은 *AWS CloudFormation 사용 설명서*의 [CloudFormation 할당량 이해](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cloudformation-limits.html) 섹션을 참조하세요.

## 선언
<a name="intrinsic-function-reference-foreach-declaration"></a>

### JSON
<a name="intrinsic-function-reference-foreach-declaration.json"></a>

```
"Fn::ForEach::LoopLogicalName": [
  "Identifier",
  ["Value1","Value2"], // Collection
  {"OutputKey": {OutputValue}}
]
```

### YAML
<a name="intrinsic-function-reference-foreach-declaration.yaml"></a>

```
'Fn::ForEach::LoopLogicalName':
    - Identifier
    - - Value1 # Collection
      - Value2
    - 'OutputKey':
        OutputValue
```

## 파라미터
<a name="intrinsic-function-reference-foreach-parameters"></a>

*루프 논리명*  
루프의 논리적 ID입니다. 이름은 템플릿 내에서 고유해야 하며 템플릿의 `Resources` 섹션에 있는 논리적 ID 값과 충돌해서는 안 됩니다. 이 이름은 변환된 출력에 없습니다. CloudFormation 템플릿 자체 내에서 내부 참조에 사용됩니다.

*식별자*  
`OutputKey` 및 `OutputValue` 파라미터에서 대체되는 자리 표시자의 식별자입니다. `OutputKey` 및 `OutputValue` 파라미터에서 `${Identifier}` 또는 `&{Identifier}`의 모든 인스턴스는 `Collection` 파라미터의 값으로 대체됩니다.

*수집*  
반복할 값 컬렉션입니다. 이 파라미터의 배열일 수도 있고 [`Ref`](intrinsic-function-reference-ref.md)\$1`CommaDelimitedList`일 수도 있습니다. `&{Identifier}`를 사용하는 경우 `Collection`에 영숫자가 아닌 문자가 전달될 수 있습니다.

*출력 키*  
변환된 템플릿의 키입니다. `${Identifier}` 또는 `&{Identifier}`는 `OutputKey` 파라미터에 포함되어야 합니다. 예를 들어 `Fn::ForEach`가 템플릿의 `Resources` 섹션에서 사용되는 경우 각 리소스의 논리적 ID입니다.  
`&{}` 구문을 사용하면 `OutputKey` 파라미터에서 사용할 `Collection`에 영숫자가 아닌 문자를 사용할 수 있습니다. 예제는 [`Fn::ForEach`의 `Collection` 내에서 영숫자가 아닌 문자 전달](intrinsic-function-reference-foreach-example-resource.md#intrinsic-function-reference-foreach-example-non-alphanumeric)의 내용을 참조하세요.

*출력 값입니다.*  
`Collection` 파라미터의 각 항목에 대해 변환된 템플릿에 복제되는 값입니다. 예를 들어 `Fn::ForEach`가 템플릿의 `Resources` 섹션에서 사용되는 경우 각 리소스를 구성하기 위해 반복되는 템플릿 조각입니다.

## 반환 값
<a name="intrinsic-function-reference-foreach-return-value"></a>

컬렉션의 각 항목에 대해 한 번씩 반복되는 개체 조각이 포함된 확장 개체이며, 조각의 식별자는 컬렉션의 항목으로 대체됩니다.

## 지원되는 함수
<a name="intrinsic-function-reference-foreach-nested-functions"></a>

`Fn::ForEach` 내에서 다음과 같은 함수를 사용할 수 있습니다.
+ 조건 함수:
  + [`Fn::And`](intrinsic-function-reference-conditions.md#intrinsic-function-reference-conditions-and)
  + [`Fn::Equals`](intrinsic-function-reference-conditions.md#intrinsic-function-reference-conditions-equals)
  + [`Fn::If`](intrinsic-function-reference-conditions.md#intrinsic-function-reference-conditions-if)
  + [`Fn::Not`](intrinsic-function-reference-conditions.md#intrinsic-function-reference-conditions-not)
  + [`Fn::Or`](intrinsic-function-reference-conditions.md#intrinsic-function-reference-conditions-or)
+ [`Fn::Base64`](intrinsic-function-reference-base64.md)
+ [`Fn::FindInMap`](intrinsic-function-reference-findinmap.md)
+ [`Fn::GetAtt`](intrinsic-function-reference-getatt.md)
+ [`Fn::GetAZs`](intrinsic-function-reference-getavailabilityzones.md)
+ [`Fn::ImportValue`](intrinsic-function-reference-importvalue.md)
+ [`Fn::Join`](intrinsic-function-reference-join.md)
+ [`Fn::Length`](intrinsic-function-reference-length.md)
+ [`Fn::Transform`](intrinsic-function-reference-transform.md)
+ [`Fn::Select`](intrinsic-function-reference-select.md)
+ [`Fn::Sub`](intrinsic-function-reference-sub.md)
+ [`Fn::ToJsonString`](intrinsic-function-reference-ToJsonString.md)
+ [`Ref`](intrinsic-function-reference-ref.md)

## 예제
<a name="intrinsic-function-reference-foreach-example-pointer"></a>

[예시](intrinsic-function-reference-foreach-examples.md)에서 `Conditions`, `Outputs` 및 `Resources` 섹션의 예를 찾을 수 있습니다.

# 예시
<a name="intrinsic-function-reference-foreach-examples"></a>

**Topics**
+ [`Resources` 섹션의 `Fn::ForEach` 예](intrinsic-function-reference-foreach-example-resource.md)
+ [`Outputs` 섹션의 `Fn::ForEach` 예](intrinsic-function-reference-foreach-example-outputs.md)
+ [`Conditions` 섹션의 `Fn::ForEach` 예](intrinsic-function-reference-foreach-example-conditions.md)

# `Resources` 섹션의 `Fn::ForEach` 예
<a name="intrinsic-function-reference-foreach-example-resource"></a>

이 예제에서는 `Resources` 섹션에서 `Fn::ForEach` 내장 함수를 사용하는 방법을 보여줍니다. 이 섹션에 대한 자세한 내용은 *AWS CloudFormation 사용 설명서*의 [리소스](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/resources-section-structure.html)를 참조하세요.

**Topics**
+ [Amazon SNS 리소스 복제](#intrinsic-function-reference-foreach-example-replicate-resource)
+ [Amazon DynamoDB 리소스 복제](#intrinsic-function-reference-foreach-example-replicate-ddb-resource)
+ [여러 리소스 복제](#intrinsic-function-reference-foreach-example-replicate-multiple-resources)
+ [중첩된 `Fn::ForEach` 루프를 사용하여 여러 리소스 복제](#intrinsic-function-reference-foreach-example-nested-loop-resources)
+ [Amazon EC2 리소스의 복제 속성 참조](#intrinsic-function-reference-foreach-example-reference-replicated-resource)
+ [Amazon EC2 리소스의 속성 복제](#intrinsic-function-reference-foreach-example-replicate-resource-properties)
+ [`Fn::ForEach`의 `Collection` 내에서 영숫자가 아닌 문자 전달](#intrinsic-function-reference-foreach-example-non-alphanumeric)

## Amazon SNS 리소스 복제
<a name="intrinsic-function-reference-foreach-example-replicate-resource"></a>

이 예제 코드 조각은 논리적 ID가 컬렉션의 항목(`Success`, `Failure`, `Timeout`, `Unknown`)에 해당하고 일치하는 `TopicName` 및 `FifoTopic`이 `true`로 설정된 네 Amazon SNS 주제의 목록을 반환합니다.

**참고**  
FIFO와 표준 주제 모두에서 작동해야 하는 템플릿의 경우 `TopicName` 대신 `DisplayName` 속성을 사용할 수 있습니다. 그러면 CloudFormation은 `FifoTopic`이 `true`일 때 적절한 `.fifo` 접미사를 사용하여 주제 이름을 자동으로 생성할 수 있습니다. `Properties` 섹션에서를 `TopicName`을 `DisplayName: !Ref TopicName`으로 바꾸기만 하면 됩니다.

### JSON
<a name="intrinsic-function-reference-foreach-example-replicate-resource.json"></a>

```
{
    "AWSTemplateFormatVersion": "2010-09-09",
    "Transform": "AWS::LanguageExtensions",
    "Resources": {
        "Fn::ForEach::Topics": [
            "TopicName",
            ["Success", "Failure", "Timeout", "Unknown"],
            {
                "SnsTopic${TopicName}": {
                    "Type": "AWS::SNS::Topic",
                    "Properties": {
                        "TopicName": {"Fn::Sub": "${TopicName}.fifo"},
                        "FifoTopic": true
                    }
                }
            }
        ]
    }
}
```

### YAML
<a name="intrinsic-function-reference-foreach-example-replicate-resource.yaml"></a>

```
AWSTemplateFormatVersion: 2010-09-09
Transform: AWS::LanguageExtensions
Resources:
  'Fn::ForEach::Topics':
    - TopicName
    - [Success, Failure, Timeout, Unknown]
    - 'SnsTopic${TopicName}':
        Type: AWS::SNS::Topic
        Properties:
          TopicName: !Sub '${TopicName}.fifo'
          FifoTopic: true
```

변환된 템플릿은 다음 템플릿과 동일합니다.

```
AWSTemplateFormatVersion: 2010-09-09
Resources:
  SnsTopicSuccess:
    Type: AWS::SNS::Topic
    Properties:
      TopicName: Success.fifo
      FifoTopic: true
  SnsTopicFailure:
    Type: AWS::SNS::Topic
    Properties:
      TopicName: Failure.fifo
      FifoTopic: true
  SnsTopicTimeout:
    Type: AWS::SNS::Topic
    Properties:
      TopicName: Timeout.fifo
      FifoTopic: true
  SnsTopicUnknown:
    Type: AWS::SNS::Topic
    Properties:
      TopicName: Unknown.fifo
      FifoTopic: true
```

## Amazon DynamoDB 리소스 복제
<a name="intrinsic-function-reference-foreach-example-replicate-ddb-resource"></a>

이 예제 코드 조각은 `Points`, `Score` 등의 이름을 가진 [AWS::DynamoDB::Table](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-dynamodb-table.html) 리소스 4개를 생성합니다.

### JSON
<a name="intrinsic-function-reference-foreach-example-replicate-ddb-resource.json"></a>

```
{
    "AWSTemplateFormatVersion": "2010-09-09",
    "Transform": "AWS::LanguageExtensions",
    "Resources": {
        "Fn::ForEach::Tables": [
            "TableName",
            ["Points", "Score", "Name", "Leaderboard"],
            {
                "DynamoDB${TableName}": {
                    "Type": "AWS::DynamoDB::Table",
                    "Properties": {
                        "TableName": {
                            "Ref": "TableName"
                        },
                        "AttributeDefinitions": [
                            {
                                "AttributeName": "id",
                                "AttributeType": "S"
                            }
                        ],
                        "KeySchema": [
                            {
                                "AttributeName": "id",
                                "KeyType": "HASH"
                            }
                        ],
                        "ProvisionedThroughput": {
                            "ReadCapacityUnits": "5",
                            "WriteCapacityUnits": "5"
                        }
                    }
                }
            }
        ]
    }
}
```

### YAML
<a name="intrinsic-function-reference-foreach-example-replicate-ddb-resource.yaml"></a>

```
AWSTemplateFormatVersion: 2010-09-09
Transform: AWS::LanguageExtensions
Resources:
  'Fn::ForEach::Tables':
    - TableName
    - [Points, Score, Name, Leaderboard]
    - 'DynamoDB${TableName}':
        Type: AWS::DynamoDB::Table
        Properties:
          TableName: !Ref TableName
          AttributeDefinitions:
            - AttributeName: id
              AttributeType: S
          KeySchema:
            - AttributeName: id
              KeyType: HASH
          ProvisionedThroughput:
            ReadCapacityUnits: '5'
            WriteCapacityUnits: '5'
```

변환된 템플릿은 다음 템플릿과 동일합니다.

```
AWSTemplateFormatVersion: 2010-09-09
Transform: AWS::LanguageExtensions
Resources:
  DynamoDBPoints:
    Type: AWS::DynamoDB::Table
    Properties:
      TableName: Points
      AttributeDefinitions:
        - AttributeName: id
          AttributeType: S
      KeySchema:
        - AttributeName: id
          KeyType: HASH
      ProvisionedThroughput:
        ReadCapacityUnits: '5'
        WriteCapacityUnits: '5'
  DynamoDBScore:
    Type: AWS::DynamoDB::Table
    Properties:
      TableName: Score
      AttributeDefinitions:
        - AttributeName: id
          AttributeType: S
      KeySchema:
        - AttributeName: id
          KeyType: HASH
      ProvisionedThroughput:
        ReadCapacityUnits: '5'
        WriteCapacityUnits: '5'
  DynamoDBName:
    Type: AWS::DynamoDB::Table
    Properties:
      TableName: Name
      AttributeDefinitions:
        - AttributeName: id
          AttributeType: S
      KeySchema:
        - AttributeName: id
          KeyType: HASH
      ProvisionedThroughput:
        ReadCapacityUnits: '5'
        WriteCapacityUnits: '5'
  DynamoDBLeaderboard:
    Type: AWS::DynamoDB::Table
    Properties:
      TableName: Leaderboard
      AttributeDefinitions:
        - AttributeName: id
          AttributeType: S
      KeySchema:
        - AttributeName: id
          KeyType: HASH
      ProvisionedThroughput:
        ReadCapacityUnits: '5'
        WriteCapacityUnits: '5'
```

## 여러 리소스 복제
<a name="intrinsic-function-reference-foreach-example-replicate-multiple-resources"></a>

이 예제에서는 명명 규칙 `"{ResourceType}${Identifier}"`를 사용하여 [AWS::EC2::NatGateway](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-natgateway.html) 및 [AWS::EC2::EIP](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-eip.html)의 인스턴스를 여러 개 생성합니다. 하나의 `Fn::ForEach` 루프에서 여러 리소스 유형을 선언하여 단일 식별자를 활용할 수 있습니다.

컬렉션의 각 요소에 대한 고유 값은 `Mappings` 섹션에서 정의되며, 이 섹션에서는 [`Fn::FindInMap`](intrinsic-function-reference-findinmap.md) 내장 함수를 사용하여 해당 값을 참조합니다. `Fn::FindInMap`이 해당 식별자를 찾을 수 없는 경우 `Condition` 속성이 `!Ref AWS:::NoValue`로 해석되도록 설정되지 않습니다.

### JSON
<a name="intrinsic-function-reference-foreach-example-replicate-multiple-resources.json"></a>

```
{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Transform": "AWS::LanguageExtensions",
  "Conditions": {
    "TwoNatGateways": {"Fn::Equals": [{"Ref": "AWS::Region"}, "us-east-1"]},
    "ThreeNatGateways": {"Fn::Equals": [{"Ref": "AWS::Region"}, "us-west-2"]}
  },
  "Mappings": {
    "NatGateway": {
      "Condition": {
        "B": "TwoNatGateways",
        "C": "ThreeNatGateways"
      }
    }
  },
  "Resources": {
    "VPC": {
      "Type": "AWS::EC2::VPC",
      "Properties": {"CidrBlock": "10.0.0.0/16"}
    },
    "PublicSubnetA": {
      "Type": "AWS::EC2::Subnet",
      "Properties": {
        "VpcId": {"Ref": "VPC"},
        "CidrBlock": "10.0.1.0/24",
        "AvailabilityZone": {"Fn::Select": [0, {"Fn::GetAZs": ""}]}
      }
    },
    "PublicSubnetB": {
      "Type": "AWS::EC2::Subnet",
      "Properties": {
        "VpcId": {"Ref": "VPC"},
        "CidrBlock": "10.0.2.0/24",
        "AvailabilityZone": {"Fn::Select": [1, {"Fn::GetAZs": ""}]}
      }
    },
    "PublicSubnetC": {
      "Type": "AWS::EC2::Subnet",
      "Properties": {
        "VpcId": {"Ref": "VPC"},
        "CidrBlock": "10.0.3.0/24",
        "AvailabilityZone": {"Fn::Select": [2, {"Fn::GetAZs": ""}]}
      }
    },
    "Fn::ForEach::NatGatewayAndEIP": [
      "Identifier",
      [ "A", "B", "C" ],
      {
        "NatGateway${Identifier}": {
          "Type": "AWS::EC2::NatGateway",
          "Properties": {
            "AllocationId": {"Fn::GetAtt": [{"Fn::Sub": "NatGatewayAttachment${Identifier}"}, "AllocationId"]},
            "SubnetId": {"Ref": {"Fn::Sub": "PublicSubnet${Identifier}"}}
          },
          "Condition": {"Fn::FindInMap": ["NatGateway", "Condition", {"Ref": "Identifier"}, {"DefaultValue": {"Ref": "AWS::NoValue"}}]}
        },
        "NatGatewayAttachment${Identifier}": {
          "Type": "AWS::EC2::EIP",
          "Properties": {
            "Domain": "vpc"
          },
          "Condition": {"Fn::FindInMap": ["NatGateway", "Condition", {"Ref": "Identifier"}, {"DefaultValue": {"Ref": "AWS::NoValue"}}]}
        }
      }
    ]
  }
}
```

### YAML
<a name="intrinsic-function-reference-foreach-example-replicate-multiple-resources.yaml"></a>

```
AWSTemplateFormatVersion: 2010-09-09
Transform: AWS::LanguageExtensions
Conditions:
  TwoNatGateways: !Equals [!Ref "AWS::Region", "us-east-1"]
  ThreeNatGateways: !Equals [!Ref "AWS::Region", "us-west-2"]
Mappings:
  NatGateway:
    Condition:
      B: TwoNatGateways
      C: ThreeNatGateways
Resources:
  VPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.0.0.0/16
  PublicSubnetA:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC
      CidrBlock: 10.0.1.0/24
      AvailabilityZone: !Select [0, !GetAZs ""]
  PublicSubnetB:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC
      CidrBlock: 10.0.2.0/24
      AvailabilityZone: !Select [1, !GetAZs ""]
  PublicSubnetC:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC
      CidrBlock: 10.0.3.0/24
      AvailabilityZone: !Select [2, !GetAZs ""]
  Fn::ForEach::NatGatewayAndEIP:
    - Identifier
    - - A
      - B
      - C
    - NatGateway${Identifier}:
        Type: AWS::EC2::NatGateway
        Properties:
          AllocationId: !GetAtt
            - !Sub NatGatewayAttachment${Identifier}
            - AllocationId
          SubnetId: !Ref
            Fn::Sub: PublicSubnet${Identifier}
        Condition: !FindInMap
          - NatGateway
          - Condition
          - !Ref Identifier
          - DefaultValue: !Ref AWS::NoValue
      NatGatewayAttachment${Identifier}:
        Type: AWS::EC2::EIP
        Properties:
          Domain: vpc
        Condition: !FindInMap
          - NatGateway
          - Condition
          - !Ref Identifier
          - DefaultValue: !Ref AWS::NoValue
```

변환된 템플릿은 다음 템플릿과 동일합니다.

```
AWSTemplateFormatVersion: 2010-09-09
Transform: AWS::LanguageExtensions
Conditions:
  TwoNatGateways: !Equals [!Ref "AWS::Region", "us-east-1"]
  ThreeNatGateways: !Equals [!Ref "AWS::Region", "us-west-2"]
Resources:
  VPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.0.0.0/16
  PublicSubnetA:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC
      CidrBlock: 10.0.1.0/24
      AvailabilityZone: !Select [0, !GetAZs ""]
  PublicSubnetB:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC
      CidrBlock: 10.0.2.0/24
      AvailabilityZone: !Select [1, !GetAZs ""]
  PublicSubnetC:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC
      CidrBlock: 10.0.3.0/24
      AvailabilityZone: !Select [2, !GetAZs ""]
  NatGatewayA:
    Type: AWS::EC2::NatGateway
    Properties:
      AllocationId: !GetAtt
        - NatGatewayAttachmentA
        - AllocationId
      SubnetId: !Ref PublicSubnetA
  NatGatewayB:
    Type: AWS::EC2::NatGateway
    Properties:
      AllocationId: !GetAtt
        - NatGatewayAttachmentB
        - AllocationId
      SubnetId: !Ref PublicSubnetB
    Condition: TwoNatGateways
  NatGatewayC:
    Type: AWS::EC2::NatGateway
    Properties:
      AllocationId: !GetAtt
        - NatGatewayAttachmentC
        - AllocationId
      SubnetId: !Ref PublicSubnetC
    Condition: ThreeNatGateways
  NatGatewayAttachmentA:
    Type: AWS::EC2::EIP
    Properties:
      Domain: vpc
  NatGatewayAttachmentB:
    Type: AWS::EC2::EIP
    Properties:
      Domain: vpc
    Condition: TwoNatGateways
  NatGatewayAttachmentC:
    Type: AWS::EC2::EIP
    Properties:
      Domain: vpc
    Condition: ThreeNatGateways
```

## 중첩된 `Fn::ForEach` 루프를 사용하여 여러 리소스 복제
<a name="intrinsic-function-reference-foreach-example-nested-loop-resources"></a>

이 예제에서는 중첩 `Fn::ForEach` 루프를 사용하여 세 리소스([AWS::EC2::NetworkAcl](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-natgateway.html), [AWS::EC2::Subnet](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-subnet.html), [AWS::EC2::SubnetNetworkAclAssociation](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-subnetnetworkaclassociation.html))를 서로 매핑합니다.

### JSON
<a name="intrinsic-function-reference-foreach-example-nested-loop-resources.json"></a>

```
{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Transform": "AWS::LanguageExtensions",
  "Resources": {
    "VPC": {
      "Type": "AWS::EC2::VPC",
      "Properties": {
        "CidrBlock": "10.0.0.0/16",
        "EnableDnsSupport": "true",
        "EnableDnsHostnames": "true"
      }
    },
    "Fn::ForEach::SubnetResources": [
      "Prefix",
      [
        "Transit",
        "Public"
      ],
      {
        "Nacl${Prefix}Subnet": {
          "Type": "AWS::EC2::NetworkAcl",
          "Properties": {
            "VpcId": {
              "Ref": "VPC"
            }
          }
        },
        "Fn::ForEach::LoopInner": [
          "Suffix",
          [
            "A",
            "B",
            "C"
          ],
          {
            "${Prefix}Subnet${Suffix}": {
              "Type": "AWS::EC2::Subnet",
              "Properties": {
                "VpcId": {
                  "Ref": "VPC"
                }
              }
            },
            "Nacl${Prefix}Subnet${Suffix}Association": {
              "Type": "AWS::EC2::SubnetNetworkAclAssociation",
              "Properties": {
                "SubnetId": {
                  "Ref": {
                    "Fn::Sub": "${Prefix}Subnet${Suffix}"
                  }
                },
                "NetworkAclId": {
                  "Ref": {
                    "Fn::Sub": "Nacl${Prefix}Subnet"
                  }
                }
              }
            }
          }
        ]
      }
    ]
  }
}
```

### YAML
<a name="intrinsic-function-reference-foreach-example-nested-loop-resources.yaml"></a>

```
AWSTemplateFormatVersion: 2010-09-09
Transform: AWS::LanguageExtensions
Resources:
  VPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.0.0.0/16
      EnableDnsSupport: 'true'
      EnableDnsHostnames: 'true'
  'Fn::ForEach::SubnetResources':
  - Prefix
  - [Transit, Public]
  - 'Nacl${Prefix}Subnet':
      Type: AWS::EC2::NetworkAcl
      Properties:
        VpcId: !Ref 'VPC'
    'Fn::ForEach::LoopInner':
    - Suffix
    - [A, B, C]
    - '${Prefix}Subnet${Suffix}':
        Type: AWS::EC2::Subnet
        Properties:
          VpcId: !Ref 'VPC'
      'Nacl${Prefix}Subnet${Suffix}Association':
        Type: AWS::EC2::SubnetNetworkAclAssociation
        Properties:
          SubnetId: !Ref
            'Fn::Sub': '${Prefix}Subnet${Suffix}'
          NetworkAclId: !Ref
            'Fn::Sub': 'Nacl${Prefix}Subnet'
```

변환된 템플릿은 다음 템플릿과 동일합니다.

```
AWSTemplateFormatVersion: 2010-09-09
Transform: AWS::LanguageExtensions
Resources:
  VPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.0.0.0/16
      EnableDnsSupport: 'true'
      EnableDnsHostnames: 'true'
  NaclTransitSubnet:
    Type: AWS::EC2::NetworkAcl
    Properties:
      VpcId: !Ref VPC
  TransitSubnetA:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC
  NaclTransitSubnetAAssociation:
    Type: AWS::EC2::SubnetNetworkAclAssociation
    Properties:
      SubnetId: !Ref TransitSubnetA
      NetworkAclId: !Ref NaclTransitSubnet
  TransitSubnetB:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC
  NaclTransitSubnetBAssociation:
    Type: AWS::EC2::SubnetNetworkAclAssociation
    Properties:
      SubnetId: !Ref TransitSubnetB
      NetworkAclId: !Ref NaclTransitSubnet
  TransitSubnetC:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC
  NaclTransitSubnetCAssociation:
    Type: AWS::EC2::SubnetNetworkAclAssociation
    Properties:
      SubnetId: !Ref TransitSubnetC
      NetworkAclId: !Ref NaclTransitSubnet
  NaclPublicSubnet:
    Type: AWS::EC2::NetworkAcl
    Properties:
      VpcId: !Ref VPC
  PublicSubnetA:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC
  NaclPublicSubnetAAssociation:
    Type: AWS::EC2::SubnetNetworkAclAssociation
    Properties:
      SubnetId: !Ref PublicSubnetA
      NetworkAclId: !Ref NaclPublicSubnet
  PublicSubnetB:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC
  NaclPublicSubnetBAssociation:
    Type: AWS::EC2::SubnetNetworkAclAssociation
    Properties:
      SubnetId: !Ref PublicSubnetB
      NetworkAclId: !Ref NaclPublicSubnet
  PublicSubnetC:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC
  NaclPublicSubnetCAssociation:
    Type: AWS::EC2::SubnetNetworkAclAssociation
    Properties:
      SubnetId: !Ref PublicSubnetC
      NetworkAclId: !Ref NaclPublicSubnet
```

## Amazon EC2 리소스의 복제 속성 참조
<a name="intrinsic-function-reference-foreach-example-reference-replicated-resource"></a>

이 예제에서는 `Fn::ForEach` 내장 함수를 사용하여 복제된 [AWS::EC2::Instance](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-instance.html) 리소스를 참조합니다.

### JSON
<a name="intrinsic-function-reference-foreach-example-reference-replicated-resource.json"></a>

```
{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Transform": "AWS::LanguageExtensions",
  "Mappings": {
    "Instances": {
      "InstanceType": {
        "B": "m5.4xlarge",
        "C": "c5.2xlarge"
      },
      "ImageId": {"A": "ami-id1"}
    }
  },
  "Resources": {
    "Fn::ForEach::Instances": [
      "Identifier",
      [
        "A",
        "B",
        "C"
      ],
      {
        "Instance${Identifier}": {
          "Type": "AWS::EC2::Instance",
          "Properties": {
            "InstanceType": {"Fn::FindInMap": ["Instances", "InstanceType", {"Ref": "Identifier"}, {"DefaultValue": "m5.xlarge"}]},
            "ImageId": {"Fn::FindInMap": ["Instances", "ImageId", {"Ref": "Identifier"}, {"DefaultValue": "ami-id-default"}]}
          }
        }
      }
    ]
  },
  "Outputs": {
    "SecondInstanceId": {
      "Description": "Instance Id for InstanceB",
      "Value": {"Ref": "InstanceB"}
    },
    "SecondPrivateIp": {
      "Description": "Private IP for InstanceB",
      "Value": {
        "Fn::GetAtt": [
          "InstanceB",
          "PrivateIp"
        ]
      }
    }
  }
}
```

### YAML
<a name="intrinsic-function-reference-foreach-example-reference-replicated-resource.yaml"></a>

```
AWSTemplateFormatVersion: 2010-09-09
Transform: AWS::LanguageExtensions
Mappings:
  Instances:
    InstanceType:
      B: m5.4xlarge
      C: c5.2xlarge
    ImageId:
      A: ami-id1
Resources:
  'Fn::ForEach::Instances':
  - Identifier
  - [A, B, C]
  - 'Instance${Identifier}':
      Type: AWS::EC2::Instance
      Properties:
        InstanceType: !FindInMap [Instances, InstanceType, !Ref 'Identifier', {DefaultValue: m5.xlarge}]
        ImageId: !FindInMap [Instances, ImageId, !Ref 'Identifier', {DefaultValue: ami-id-default}]
Outputs:
  SecondInstanceId:
    Description: Instance Id for InstanceB
    Value: !Ref 'InstanceB'
  SecondPrivateIp:
    Description: Private IP for InstanceB
    Value: !GetAtt [InstanceB, PrivateIp]
```

변환된 템플릿은 다음 템플릿과 동일합니다.

```
AWSTemplateFormatVersion: 2010-09-09
Transform: AWS::LanguageExtensions
Resources:
  InstanceA:
    Type: AWS::EC2::Instance
    Properties:
      InstanceType: m5.xlarge
      ImageId: ami-id1
  InstanceB:
    Type: AWS::EC2::Instance
    Properties:
      InstanceType: m5.4xlarge
      ImageId: ami-id-default
  InstanceC:
    Type: AWS::EC2::Instance
    Properties:
      InstanceType: c5.2xlarge
      ImageId: ami-id-default
Outputs:
  SecondInstanceId:
    Description: Instance Id for InstanceB
    Value: !Ref InstanceB
  SecondPrivateIp:
    Description: Private IP for InstanceB
    Value: !GetAtt [InstanceB, PrivateIp]
```

## Amazon EC2 리소스의 속성 복제
<a name="intrinsic-function-reference-foreach-example-replicate-resource-properties"></a>

이 예제에서는 `Fn::ForEach` 내장 함수를 사용하여 `ImageId`, `InstanceType`, `AvailabilityZone` 같은 일부 속성을 [AWS::EC2::Instance](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-instance.html) 리소스에 반복합니다.

### JSON
<a name="intrinsic-function-reference-foreach-example-replicate-resource-properties.json"></a>

```
{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Transform": "AWS::LanguageExtensions",
  "Mappings": {
    "InstanceA": {
      "Properties": {
        "ImageId": "ami-id1",
        "InstanceType": "m5.xlarge"
      }
    },
    "InstanceB": {
      "Properties": {
        "ImageId": "ami-id2"
      }
    },
    "InstanceC": {
      "Properties": {
        "ImageId": "ami-id3",
        "InstanceType": "m5.2xlarge",
        "AvailabilityZone": "us-east-1a"
      }
    }
  },
  "Resources": {
    "Fn::ForEach::Instances": [
      "InstanceLogicalId",
      [ "InstanceA", "InstanceB", "InstanceC" ],
      {
        "${InstanceLogicalId}": {
          "Type": "AWS::EC2::Instance",
          "Properties": {
            "DisableApiTermination": true,
            "UserData": {
              "Fn::Base64": {
                "Fn::Join": [
                  "",
                  [
                    "#!/bin/bash\n",
                    "yum update -y\n",
                    "yum install -y httpd.x86_64\n",
                    "systemctl start httpd.service\n",
                    "systemctl enable httpd.service\n",
                    "echo \"Hello World from $(hostname -f)\" > /var/www/html/index.html\n"
                  ]
                ]
              }
            },
            "Fn::ForEach::Properties": [
              "PropertyName",
              [ "ImageId", "InstanceType", "AvailabilityZone" ],
              {
                "${PropertyName}": {
                  "Fn::FindInMap": [
                    { "Ref": "InstanceLogicalId" },
                    "Properties",
                    { "Ref": "PropertyName"},
                    {
                      "DefaultValue": { "Ref": "AWS::NoValue" }
                    }
                  ]
                }
              }
            ]
          }
        }
      }
    ]
  }
}
```

### YAML
<a name="intrinsic-function-reference-foreach-example-replicate-resource-properties.yaml"></a>

```
AWSTemplateFormatVersion: 2010-09-09
Transform: AWS::LanguageExtensions
Mappings:
  InstanceA:
    Properties:
      ImageId: ami-id1
      InstanceType: m5.xlarge
  InstanceB:
    Properties:
      ImageId: ami-id2
  InstanceC:
    Properties:
      ImageId: ami-id3
      InstanceType: m5.2xlarge
      AvailabilityZone: us-east-1a
Resources:
  'Fn::ForEach::Instances':
  - InstanceLogicalId
  - [InstanceA, InstanceB, InstanceC]
  - '${InstanceLogicalId}':
      Type: AWS::EC2::Instance
      Properties:
        DisableApiTermination: true
        UserData:
          Fn::Base64: !Sub |
            #!/bin/bash
            yum update -y
            yum install -y httpd.x86_64
            systemctl start httpd.service
            systemctl enable httpd.service
            echo "Hello World from $(hostname -f)" > /var/www/html/index.html
        'Fn::ForEach::Properties':
          - PropertyName
          - [ImageId, InstanceType, AvailabilityZone]
          - '${PropertyName}':
             'Fn::FindInMap':
               - Ref: 'InstanceLogicalId'
               - Properties
               - Ref: 'PropertyName'
               - {DefaultValue: !Ref 'AWS::NoValue'}
```

변환된 템플릿은 다음 템플릿과 동일합니다.

```
AWSTemplateFormatVersion: 2010-09-09
Transform: AWS::LanguageExtensions
Resources:
  InstanceA:
    Type: AWS::EC2::Instance
    Properties:
      DisableApiTermination: true
      UserData:
        Fn::Base64: 
          !Sub |
            #!/bin/bash
            yum update -y
            yum install -y httpd.x86_64
            systemctl start httpd.service
            systemctl enable httpd.service
            echo "Hello World from $(hostname -f)" > /var/www/html/index.html
      ImageId: ami-id1
      InstanceType: m5.xlarge
  InstanceB:
    Type: AWS::EC2::Instance
    Properties:
      DisableApiTermination: true
      UserData:
        Fn::Base64: 
          !Sub |
            #!/bin/bash
            yum update -y
            yum install -y httpd.x86_64
            systemctl start httpd.service
            systemctl enable httpd.service
            echo "Hello World from $(hostname -f)" > /var/www/html/index.html
      ImageId: ami-id2
  InstanceC:
    Type: AWS::EC2::Instance
    Properties:
      DisableApiTermination: true
      UserData:
        Fn::Base64: 
          !Sub |
            #!/bin/bash
            yum update -y
            yum install -y httpd.x86_64
            systemctl start httpd.service
            systemctl enable httpd.service
            echo "Hello World from $(hostname -f)" > /var/www/html/index.html
      ImageId: ami-id3
      InstanceType: m5.2xlarge
      AvailabilityZone: us-east-1a
```

## `Fn::ForEach`의 `Collection` 내에서 영숫자가 아닌 문자 전달
<a name="intrinsic-function-reference-foreach-example-non-alphanumeric"></a>

이 예에서는 `&{}` 구문을 사용하는데, 이를 통해 IP 주소에 있는 영숫자가 아닌 문자(`.` 및 `/`)를 `Collection` 내에서 전달할 수 있습니다.

### JSON
<a name="intrinsic-function-reference-foreach-example-non-alphanumeric-json.json"></a>

```
{
    "AWSTemplateFormatVersion": "2010-09-09",
    "Transform": "AWS::LanguageExtensions",
    "Parameters": {
        "IpAddresses": {
            "Type": "CommaDelimitedList",
            "Default": "10.0.2.0/24,10.0.3.0/24,10.0.4.0/24"
        }
    },
    "Resources": {
        "VPC": {
            "Type": "AWS::EC2::VPC",
            "Properties": {
                "CidrBlock": "10.0.0.0/16",
                "EnableDnsSupport": "true",
                "EnableDnsHostnames": "true"
            }
        },
        "Fn::ForEach::Subnets": [
            "CIDR",
            {
                "Ref": "IpAddresses"
            },
            {
                "Subnet&{CIDR}": {
                    "Type": "AWS::EC2::Subnet",
                    "Properties": {
                        "VpcId": {
                            "Ref": "VPC"
                        },
                        "CidrBlock": {
                            "Ref": "CIDR"
                        }
                    }
                }
            }
        ]
    }
}
```

### YAML
<a name="intrinsic-function-reference-foreach-example-non-alphanumeric-yaml.yaml"></a>

```
AWSTemplateFormatVersion: 2010-09-09
Transform: AWS::LanguageExtensions
Parameters:
  IpAddresses:
    Type: CommaDelimitedList
    Default: '10.0.2.0/24,10.0.3.0/24,10.0.4.0/24'
Resources:
  VPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.0.0.0/16
      EnableDnsSupport: 'true'
      EnableDnsHostnames: 'true'
  'Fn::ForEach::Subnets':
    - CIDR
    - !Ref IpAddresses
    - 'Subnet&{CIDR}':
        Type: AWS::EC2::Subnet
        Properties:
          VpcId: !Ref VPC
          CidrBlock: !Ref CIDR
```

변환된 템플릿은 다음 템플릿과 동일합니다.

```
AWSTemplateFormatVersion: 2010-09-09
Transform: AWS::LanguageExtensions
Parameters:
  IpAddresses:
    Type: CommaDelimitedList
    Default: '10.0.2.0/24,10.0.3.0/24,10.0.4.0/24'
Resources:
  VPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.0.0.0/16
      EnableDnsSupport: 'true'
      EnableDnsHostnames: 'true'
  Subnet1002024:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC
      CidrBlock: 10.0.2.0/24
  Subnet1003024:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC
      CidrBlock: 10.0.3.0/24
  Subnet1004024:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC
      CidrBlock: 10.0.4.0/24
```

# `Outputs` 섹션의 `Fn::ForEach` 예
<a name="intrinsic-function-reference-foreach-example-outputs"></a>

이 예제에서는 `Outputs` 섹션에서 `Fn::ForEach` 내장 함수를 사용하는 방법을 보여줍니다. 이 섹션에 대한 자세한 내용은 *AWS CloudFormation 사용 설명서*의 [출력](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/outputs-section-structure.html)을 참조하세요.

**Topics**
+ [복제된 `AWS::S3::Bucket` 리소스 참조](#intrinsic-function-reference-foreach-example-replicate-outputs)
+ [복제된 `AWS::EC2::Instance` 리소스 참조](#intrinsic-function-reference-foreach-example-replicate-conditions)

## 복제된 `AWS::S3::Bucket` 리소스 참조
<a name="intrinsic-function-reference-foreach-example-replicate-outputs"></a>

이 예제에서는 `Outputs` 섹션의 중첩 `Fn::ForEach` 루프를 사용하여 템플릿 길이를 줄입니다.

### JSON
<a name="intrinsic-function-reference-foreach-example-replicate-outputs.json"></a>

```
{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Transform": "AWS::LanguageExtensions",
  "Resources": {
    "Fn::ForEach::Buckets": [
      "Identifier",
      [ "A", "B", "C" ],
      {
        "S3Bucket${Identifier}": {
          "Type": "AWS::S3::Bucket",
          "Properties": {
            "AccessControl": "PublicRead",
            "MetricsConfigurations": [
              {
                "Id": {"Fn::Sub": "EntireBucket${Identifier}"}
              }
            ],
            "WebsiteConfiguration": {
              "IndexDocument": "index.html",
              "ErrorDocument": "error.html",
              "RoutingRules": [
                {
                  "RoutingRuleCondition": {
                    "HttpErrorCodeReturnedEquals": "404",
                    "KeyPrefixEquals": "out1/"
                  },
                  "RedirectRule": {
                    "HostName": "ec2-11-22-333-44.compute-1.amazonaws.com",
                    "ReplaceKeyPrefixWith": "report-404/"
                  }
                }
              ]
            }
          },
          "DeletionPolicy": "Retain",
          "UpdateReplacePolicy": "Retain"
        }
      }
    ]
  },
  "Outputs": {
    "Fn::ForEach::BucketOutputs": [
      "Identifier",
      [ "A", "B", "C" ],
      {
        "Fn::ForEach::GetAttLoop": [
          "Property",
          [ "Arn", "DomainName", "WebsiteURL" ],
          {
            "S3Bucket${Identifier}${Property}": {
              "Value": {"Fn::GetAtt": [{"Fn::Sub": "S3Bucket${Identifier}"}, {"Ref": "Property"}]}
            }
          }
        ]
      }
    ]
  }
}
```

### YAML
<a name="intrinsic-function-reference-foreach-example-outputs.yaml"></a>

```
AWSTemplateFormatVersion: 2010-09-09
Transform: AWS::LanguageExtensions
Resources:
  'Fn::ForEach::Buckets':
    - Identifier
    - [A, B, C]
    - 'S3Bucket${Identifier}':
        Type: AWS::S3::Bucket
        Properties:
          AccessControl: PublicRead
          MetricsConfigurations:
            - Id: !Sub 'EntireBucket${Identifier}'
          WebsiteConfiguration:
            IndexDocument: index.html
            ErrorDocument: error.html
            RoutingRules:
              - RoutingRuleCondition:
                  HttpErrorCodeReturnedEquals: '404'
                  KeyPrefixEquals: out1/
                RedirectRule:
                  HostName: ec2-11-22-333-44.compute-1.amazonaws.com
                  ReplaceKeyPrefixWith: report-404/
        DeletionPolicy: Retain
        UpdateReplacePolicy: Retain
Outputs:
  'Fn::ForEach::BucketOutputs':
    - Identifier
    - [A, B, C]
    - 'Fn::ForEach::GetAttLoop':
        - Property
        - [Arn, DomainName, WebsiteURL]
        - 'S3Bucket${Identifier}${Property}':
            Value: !GetAtt [!Sub 'S3Bucket${Identifier}', !Ref Property]
```

변환된 템플릿은 다음 템플릿과 동일합니다.

```
AWSTemplateFormatVersion: 2010-09-09
Transform: AWS::LanguageExtensions
Resources:
  S3BucketA:
    Type: AWS::S3::Bucket
    Properties:
      AccessControl: PublicRead
      MetricsConfigurations:
        - Id: EntireBucketA
      WebsiteConfiguration:
        IndexDocument: index.html
        ErrorDocument: error.html
        RoutingRules:
          - RoutingRuleCondition:
              HttpErrorCodeReturnedEquals: '404'
              KeyPrefixEquals: out1/
            RedirectRule:
              HostName: ec2-11-22-333-44.compute-1.amazonaws.com
              ReplaceKeyPrefixWith: report-404/
    DeletionPolicy: Retain
    UpdateReplacePolicy: Retain
  S3BucketB:
    Type: AWS::S3::Bucket
    Properties:
      AccessControl: PublicRead
      MetricsConfigurations:
        - Id: EntireBucketB
      WebsiteConfiguration:
        IndexDocument: index.html
        ErrorDocument: error.html
        RoutingRules:
          - RoutingRuleCondition:
              HttpErrorCodeReturnedEquals: '404'
              KeyPrefixEquals: out1/
            RedirectRule:
              HostName: ec2-11-22-333-44.compute-1.amazonaws.com
              ReplaceKeyPrefixWith: report-404/
    DeletionPolicy: Retain
    UpdateReplacePolicy: Retain
  S3BucketC:
    Type: AWS::S3::Bucket
    Properties:
      AccessControl: PublicRead
      MetricsConfigurations:
        - Id: EntireBucketC
      WebsiteConfiguration:
        IndexDocument: index.html
        ErrorDocument: error.html
        RoutingRules:
          - RoutingRuleCondition:
              HttpErrorCodeReturnedEquals: '404'
              KeyPrefixEquals: out1/
            RedirectRule:
              HostName: ec2-11-22-333-44.compute-1.amazonaws.com
              ReplaceKeyPrefixWith: report-404/
    DeletionPolicy: Retain
    UpdateReplacePolicy: Retain
Outputs:
  S3BucketAArn:
    Value: !GetAtt [S3BucketA, Arn]
  S3BucketADomainName:
    Value: !GetAtt [S3BucketA, DomainName]
  S3BucketAWebsiteURL:
    Value: !GetAtt [S3BucketA, WebsiteURL]
  S3BucketBArn:
    Value: !GetAtt [S3BucketB, Arn]
  S3BucketBDomainName:
    Value: !GetAtt [S3BucketB, DomainName]
  S3BucketBWebsiteURL:
    Value: !GetAtt [S3BucketB, WebsiteURL]
  S3BucketCArn:
    Value: !GetAtt [S3BucketC, Arn]
  S3BucketCDomainName:
    Value: !GetAtt [S3BucketC, DomainName]
  S3BucketCWebsiteURL:
    Value: !GetAtt [S3BucketC, WebsiteURL]
```

## 복제된 `AWS::EC2::Instance` 리소스 참조
<a name="intrinsic-function-reference-foreach-example-replicate-conditions"></a>

이 예제에서는 생성된 논리적 ID를 사용하여 `Resources` 섹션에서 복제된 리소스를 참조합니다.

### JSON
<a name="intrinsic-function-reference-foreach-example-replicate-conditions.json"></a>

```
{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Transform": "AWS::LanguageExtensions",
  "Mappings": {
    "Instances": {
      "InstanceType": {
        "B": "m5.4xlarge",
        "C": "c5.2xlarge"
      },
      "ImageId": {"A": "ami-id1"}
    }
  },
  "Resources": {
    "Fn::ForEach::Instances": [
      "Identifier",
      [ "A", "B", "C" ],
      {
        "Instance${Identifier}": {
          "Type": "AWS::EC2::Instance",
          "Properties": {
            "InstanceType": {"Fn::FindInMap": ["Instances", "InstanceType", {"Ref": "Identifier"}, {"DefaultValue": "m5.xlarge"}]},
            "ImageId": {"Fn::FindInMap": ["Instances", "ImageId", {"Ref": "Identifier"}, {"DefaultValue": "ami-id-default"}]}
          }
        }
      }
    ]
  },
  "Outputs": {
    "SecondInstanceId": {
      "Description": "Instance Id for InstanceB",
      "Value": {"Ref": "InstanceB"}
    },
    "SecondPrivateIp": {
      "Description": "Private IP for InstanceB",
      "Value": {
        "Fn::GetAtt": [
          "InstanceB",
          "PrivateIp"
        ]
      }
    }
  }
}
```

### YAML
<a name="intrinsic-function-reference-foreach-example-replicate-conditions.yaml"></a>

```
AWSTemplateFormatVersion: 2010-09-09
Transform: AWS::LanguageExtensions
Mappings:
  Instances:
    InstanceType:
      B: m5.4xlarge
      C: c5.2xlarge
    ImageId:
      A: ami-id1
Resources:
  'Fn::ForEach::Instances':
    - Identifier
    - [A, B, C]
    - 'Instance${Identifier}':
        Type: AWS::EC2::Instance
        Properties:
          InstanceType: !FindInMap [Instances, InstanceType, !Ref Identifier, DefaultValue: m5.xlarge]
          ImageId: !FindInMap [Instances, ImageId, !Ref Identifier, DefaultValue: ami-id-default]
Outputs:
  SecondInstanceId:
    Description: Instance Id for InstanceB
    Value: !Ref InstanceB
  SecondPrivateIp:
    Description: Private IP for InstanceB
    Value: !GetAtt [InstanceB, PrivateIp]
```

변환된 템플릿은 다음 템플릿과 동일합니다.

```
AWSTemplateFormatVersion: 2010-09-09
Transform: AWS::LanguageExtensions
Resources:
  InstanceA:
    Type: AWS::EC2::Instance
    Properties:
      InstanceType: m5.xlarge
      ImageId: ami-id1
  InstanceB:
    Type: AWS::EC2::Instance
    Properties:
      InstanceType: m5.4xlarge
      ImageId: ami-id-default
  InstanceC:
    Type: AWS::EC2::Instance
    Properties:
      InstanceType: c5.2xlarge
      ImageId: ami-id-default
Outputs:
  SecondInstanceId:
    Description: Instance Id for InstanceB
    Value: !Ref InstanceB
  SecondPrivateIp:
    Description: Private IP for InstanceB
    Value: !GetAtt [InstanceB, PrivateIp]
```

# `Conditions` 섹션의 `Fn::ForEach` 예
<a name="intrinsic-function-reference-foreach-example-conditions"></a>

이 예제에서는 `Conditions` 섹션에서 `Fn::ForEach` 내장 함수를 사용하는 방법을 보여줍니다. 이 섹션에 대한 자세한 내용은 *AWS CloudFormation 사용 설명서*의 [조건](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/conditions-section-structure.html)을 참조하세요.

**중요**  
`Conditions`는 두 번째 혹은 그 이후의 속성으로 나열되어야 합니다. `Conditions`가 `Fn::ForEach`의 템플릿 조각 파라미터 내에 나열된 첫 번째 속성이면 스택 생성이 실패합니다.

```
Resources:
  'Fn::ForEach::Topics':
    - LogicalId
    - !Ref TopicList
    - '${LogicalId}':
        Condition: !Sub 'TopicCondition${LogicalId}'
        Type: AWS::SNS::Topic
        Properties:
          TopicName: !Sub 'My${LogicalId}'
```

`Conditions`를 두 번째 혹은 그 이후의 키로 추가해야 스택 생성에 성공합니다.

```
Resources:
  'Fn::ForEach::Topics':
    - LogicalId
    - !Ref TopicList
    - '${LogicalId}':
        Type: AWS::SNS::Topic
        Condition: !Sub 'TopicCondition${LogicalId}'
        Properties:
          TopicName: !Sub 'My${LogicalId}'
```

**Topics**
+ [단일 조건 복제](#intrinsic-function-reference-foreach-example-replicated-single-condition)

## 단일 조건 복제
<a name="intrinsic-function-reference-foreach-example-replicated-single-condition"></a>

이 예제에서는 `Conditions` 섹션의 `Fn::ForEach` 내장 함수를 사용하여 속성이 다른 유사한 여러 조건을 복제합니다.

### JSON
<a name="intrinsic-function-reference-foreach-example-conditions.json"></a>

```
{
    "AWSTemplateFormatVersion": "2010-09-09",
    "Transform": "AWS::LanguageExtensions",
    "Parameters": {
        "ParamA": {
            "Type": "String",
            "AllowedValues": [
                "true",
                "false"
            ]
        },
        "ParamB": {
            "Type": "String",
            "AllowedValues": [
                "true",
                "false"
            ]
        },
        "ParamC": {
            "Type": "String",
            "AllowedValues": [
                "true",
                "false"
            ]
        },
        "ParamD": {
            "Type": "String",
            "AllowedValues": [
                "true",
                "false"
            ]
        }
    },
    "Conditions": {
        "Fn::ForEach::CheckTrue": [
            "Identifier",
            ["A", "B", "C", "D"],
            {
                "IsParam${Identifier}Enabled": {
                    "Fn::Equals": [
                        {"Ref": {"Fn::Sub": "Param${Identifier}"}},
                        "true"
                    ]
                }
            }
        ]
    },
    "Resources": {
        "WaitConditionHandle": {
            "Type": "AWS::CloudFormation::WaitConditionHandle"
        }
    }
}
```

### YAML
<a name="intrinsic-function-reference-foreach-example-conditions.yaml"></a>

```
AWSTemplateFormatVersion: 2010-09-09
Transform: AWS::LanguageExtensions
Parameters:
  ParamA:
    Type: String
    AllowedValues:
      - 'true'
      - 'false'
  ParamB:
    Type: String
    AllowedValues:
      - 'true'
      - 'false'
  ParamC:
    Type: String
    AllowedValues:
      - 'true'
      - 'false'
  ParamD:
    Type: String
    AllowedValues:
      - 'true'
      - 'false'
Conditions:
  'Fn::ForEach::CheckTrue':
    - Identifier
    - [A, B, C, D]
    - 'IsParam${Identifier}Enabled': !Equals 
        - !Ref 
          'Fn::Sub': 'Param${Identifier}'
        - 'true'
Resources:
  WaitConditionHandle:
    Type: AWS::CloudFormation::WaitConditionHandle
```

변환된 템플릿은 다음 템플릿과 동일합니다.

```
AWSTemplateFormatVersion: 2010-09-09
Parameters:
  ParamA:
    Type: String
    AllowedValues:
      - 'true'
      - 'false'
  ParamB:
    Type: String
    AllowedValues:
      - 'true'
      - 'false'
  ParamC:
    Type: String
    AllowedValues:
      - 'true'
      - 'false'
  ParamD:
    Type: String
    AllowedValues:
      - 'true'
      - 'false'
Conditions:
  IsParamAEnabled: !Equals 
    - !Ref ParamA
    - 'true'
  IsParamBEnabled: !Equals 
    - !Ref ParamB
    - 'true'
  IsParamCEnabled: !Equals 
    - !Ref ParamC
    - 'true'
  IsParamDEnabled: !Equals 
    - !Ref ParamD
    - 'true'
Resources:
  WaitConditionHandle:
    Type: AWS::CloudFormation::WaitConditionHandle
```

# `Fn::GetAtt`
<a name="intrinsic-function-reference-getatt"></a>

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

## 선언
<a name="getatt-declaration"></a>

### JSON
<a name="intrinsic-function-reference-getatt-syntax.json"></a>

```
{ "Fn::GetAtt" : [ "logicalNameOfResource", "attributeName" ] }
```

### YAML
<a name="intrinsic-function-reference-getatt-syntax.yaml"></a>

전체 함수 이름의 구문:

```
Fn::GetAtt: [ logicalNameOfResource, attributeName ]
```

짧은 형식의 구문:

```
!GetAtt logicalNameOfResource.attributeName
```

## 파라미터
<a name="getatt-parameters"></a>

`logicalNameOfResource`  
원하는 속성을 포함하는 리소스의 논리적 이름(*논리적 ID*라고도 함)입니다.

`attributeName`  
값을 가져올 리소스 관련 속성의 이름입니다. 리소스 유형에 대해 사용 가능한 속성에 대한 자세한 내용은 리소스의 참조 페이지를 참조하십시오.

## 반환 값
<a name="intrinsic-function-reference-getatt-return"></a>

속성 값입니다. 리소스의 `GetAtt` 반환 값에 대한 자세한 내용은 [리소스 및 속성 참조](aws-template-resource-type-ref.md)의 리소스에 대한 설명서를 참조하세요.

## 예제
<a name="intrinsic-function-reference-getatt-examples"></a>

### 속성 값 반환
<a name="intrinsic-function-reference-getatt-example"></a>

다음 예제에서는 논리명이 `myELB`인 로드 밸런서의 DNS 이름을 포함하는 문자열을 반환합니다.

#### JSON
<a name="intrinsic-function-reference-getatt-example.json"></a>

```
"Fn::GetAtt" : [ "myELB" , "DNSName" ]
```

#### YAML
<a name="intrinsic-function-reference-getatt-example.yaml"></a>

```
!GetAtt myELB.DNSName
```

#### 여러 속성 값 반환
<a name="intrinsic-function-reference-getatt-example2"></a>

다음 예제에서는 논리명이 `myELB`인 로드 밸런서의 `SourceSecurityGroup.OwnerAlias` 및 `SourceSecurityGroup.GroupName`을 반환합니다.

##### JSON
<a name="intrinsic-function-reference-getatt-example2.json"></a>

```
{
    "AWSTemplateFormatVersion": "2010-09-09",
    "Resources": {
        "myELB": {
            "Type": "AWS::ElasticLoadBalancing::LoadBalancer",
            "Properties": {
                "AvailabilityZones": [
                    "eu-west-1a"
                ],
                "Listeners": [
                    {
                        "LoadBalancerPort": "80",
                        "InstancePort": "80",
                        "Protocol": "HTTP"
                    }
                ]
            }
        },
        "myELBIngressGroup": {
            "Type": "AWS::EC2::SecurityGroup",
            "Properties": {
                "GroupDescription": "ELB ingress group",
                "SecurityGroupIngress": [
                    {
                        "IpProtocol": "tcp",
                        "FromPort": 80,
                        "ToPort": 80,
                        "SourceSecurityGroupOwnerId": {
                            "Fn::GetAtt": [
                                "myELB",
                                "SourceSecurityGroup.OwnerAlias"
                            ]
                        },
                        "SourceSecurityGroupName": {
                            "Fn::GetAtt": [
                                "myELB",
                                "SourceSecurityGroup.GroupName"
                            ]
                        }
                    }
                ]
            }
        }
    }
}
```

##### YAML
<a name="intrinsic-function-reference-getatt-example2.yaml"></a>

```
AWSTemplateFormatVersion: 2010-09-09
Resources:
  myELB:
    Type: AWS::ElasticLoadBalancing::LoadBalancer
    Properties:
      AvailabilityZones:
        - eu-west-1a
      Listeners:
        - LoadBalancerPort: '80'
          InstancePort: '80'
          Protocol: HTTP
  myELBIngressGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: ELB ingress group
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 80
          ToPort: 80
          SourceSecurityGroupOwnerId: !GetAtt myELB.SourceSecurityGroup.OwnerAlias
          SourceSecurityGroupName: !GetAtt myELB.SourceSecurityGroup.GroupName
```

#### `Fn::GetAtt` 함수 내부에서 `Fn::Sub` 사용
<a name="intrinsic-function-reference-getatt-foreach"></a>

**참고**  
`AWS::LanguageExtensions` 변환을 사용하는 경우 다른 내장 함수와 함께 `Fn::GetAtt`를 사용할 수 있습니다. 지원되는 함수는 [지원되는 함수](#getatt-supported-functions) 섹션을 참조하세요.

다음 예제는 템플릿의 `Outputs` 섹션에서 [`Fn::ForEach`](intrinsic-function-reference-foreach.md)와 함께 `Fn::GetAtt`를 [`Fn::Sub`](intrinsic-function-reference-sub.md)에서 사용하여 템플릿의 길이와 세부 사항을 줄이는 방법을 보여줍니다. `Fn::GetAtt`에서 `Fn::Sub`를 사용하면 `Fn::ForEach` 직접 호출이 반복될 때마다 다른 버킷을 참조할 수 있는 하나의 내장 함수를 템플릿에 포함할 수 있습니다.

##### JSON
<a name="intrinsic-function-reference-getatt-foreach.json"></a>

```
{
    "AWSTemplateFormatVersion": "2010-09-09",
    "Transform": "AWS::LanguageExtensions",
    "Mappings": {
        "Buckets": {
            "Properties": {
                "Identifiers": ["A", "B", "C"]
            }
        }
    },
    "Resources": {
        "Fn::ForEach::Buckets": [
            "Identifier",
            {"Fn::FindInMap": ["Buckets", "Properties", "Identifiers"]},
            {
                "S3Bucket${Identifier}": {
                    "Type": "AWS::S3::Bucket",
                    "Properties": {
                        "AccessControl": "PublicRead",
                        "MetricsConfigurations": [
                            {
                                "Id": {"Fn::Sub": "EntireBucket${Identifier}"}
                            }
                        ],
                        "WebsiteConfiguration": {
                            "IndexDocument": "index.html",
                            "ErrorDocument": "error.html",
                            "RoutingRules": [
                                {
                                    "RoutingRuleCondition": {
                                        "HttpErrorCodeReturnedEquals": "404",
                                        "KeyPrefixEquals": "out1/"
                                    },
                                    "RedirectRule": {
                                        "HostName": "ec2-11-22-333-44.compute-1.amazonaws.com",
                                        "ReplaceKeyPrefixWith": "report-404/"
                                    }
                                }
                            ]
                        }
                    },
                    "DeletionPolicy": "Retain",
                    "UpdateReplacePolicy": "Retain"
                }
            }
        ]
    },
    "Outputs": {
        "Fn::ForEach::BucketOutputs": [
            "Identifier",
            {"Fn::FindInMap": ["Buckets", "Properties", "Identifiers"]},
            {
                "Fn::ForEach::GetAttLoop": [
                    "Property",
                    ["Arn", "DomainName", "WebsiteURL"],
                    {
                        "S3Bucket${Identifier}${Property}": {
                            "Value": {
                                "Fn::GetAtt": [{"Fn::Sub": "S3Bucket${Identifier}"}, {"Ref": "Property"}]
                            }
                        }
                    }
                ]
            }
        ]
    }
}
```

##### YAML
<a name="intrinsic-function-reference-getatt-foreach.yaml"></a>

```
AWSTemplateFormatVersion: 2010-09-09
Transform: AWS::LanguageExtensions
Mappings:
  Buckets:
    Properties:
      Identifiers:
        - A
        - B
        - C
Resources:
  'Fn::ForEach::Buckets':
    - Identifier
    - Fn::FindInMap: 
      - Buckets
      - Properties
      - Identifiers
    - 'S3Bucket${Identifier}':
        Type: AWS::S3::Bucket
        Properties:
          AccessControl: PublicRead
          MetricsConfigurations:
            - Id: 
                Fn::Sub: 'EntireBucket${Identifier}'
          WebsiteConfiguration:
            IndexDocument: index.html
            ErrorDocument: error.html
            RoutingRules:
              - RoutingRuleCondition:
                  HttpErrorCodeReturnedEquals: '404'
                  KeyPrefixEquals: out1/
                RedirectRule:
                  HostName: ec2-11-22-333-44.compute-1.amazonaws.com
                  ReplaceKeyPrefixWith: report-404/
        DeletionPolicy: Retain
        UpdateReplacePolicy: Retain
Outputs:
  'Fn::ForEach::BucketOutputs':
    - Identifier
    - Fn::FindInMap:
      - Buckets
      - Properties
      - Identifiers
    - 'Fn::ForEach::GetAttLoop':
        - Property
        - - Arn
          - DomainName
          - WebsiteURL
        - 'S3Bucket${Identifier}${Property}':
            Value: !GetAtt 
              - !Sub 'S3Bucket${Identifier}'
              - !Ref Property
```

## 지원되는 함수
<a name="getatt-supported-functions"></a>

[AWS::LanguageExtensions 변환](transform-aws-languageextensions.md)을 사용하는 경우 `Fn::GetAtt` 함수 내에서 다음 함수를 사용할 수 있습니다. `Fn::GetAtt` 논리적 리소스 이름 또는 `Fn::GetAtt` 속성 이름에 해당됩니다.
+ [`Fn::Base64`](intrinsic-function-reference-base64.md)
+ [`Fn::FindInMap`](intrinsic-function-reference-findinmap.md)
+ [`Fn::If`](intrinsic-function-reference-conditions.md#intrinsic-function-reference-conditions-if)
+ [`Fn::Join`](intrinsic-function-reference-join.md)
+ [`Fn::Sub`](intrinsic-function-reference-sub.md)
+ [`Fn::ToJsonString`](intrinsic-function-reference-ToJsonString.md)
+ [`Ref`](intrinsic-function-reference-ref.md)

`AWS::LanguageExtensions` 변환이 사용되지 않는 경우:
+ `Fn::GetAtt` 속성 이름에서는 [`Ref`](intrinsic-function-reference-ref.md) 함수를 사용할 수 있습니다.
+ `Fn::GetAtt` 논리적 리소스 이름에는 함수를 사용할 수 없습니다. 리소스의 논리적 ID인 문자열을 지정해야 합니다.

# `Fn::GetAZs`
<a name="intrinsic-function-reference-getavailabilityzones"></a>

`Fn::GetAZs` 내장 함수는 지정된 리전의 가용 영역을 알파벳순으로 나열하는 배열을 반환합니다. 고객이 다른 가용 영역에 액세스할 수 있으므로 템플릿 작성자는 `Fn::GetAZs` 내장 함수를 사용하여 호출하는 사용자의 액세스 권한에 따라 조정되는 템플릿을 작성할 수 있습니다. 그러면 지정된 리전에 대한 전체 가용 영역 목록을 하드 코딩할 필요가 없습니다.

**중요**  
`Fn::GetAZs` 함수는 기본 서브넷을 포함하는 가용 영역만 반환합니다. 기본 서브넷을 포함하는 가용 영역이 없을 경우 모든 가용 영역이 반환됩니다.  
`describe-availability-zones` AWS CLI 명령의 응답과 마찬가지로 `Fn::GetAZs` 함수에서 반환되는 결과의 순서는 보장되지 않으며 새 가용 영역이 추가되면 변경될 수 있습니다.

IAM 권한

`Fn::GetAZs` 함수를 사용하기 위해 필요한 권한은 Amazon EC2 인스턴스를 시작하는 플랫폼에 따라 다릅니다. 두 플랫폼 모두 Amazon EC2 `DescribeAvailabilityZones` 및 `DescribeAccountAttributes` 작업에 대한 권한이 필요합니다. EC2-VPC의 경우 Amazon EC2 `DescribeSubnets` 작업에 대한 권한도 필요합니다.

## 선언
<a name="intrinsic-function-reference-getazs-declaration"></a>

### JSON
<a name="intrinsic-function-reference-getazs-syntax.json"></a>

```
{ "Fn::GetAZs" : "리전" }
```

### YAML
<a name="intrinsic-function-reference-getazs-syntax.yaml"></a>

전체 함수 이름의 구문:

```
Fn::GetAZs: 리전
```

짧은 형식의 구문:

```
!GetAZs 리전
```

## 파라미터
<a name="intrinsic-function-reference-getazs-parameters"></a>

리전  <a name="region"></a>
가용 영역을 가져올 리전의 이름입니다.  
`AWS::Region` 가상 파라미터를 사용하여 스택이 생성되는 리전을 지정할 수 있습니다. 빈 문자열을 지정하면 `AWS::Region`을 지정하는 것과 같습니다.

## 반환 값
<a name="intrinsic-function-reference-getazs-return-value"></a>

리전에 대한 가용 영역 목록입니다.

## 예제
<a name="intrinsic-function-reference-getazs-examples"></a>

### 리전 평가
<a name="intrinsic-function-reference-getazs-examples-evaluate-region"></a>

이 예에서 CloudFormation은 사용자가 `us-east-1` 리전에 스택을 생성한 것으로 가정하고 `Fn::GetAZs`를 다음 배열로 평가합니다.

`[ "us-east-1a", "us-east-1b", "us-east-1c", "us-east-1d", "us-east-1e" ]`

#### JSON
<a name="intrinsic-function-reference-getazs-example1.json"></a>

```
1. { "Fn::GetAZs" : "" }
2. { "Fn::GetAZs" : { "Ref" : "AWS::Region" } }
3. { "Fn::GetAZs" : "us-east-1" }
```

#### YAML
<a name="intrinsic-function-reference-getazs-example1.yaml"></a>

```
1. Fn::GetAZs: ""
2. Fn::GetAZs:
3.   Ref: "AWS::Region"
4. Fn::GetAZs: us-east-1
```

 

### 서브넷의 가용 영역 지정
<a name="intrinsic-function-reference-getazs-examples-subnet-az"></a>

다음 예에서는 `Fn::GetAZs`를 사용하여 서브넷의 가용 영역을 지정합니다.

#### JSON
<a name="intrinsic-function-reference-getazs-example.json"></a>

```
"mySubnet" : {
  "Type" : "AWS::EC2::Subnet",
  "Properties" : {
    "VpcId" : { 
      "Ref" : "VPC"   
    },
    "CidrBlock" : "10.0.0.0/24",
    "AvailabilityZone" : {
      "Fn::Select" : [ 
        0, 
        { 
          "Fn::GetAZs" : "" 
        } 
      ]
    }
  }
}
```

#### YAML
<a name="intrinsic-function-reference-getazs-example.yaml"></a>

```
mySubnet: 
  Type: AWS::EC2::Subnet
  Properties: 
    VpcId: 
      !Ref VPC
    CidrBlock: 10.0.0.0/24
    AvailabilityZone: 
      Fn::Select: 
        - 0
        - Fn::GetAZs: ""
```

 

### 짧은 형식의 YAML을 가진 중첩 함수
<a name="intrinsic-function-reference-getazs-examples-nested-functions"></a>

다음 예제는 짧은 형식의 YAML을 사용하여 중첩 내장 함수를 사용하는 데 유효한 패턴을 보여 줍니다. 짧은 형식 함수를 연속적으로 중첩할 수 없기 때문에 `!GetAZs !Ref` 같은 패턴은 유효하지 않습니다.

#### YAML
<a name="intrinsic-function-reference-getavailabilityzones-example3.yaml"></a>

```
1. AvailabilityZone: !Select
2.   - 0
3.   - !GetAZs
4.     Ref: 'AWS::Region'
```

#### YAML
<a name="intrinsic-function-reference-getavailabilityzones-example4.yaml"></a>

```
1. AvailabilityZone: !Select
2.   - 0
3.   - Fn::GetAZs: !Ref 'AWS::Region'
```

## 지원되는 함수
<a name="intrinsic-function-reference-getazs-supported-functions"></a>

`Ref` 함수 내에서 `Fn::GetAZs` 함수를 사용할 수 있습니다.

# `Fn::ImportValue`
<a name="intrinsic-function-reference-importvalue"></a>

내장 함수 `Fn::ImportValue`는 다른 스택에서 내보낸 출력의 값을 반환합니다. 일반적으로 이 함수를 사용하여 교차 스택 참조를 생성합니다. 자세한 내용은 *AWS CloudFormation 사용 설명서*의 [다른 CloudFormation 스택의 리소스 출력 참조](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/walkthrough-crossstackref.html) 섹션을 참조하세요.

다음 예제 템플릿 조각에서 스택 A는 VPC 보안 그룹 값을 내보내고 스택 B는 이 값을 가져옵니다.

**참고**  
교차 스택 참조에 적용되는 제한은 다음과 같습니다.  
각 AWS 계정의 `Export` 이름은 한 리전 내에서 고유해야 합니다.
여러 리전 간에 교차 스택 참조를 생성할 수 없습니다. `Fn::ImportValue` 내장 함수는 동일 리전 안에서 내보냈던 값을 가져오는 데만 사용할 수 있습니다.
출력의 경우, 리소스에 의존하는 `Name` 또는 `Export` 함수를 `Ref`의 `GetAtt` 속성값으로 사용할 수 없습니다.  
마찬가지로 `ImportValue` 함수는 리소스에 의존하는 `Ref` 또는 `GetAtt` 함수를 포함할 수 없습니다.
다른 스택이 출력 값을 가져오면 출력값을 내보내는 스택을 삭제하거나 내보낸 출력 값을 수정할 수 없습니다. 따라서 내보내는 스택을 삭제하거나 출력값을 수정하려면 가져오기를 모두 제거해야 합니다.

## JSON
<a name="intrinsic-function-reference-importvalue-export.json"></a>

스택 A 내보내기

```
"Outputs" : {
  "PublicSubnet" : {
    "Description" : "The subnet ID to use for public web servers",
    "Value" :  { "Ref" : "PublicSubnet" },
    "Export" : { "Name" : {"Fn::Sub": "${AWS::StackName}-SubnetID" }}
  },
  "WebServerSecurityGroup" : {
    "Description" : "The security group ID to use for public web servers",
    "Value" :  { "Fn::GetAtt" : ["WebServerSecurityGroup", "GroupId"] },
    "Export" : { "Name" : {"Fn::Sub": "${AWS::StackName}-SecurityGroupID" }}
  }
}
```

## YAML
<a name="intrinsic-function-reference-importvalue-export.yaml"></a>

스택 A 내보내기

```
Outputs:
  PublicSubnet:
    Description: The subnet ID to use for public web servers
    Value:
      Ref: PublicSubnet
    Export:
      Name:
        'Fn::Sub': '${AWS::StackName}-SubnetID'
  WebServerSecurityGroup:
    Description: The security group ID to use for public web servers
    Value:
      'Fn::GetAtt':
        - WebServerSecurityGroup
        - GroupId
    Export:
      Name:
        'Fn::Sub': '${AWS::StackName}-SecurityGroupID'
```

## JSON
<a name="intrinsic-function-reference-importvalue-import.json"></a>

스택 B 가져오기

```
"Resources" : {
  "WebServerInstance" : {
    "Type" : "AWS::EC2::Instance",
    "Properties" : {
      "InstanceType" : "t2.micro",
      "ImageId" : "ami-a1b23456",
      "NetworkInterfaces" : [{
        "GroupSet" : [{"Fn::ImportValue" : {"Fn::Sub" : "${NetworkStackNameParameter}-SecurityGroupID"}}],
        "AssociatePublicIpAddress" : "true",
        "DeviceIndex" : "0",
        "DeleteOnTermination" : "true",
        "SubnetId" : {"Fn::ImportValue" : {"Fn::Sub" : "${NetworkStackNameParameter}-SubnetID"}}
      }]
    }
  }
}
```

## YAML
<a name="intrinsic-function-reference-importvalue-import.yaml"></a>

스택 B 가져오기

```
Resources:
  WebServerInstance:
    Type: AWS::EC2::Instance
    Properties:
      InstanceType: t2.micro
      ImageId: ami-a1b23456
      NetworkInterfaces:
        - GroupSet:
            - Fn::ImportValue: 
              'Fn::Sub': '${NetworkStackNameParameter}-SecurityGroupID'
          AssociatePublicIpAddress: 'true'
          DeviceIndex: '0'
          DeleteOnTermination: 'true'
          SubnetId: Fn::ImportValue: 
            'Fn::Sub': '${NetworkStackNameParameter}-SubnetID'
```

## 선언
<a name="w2aac24c43c11"></a>

### JSON
<a name="intrinsic-function-reference-importvalue-syntax.json"></a>

```
{ "Fn::ImportValue" : sharedValueToImport }
```

### YAML
<a name="intrinsic-function-reference-importvalue-syntax.yaml"></a>

전체 함수 이름을 사용할 수 있습니다.

```
Fn::ImportValue: sharedValueToImport
```

또는 짧은 형식을 사용할 수 있습니다.

```
!ImportValue sharedValueToImport
```

**중요**  
`!Sub`의 짧은 형식이 포함되면 `!ImportValue`의 짧은 형식을 사용할 수 없습니다.  

```
# do not use
!ImportValue
  !Sub '${NetworkStack}-SubnetID'
```
대신, 다음과 같은 전체 함수 이름을 사용해야 합니다.  

```
Fn::ImportValue:
  !Sub "${NetworkStack}-SubnetID"
```

## Parameters
<a name="w2aac24c43c13"></a>

sharedValueToImport  
가져올 스택 출력 값입니다.

## 반환 값
<a name="w2aac24c43c15"></a>

스택 출력 값입니다.

## 예제
<a name="w2aac24c43c17"></a>

### JSON
<a name="intrinsic-function-reference-importvalue-example.json"></a>

```
{ "Fn::ImportValue" : {"Fn::Sub": "${NetworkStackNameParameter}-SubnetID" } }
```

### YAML
<a name="intrinsic-function-reference-importvalue-example.yaml"></a>

```
Fn::ImportValue:
  !Sub "${NetworkStackName}-SecurityGroupID"
```

## 지원되는 함수
<a name="w2aac24c43c19"></a>

`Fn::ImportValue` 함수에서 다음과 같은 함수를 사용할 수 있습니다. 이러한 함수의 값은 리소스에 의존할 수 없습니다.
+ `Fn::Base64`
+ `Fn::FindInMap`
+ `Fn::If`
+ `Fn::Join`
+ `Fn::Select`
+ `Fn::Sub`
+ `Ref`

# `Fn::Join`
<a name="intrinsic-function-reference-join"></a>

내장 함수 `Fn::Join`은 지정된 구분 기호로 구분된 값 세트를 단일 값에 추가합니다. 구분 기호가 빈 문자열이면 값 세트는 구분 기호 없이 연결됩니다.

## 선언
<a name="w2aac24c48b5"></a>

### JSON
<a name="intrinsic-function-reference-join-syntax.json"></a>

```
{ "Fn::Join" : [ "delimiter", [ comma-delimited list of values ] ] }
```

### YAML
<a name="intrinsic-function-reference-join-syntax.yaml"></a>

전체 함수 이름의 구문:

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

짧은 형식의 구문:

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

## 파라미터
<a name="intrinsic-function-reference-join-parameters"></a>

delimiter  
조각 두 개 사이에서 발생하길 원하는 값. 구분 기호는 조각 사이에서만 발생하고 최종 값을 종료하지 않습니다.

ListOfValues  
결합하려는 값 목록

## 반환 값
<a name="intrinsic-function-reference-join-returnvalues"></a>

결합된 문자열

## 예제
<a name="intrinsic-function-reference-join-examples"></a>

### 간단한 문자열 배열 연결
<a name="intrinsic-function-reference-join-example1"></a>

다음 예제는 `"a:b:c"`를 반환합니다.

#### JSON
<a name="intrinsic-function-reference-join-example1.json"></a>

```
"Fn::Join" : [ ":", [ "a", "b", "c" ] ]
```

#### YAML
<a name="intrinsic-function-reference-join-example1.yaml"></a>

```
!Join [ ":", [ a, b, c ] ]
```

### 파라미터와 함께 Ref 함수를 사용하여 연결
<a name="intrinsic-function-reference-join-example2"></a>

다음 예제는 `Fn::Join`을 사용하여 문자열 값을 생성합니다. 이는 `Ref` 파라미터 및 `AWS::Partition` 가상 파라미터와 함께 `AWS::AccountId` 함수를 사용합니다.

#### JSON
<a name="intrinsic-function-reference-join-example2.json"></a>

```
{
  "Fn::Join": [
    "", [
      "arn:",
      {
        "Ref": "AWS::Partition"
      },
      ":s3:::elasticbeanstalk-*-",
      {
        "Ref": "AWS::AccountId"
      }
    ]
  ]
}
```

#### YAML
<a name="intrinsic-function-reference-join-example2.yaml"></a>

```
!Join
  - ''
  - - 'arn:'
    - !Ref AWS::Partition
    - ':s3:::elasticbeanstalk-*-'
    - !Ref AWS::AccountId
```

**참고**  
유사한 기능은 [`Fn::Sub`](intrinsic-function-reference-sub.md) 함수를 참조하십시오.

## 지원되는 함수
<a name="intrinsic-function-reference-join-supportedfunctions"></a>

`Fn::Join` 구분 기호의 경우 어떠한 함수도 사용할 수 없습니다. 문자열 값을 지정해야 합니다.

`Fn::Join` 값 목록의 경우 다음 함수를 사용할 수 있습니다.
+ `Fn::Base64`
+ `Fn::FindInMap`
+ `Fn::GetAtt`
+ `Fn::GetAZs`
+ `Fn::If`
+ `Fn::ImportValue`
+ `Fn::Join`
+ `Fn::Split`
+ `Fn::Select`
+ `Fn::Sub`
+ `Ref`

# `Fn::Length`
<a name="intrinsic-function-reference-length"></a>

내장 함수 `Fn::Length`는 배열을 반환하는 배열 또는 내장 함수 내의 요소 수를 반환합니다.

**중요**  
`Fn::Length` 내장 함수를 사용하려면 [`AWS::LanguageExtensions` 변환](transform-aws-languageextensions.md)를 사용해야 합니다.

## 선언
<a name="length-declaration"></a>

### JSON
<a name="intrinsic-function-reference-length-syntax.json"></a>

```
{ "Fn::Length" : IntrinsicFunction }
```

```
{ "Fn::Length" : Array }
```

### YAML
<a name="intrinsic-function-reference-length-syntax.yaml"></a>

```
Fn::Length : IntrinsicFunction
```

```
Fn::Length : Array
```

## 파라미터
<a name="length-parameters"></a>

`IntrinsicFunction`  
여러 요소를 반환하려는 배열을 반환하는 내장 함수입니다.

`Array`  
요소 수를 반환할 배열입니다.

## 반환 값
<a name="intrinsic-function-reference-length-return"></a>

배열을 반환하는 내장 함수 또는 내장 함수에 전달된 배열의 요소 수입니다.

## 예제
<a name="intrinsic-function-reference-length-examples"></a>

### 배열을 반환하는 내장 함수의 요소 수 반환
<a name="intrinsic-function-reference-length-example-subsection"></a>

이 예제 코드 조각은 배열을 반환하는 내장 함수의 요소 수를 반환합니다. 함수는 3을 반환합니다.

#### JSON
<a name="intrinsic-function-reference-length-example.json"></a>

```
{
//...
    "Transform": "AWS::LanguageExtensions"
    //...
        "Fn::Length" : {
            "Fn::Split": ["|", "a|b|c"]
        }
//...
}
```

#### YAML
<a name="intrinsic-function-reference-legnth-example.yaml"></a>

```
Transform: 'AWS::LanguageExtensions'
#...
  Fn::Length: 
    !Split ["|", "a|b|c"]
#...
```

### 목록 파라미터 유형을 참조하는 Ref 내장 함수의 요소 수 반환
<a name="intrinsic-function-reference-length-example2"></a>

이 예제 코드 조각은 목록 파라미터 유형을 참조하는 `Ref` 내장 함수의 요소 수를 반환합니다. 이름이 `ListParameter`인 파라미터가 3개 요소가 있는 목록인 경우 함수는 3을 반환합니다.

#### JSON
<a name="intrinsic-function-reference-length-example2.json"></a>

```
{
//...
    "Transform": "AWS::LanguageExtensions"
    //...
        "Fn::Length": {
            "Ref": "ListParameter"
        }
//...
}
```

#### YAML
<a name="intrinsic-function-reference-legnth-example2.yaml"></a>

```
Transform: 'AWS::LanguageExtensions'
#...
  Fn::Length: 
    !Ref ListParameter
#...
```

### 배열의 요소 수 반환
<a name="intrinsic-function-reference-length-example3"></a>

이 예제 코드 조각은 내장 함수에 전달된 배열의 요소 수를 반환합니다. 함수는 3을 반환합니다.

#### JSON
<a name="intrinsic-function-reference-length-example3.json"></a>

```
 1. {
 2. //...
 3.     "Transform": "AWS::LanguageExtensions"
 4.     //...
 5.         "Fn::Length": [
 6.             1,
 7.             {"Ref": "ParameterName"}, 
 8.             3
 9.         ]
10. //...
11. }
```

#### YAML
<a name="intrinsic-function-reference-legnth-example3.yaml"></a>

```
Transform: 'AWS::LanguageExtensions'
#...
  Fn::Length: 
    - 1
    - !Ref ParameterName
    - 3
#...
```

## 지원되는 함수
<a name="length-supported-functions"></a>

`Fn::Length` 내장 함수 또는 배열에서 다음 함수를 사용할 수 있습니다.
+ `Condition Functions`
+ `Fn::Base64`
+ `Fn::FindInMap`
+ `Fn::Join`
+ `Fn::Length`
+ `Fn::Select`
+ `Fn::Split`
+ `Fn::Sub`
+ `Fn::ToJsonString`
+ `Ref`

# `Fn::Select`
<a name="intrinsic-function-reference-select"></a>

내장 함수 `Fn::Select`는 인덱스별 객체 목록에서 객체 하나를 반환합니다.

**중요**  
인덱스가 어레이 범위를 벗어나는 경우 `Fn::Select`는 null 값을 확인하지 않습니다. 두 개의 조건에서 모두 스택 오류가 발생하므로 선택하는 인덱스가 유효하며 목록에 null이 아닌 값이 포함되는지 확인해야 합니다.

## 선언
<a name="w2aac24c58b7"></a>

### JSON
<a name="intrinsic-function-reference-select-syntax.json"></a>

```
{ "Fn::Select" : [ index, listOfObjects ] }
```

### YAML
<a name="intrinsic-function-reference-select-syntax.yaml"></a>

전체 함수 이름의 구문:

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

짧은 형식의 구문:

```
!Select [ index, listOfObjects ]
```

## Parameters
<a name="w2aac24c58b9"></a>

인덱스  
가져올 객체의 인덱스입니다. 이 항목은 0부터 N-1까지의 값이어야 합니다. 여기서 N은 어레이에 있는 요소의 수를 나타냅니다.

listOfObjects  
선택할 객체의 목록입니다. 이 목록은 null이 아니어야 하며 null 항목이 포함될 수 없습니다.

## 반환 값
<a name="w2aac24c58c11"></a>

선택한 객체입니다.

## 예제
<a name="w2aac24c58c13"></a>

### 기본 예제
<a name="w2aac24c58c13b3"></a>

다음 예제는 `"grapes"`를 반환합니다.

#### JSON
<a name="intrinsic-function-reference-select-example0.json"></a>

```
{ "Fn::Select" : [ "1", [ "apples", "grapes", "oranges", "mangoes" ] ] }
```

#### YAML
<a name="intrinsic-function-reference-select-example0.yaml"></a>

```
!Select [ "1", [ "apples", "grapes", "oranges", "mangoes" ] ]
```

 

### 쉼표로 구분된 목록 파라미터 유형
<a name="w2aac24c58c13b5"></a>

`Fn::Select`를 사용하여 `CommaDelimitedList` 파라미터에서 객체를 선택할 수 있습니다. `CommaDelimitedList` 파라미터를 사용하여 관련 파라미터의 값을 결합할 수 있습니다. 이렇게 하면 템플릿의 총 파라미터 수가 감소합니다. 예를 들어, 다음 파라미터는 세 개의 CIDR 블록이 포함된 쉼표로 구분된 목록을 지정합니다.

#### JSON
<a name="intrinsic-function-reference-select-example1.json"></a>

```
"Parameters" : {
  "DbSubnetIpBlocks": {
    "Description": "Comma-delimited list of three CIDR blocks",
    "Type": "CommaDelimitedList",
      "Default": "10.0.48.0/24, 10.0.112.0/24, 10.0.176.0/24"
  }
}
```

#### YAML
<a name="intrinsic-function-reference-select-example1.yaml"></a>

```
Parameters: 
  DbSubnetIpBlocks: 
    Description: "Comma-delimited list of three CIDR blocks"
    Type: CommaDelimitedList
    Default: "10.0.48.0/24, 10.0.112.0/24, 10.0.176.0/24"
```

세 개의 CIDR 블록 중 하나를 지정하려면 다음 예제 코드 조각과 같이 동일한 템플릿의 리소스 섹션에서 `Fn::Select`를 사용합니다.

#### JSON
<a name="intrinsic-function-reference-select-example2.json"></a>

```
"Subnet0": {
  "Type": "AWS::EC2::Subnet",
    "Properties": {
      "VpcId": { "Ref": "VPC" },
      "CidrBlock": { "Fn::Select" : [ "0", {"Ref": "DbSubnetIpBlocks"} ] }
    }
}
```

#### YAML
<a name="intrinsic-function-reference-select-example2.yaml"></a>

```
Subnet0: 
  Type: AWS::EC2::Subnet
  Properties: 
    VpcId: !Ref VPC
    CidrBlock: !Select [ 0, !Ref DbSubnetIpBlocks ]
```

 

### 짧은 형식의 YAML을 가진 중첩 함수
<a name="w2aac24c58c13b7"></a>

다음 예제는 짧은 형식의 `!Select`와 함께 중첩 내장 함수를 사용하는 데 유효한 패턴을 보여줍니다. 짧은 형식 함수를 연속적으로 중첩할 수 없기 때문에 `!GetAZs !Ref` 같은 패턴은 유효하지 않습니다.

#### YAML
<a name="intrinsic-function-reference-select-example3.yaml"></a>

```
AvailabilityZone: !Select 
  - 0
  - !GetAZs 
    Ref: 'AWS::Region'
```

#### YAML
<a name="intrinsic-function-reference-select-example4.yaml"></a>

```
AvailabilityZone: !Select 
  - 0
  - Fn::GetAZs: !Ref 'AWS::Region'
```

## 지원되는 함수
<a name="w2aac24c58c15"></a>

`Fn::Select` 인덱스 값의 경우 `Ref` 및 `Fn::FindInMap` 함수를 사용할 수 있습니다.

`Fn::Select` 객체 목록의 경우 다음 함수를 사용할 수 있습니다.
+ `Fn::FindInMap`
+ `Fn::GetAtt`
+ `Fn::GetAZs`
+ `Fn::If`
+ `Fn::Split`
+ `Ref`

# `Fn::Split`
<a name="intrinsic-function-reference-split"></a>

결과로 얻은 문자열 목록에서 요소를 선택할 수 있도록 문자열을 문자열 값 목록으로 분할하려면 `Fn::Split` 내장 함수를 사용합니다. 쉼표(`,`)와 같은 구분 기호를 사용하여 분할 위치를 지정합니다. 문자열을 분할한 후 [`Fn::Select`](intrinsic-function-reference-select.md) 함수를 사용하여 특정 요소를 선택합니다.

예를 들어, 쉼표로 구분된 서브넷 ID 문자열을 스택 템플릿으로 가져올 경우 각 쉼표로 문자열을 분할할 수 있습니다. 서브넷 ID 목록에서 `Fn::Select` 내장 함수를 사용하여 리소스에 대한 서브넷 ID를 지정합니다.

## 선언
<a name="w2aac24c62b7"></a>

### JSON
<a name="intrinsic-function-reference-split-syntax.json"></a>

```
{ "Fn::Split" : [ "delimiter", "source string" ] }
```

### YAML
<a name="intrinsic-function-reference-split-syntax.yaml"></a>

전체 함수 이름의 구문:

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

짧은 형식의 구문:

```
!Split [ delimiter, source string ]
```

## Parameters
<a name="w2aac24c62b9"></a>

두 파라미터를 모두 지정해야 합니다.

delimiter  
원본 문자열을 분할할 위치를 결정하는 문자열 값입니다.

source string  
분할할 문자열 값입니다.

## 반환 값
<a name="w2aac24c62c11"></a>

문자열 값의 목록입니다.

## 예제
<a name="w2aac24c62c13"></a>

다음은 `Fn::Split` 함수의 동작을 설명하는 예제입니다.

### 단순 목록
<a name="w2aac24c62c13b5"></a>

다음은 각 세로 막대(`|`)에서 문자열을 분할하는 예제입니다. 함수는 를 반환합니다`["a", "b", "c"]`

#### JSON
<a name="intrinsic-function-reference-split-example.json"></a>

```
{ "Fn::Split" : [ "|" , "a|b|c" ] }
```

#### YAML
<a name="intrinsic-function-reference-split-example.yaml"></a>

```
!Split [ "|" , "a|b|c" ]
```

 

### 빈 문자열 값 목록
<a name="w2aac24c62c13b7"></a>

연속하는 구분 기호로 문자열을 분할할 경우 결과 목록에 빈 문자열이 포함됩니다. 다음은 두 개의 연속하는 구분 기호와 추가 구분 기호로 문자열을 분할하는 방법을 보여주는 예제입니다. 함수는 를 반환합니다`["a", "", "c", ""]`

#### JSON
<a name="w2aac24c62c13b7b5"></a>

```
{ "Fn::Split" : [ "|" , "a||c|" ] }
```

#### YAML
<a name="w2aac24c62c13b7b7"></a>

```
!Split [ "|" , "a||c|" ]
```

 

### 가져온 출력 값 분할
<a name="w2aac24c62c13b9"></a>

다음은 `Fn::Select` 함수에 지정된 대로 가져온 출력 값을 분할한 다음 서브넷 ID의 결과 목록에서 세 번째 요소를 선택하는 예제입니다.

#### JSON
<a name="w2aac24c62c13b9b5"></a>

```
{ "Fn::Select" : [ "2", { "Fn::Split": [",", {"Fn::ImportValue": "AccountSubnetIDs"}]}] }
```

#### YAML
<a name="w2aac24c62c13b9b7"></a>

```
!Select [2, !Split [",", !ImportValue AccountSubnetIDs]]
```

## 지원되는 함수
<a name="w2aac24c62c15"></a>

`Fn::Split` 구분 기호의 경우 어떠한 함수도 사용할 수 없습니다. 문자열 값을 지정해야 합니다.

`Fn::Split` 값 목록의 경우 다음 함수를 사용할 수 있습니다.
+ `Fn::Base64`
+ `Fn::FindInMap`
+ `Fn::GetAtt`
+ `Fn::GetAZs`
+ `Fn::If`
+ `Fn::ImportValue`
+ `Fn::Join`
+ `Fn::Select`
+ `Fn::Sub`
+ `Ref`

# `Fn::Sub`
<a name="intrinsic-function-reference-sub"></a>

내장 함수 `Fn::Sub`는 입력 문자열의 변수를 지정한 값으로 바꿉니다. 템플릿에 이 함수를 사용해 스택을 생성하거나 업데이트해야만 사용할 수 있는 값이 포함된 명령 또는 출력을 만들 수 있습니다.

## 선언
<a name="intrinsic-function-reference-sub-declaration"></a>

다음 단원에서는 함수의 구문을 보여줍니다.

### JSON
<a name="intrinsic-function-reference-sub-syntax.json"></a>

```
{ "Fn::Sub" : [ String, { Var1Name: Var1Value, Var2Name: Var2Value } ] }
```

템플릿 파라미터, 리소스의 논리적 ID 또는 `String` 파라미터의 리소스 속성만 바꾸는 경우 변수 맵을 지정하지 마십시오.

```
{ "Fn::Sub" : String }
```

### YAML
<a name="intrinsic-function-reference-sub-syntax.yaml"></a>

전체 함수 이름의 구문:

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

짧은 형식의 구문:

```
!Sub
  - String
  - Var1Name: Var1Value
    Var2Name: Var2Value
```

템플릿 파라미터, 리소스의 논리적 ID 또는 `String` 파라미터의 리소스 속성만 바꾸는 경우 변수 맵을 지정하지 마십시오.

전체 함수 이름의 구문:

```
Fn::Sub: String
```

짧은 형식의 구문:

```
!Sub String
```

## 파라미터
<a name="w2aac24c66b7"></a>

`String`  
변수가 포함된 문자열로, CloudFormation은 런타임 시 이를 연결된 값으로 바꿉니다. 변수를 `${MyVarName}`으로 씁니다. 변수는 템플릿 파라미터 이름, 리소스의 논리적 ID, 리소스 속성 또는 키-값 맵의 변수일 수 있습니다. 템플릿 파라미터 이름, 리소스의 논리적 ID 및 리소스 속성만 지정하는 경우에는 키-값 맵을 지정하지 마십시오.  
템플릿 파라미터 이름 또는 리소스의 논리적 ID(예: `${InstanceTypeParameter}`)를 지정하는 경우 CloudFormation에서는 `Ref` 내장 함수를 사용했을 때와 동일한 값을 반환합니다. 리소스 속성(예: `${MyInstance.PublicIp}`)을 지정하는 경우 CloudFormation에서는 `Fn::GetAtt` 내장 함수를 사용했을 때와 동일한 값을 반환합니다.  
달러 문자 및 중괄호(`${}`)를 그대로 쓰려면 여는 중괄호 뒤에 느낌표(`!`)를 추가합니다(예: `${!Literal}`). CloudFormation은 이 텍스트를 `${Literal}`로 확인합니다.  
시작 템플릿을 사용하는 경우 `\${!Literal}`와 같은 달러 기호 앞에 백슬래시 `\`를 추가합니다. 그렇지 않으면 리터럴이 빈 문자열로 확인됩니다.

`VarName`  
`String` 파라미터에 포함한 변수의 이름입니다.

`VarValue`  
CloudFormation은 실행 시간 시 연결된 변수 이름을 이 값으로 바꿉니다.

## 반환 값
<a name="w2aac24c66b9"></a>

CloudFormation은 모든 변수를 이 값으로 바꾸어 원본 문자열을 반환합니다.

## 예제
<a name="w2aac24c66c11"></a>

다음은 `Fn::Sub` 함수의 사용 방법을 설명하는 예제입니다.

### 키-값 맵 없이 `Fn::Sub` 사용
<a name="w2aac24c66c11b5"></a>

이 간단한 예제에서는 `InstanceSecurityGroup` 리소스의 설명이 `AWS::StackName` 가상 파라미터를 사용하여 동적으로 생성됩니다. 예를 들어 스택 이름이 "VPC-EC2-ALB-Stack"인 경우 결과로 나오는 설명은 "SSH security group for VPC-EC2-ALB-Stack"입니다.

#### JSON
<a name="intrinsic-function-reference-sub-example-1.json"></a>

```
"InstanceSecurityGroup" : {
    "Type" : "AWS::EC2::SecurityGroup",
    "Properties" : {
        "GroupDescription" : {"Fn::Sub": "SSH security group for ${AWS::StackName}"}
}}
```

#### YAML
<a name="intrinsic-function-reference-sub-example-1.yaml"></a>

```
InstanceSecurityGroup:
  Type: AWS::EC2::SecurityGroup
  Properties:
    GroupDescription: !Sub "SSH security group for ${AWS::StackName}"
```

### 키-값 맵을 포함하여 `Fn::Sub` 사용
<a name="w2aac24c66c11b7"></a>

이 예제에서는 `WWWBucket` 리소스의 이름이 키-값 맵을 사용하여 동적으로 생성됩니다. `Fn::Sub` 함수는 동일한 스택 템플릿 내에 정의된 `RootDomainName` 파라미터를 참조하는 `Ref` 함수의 `www.${Domain}` 값으로 입력 문자열의 `${Domain}`을 대체합니다. 예를 들어, 루트 도메인 이름이 "mydomain.com"인 경우 그에 따라 리소스의 이름은 "www.mydomain.com"입니다.

#### JSON
<a name="intrinsic-function-reference-sub-example-2.json"></a>

```
"WWWBucket":{
  "Type":"AWS::S3::Bucket",
  "Properties":{
    "BucketName":{
      "Fn::Sub":[
        "www.${Domain}",
        {
          "Domain":{
            "Ref":"RootDomainName"
          }
        }
      ]
    }
  }
}
```

#### YAML
<a name="intrinsic-function-reference-sub-example-2.yaml"></a>

```
  WWWBucket:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: !Sub
        - 'www.${Domain}'
        - Domain: !Ref RootDomainName
```

### 여러 변수를 사용하여 ARN을 구성합니다.
<a name="w2aac24c66c11b9"></a>

다음 예제에서는 `AWS::Region` 및 `AWS::AccountId` 가상 파라미터와 `vpc` 리소스 논리적 ID와 함께 `Fn::Sub`를 사용하여 VPC에 대한 Amazon 리소스 이름(ARN)을 생성합니다.

#### JSON
<a name="intrinsic-function-reference-sub-example-3.json"></a>

```
{ "Fn::Sub": "arn:aws:ec2:${AWS::Region}:${AWS::AccountId}:vpc/${vpc}" }
```

#### YAML
<a name="intrinsic-function-reference-sub-example-3.yaml"></a>

```
!Sub 'arn:aws:ec2:${AWS::Region}:${AWS::AccountId}:vpc/${vpc}'
```

### 사용자 데이터 스크립트에 파라미터 값 전달
<a name="w2aac24c66c11c11"></a>

다음 예제에서는 `Fn::Sub`를 사용하여 런타임 시 실제 스택 이름 및 리전을 `AWS::StackName` 및 `AWS::Region` 가상 파라미터로 바꿉니다.

#### JSON
<a name="intrinsic-function-reference-sub-example.json"></a>

가독성을 위해, JSON 예제에서는 전체 사용자 데이터 스크립트를 단일 문자열 값으로 지정하는 대신 `Fn::Join` 함수를 사용하여 각 명령을 구분합니다.

```
"UserData": { "Fn::Base64": { "Fn::Join": ["\n", [
  "#!/bin/bash -xe",
  "yum update -y aws-cfn-bootstrap",
  { "Fn::Sub": "/opt/aws/bin/cfn-init -v --stack ${AWS::StackName} --resource LaunchConfig --configsets wordpress_install --region ${AWS::Region}" },
  { "Fn::Sub": "/opt/aws/bin/cfn-signal -e $? --stack ${AWS::StackName} --resource WebServerGroup --region ${AWS::Region}" }]]
}}
```

#### YAML
<a name="intrinsic-function-reference-sub-example.yaml"></a>

YAML 예제에서는 리터럴 블록을 사용하여 사용자 데이터 스크립트를 지정합니다.

```
UserData:
  Fn::Base64:
    !Sub |
      #!/bin/bash -xe
      yum update -y aws-cfn-bootstrap
      /opt/aws/bin/cfn-init -v --stack ${AWS::StackName} --resource LaunchConfig --configsets wordpress_install --region ${AWS::Region}
      /opt/aws/bin/cfn-signal -e $? --stack ${AWS::StackName} --resource WebServerGroup --region ${AWS::Region}
```

### 매핑을 사용하여 조건 값 지정
<a name="w2aac24c66c11c13"></a>

이 예제에서 `myLogGroup` 리소스의 이름은 `log_group_name` 변수를 `Fn::FindInMap` 함수의 결과 값으로 대체하여 동적으로 생성됩니다.

#### JSON
<a name="intrinsic-function-reference-sub-example-5.json"></a>

```
{
  "Mappings": {
    "LogGroupMapping": {
      "Test": {
        "Name": "test_log_group"
      },
      "Prod": {
        "Name": "prod_log_group"
      }
    }
  },
  "Resources": {
    "myLogGroup": {
      "Type": "AWS::Logs::LogGroup",
      "Properties": {
        "LogGroupName": {
          "Fn::Sub": [
            "cloud_watch_${log_group_name}",
            {
              "log_group_name": {
                "Fn::FindInMap": [
                  "LogGroupMapping",
                  "Test",
                  "Name"
                ]
              }
            }
          ]
        }
      }
    }
  }
}
```

#### YAML
<a name="intrinsic-function-reference-sub-example-5.yaml"></a>

```
Mappings:
  LogGroupMapping:
    Test:
      Name: test_log_group
    Prod:
      Name: prod_log_group
Resources:
  myLogGroup:
    Type: AWS::Logs::LogGroup
    Properties:
      LogGroupName: !Sub 
        - 'cloud_watch_${log_group_name}'
        - log_group_name: !FindInMap 
            - LogGroupMapping
            - Test
            - Name
```

## 지원되는 함수
<a name="intrinsic-function-reference-sub-supported-functions"></a>

`String` 파라미터의 경우 어떠한 함수도 사용할 수 없습니다. 문자열 값을 지정해야 합니다.

`VarName` 및 `VarValue` 파라미터의 경우 다음 함수를 사용할 수 있습니다.
+ [`Fn::Base64`](intrinsic-function-reference-base64.md)
+ [`Fn::FindInMap`](intrinsic-function-reference-findinmap.md)
+ [`Fn::GetAtt`](intrinsic-function-reference-getatt.md)
+ [`Fn::GetAZs`](intrinsic-function-reference-getavailabilityzones.md)
+ [`Fn::If`](intrinsic-function-reference-conditions.md#intrinsic-function-reference-conditions-if)
+ [`Fn::ImportValue`](intrinsic-function-reference-importvalue.md)
+ [`Fn::Join`](intrinsic-function-reference-join.md)
+ [`Fn::Select`](intrinsic-function-reference-select.md)
+ [`Fn::Sub`](#intrinsic-function-reference-sub)
+ [`Ref`](intrinsic-function-reference-ref.md)

# `Fn::ToJsonString`
<a name="intrinsic-function-reference-ToJsonString"></a>

`Fn::ToJsonString` 내장 함수는 객체 또는 배열을 해당 JSON 문자열로 변환합니다.

**중요**  
`Fn::ToJsonString` 내장 함수를 사용하려면 [`AWS::LanguageExtensions` 변환](transform-aws-languageextensions.md)를 사용해야 합니다.

## 선언
<a name="tojsonstring-declaration"></a>

### JSON
<a name="intrinsic-function-reference-tojsonstring-syntax.json"></a>

```
{ "Fn::ToJsonString": Object }
```

```
{ "Fn::ToJsonString": Array }
```

### YAML
<a name="intrinsic-function-reference-tojsonstring-syntax.yaml"></a>

```
Fn::ToJsonString: Object
```

```
Fn::ToJsonString: Array
```

## 파라미터
<a name="tojsonstring-parameters"></a>

`Object`  
JSON 문자열로 변환할 객체입니다.

`Array`  
JSON 문자열로 변환할 배열입니다.

## 반환 값
<a name="intrinsic-function-reference-tojsonstring-return"></a>

JSON 문자열로 변환된 객체 또는 배열입니다.

## 예제
<a name="intrinsic-function-reference-tojsonstring-examples"></a>

### 객체를 JSON 문자열로 변환
<a name="intrinsic-function-reference-tojsonstring-example-subsection"></a>

이 예제 코드 조각은 내장 함수로 전달된 객체를 JSON 문자열로 변환합니다.

#### JSON
<a name="intrinsic-function-reference-tojsonstring-example.json"></a>

```
{
//...
    "Transform": "AWS::LanguageExtensions"
    //...
        "Fn::ToJsonString": {
            "key1": "value1",
            "key2": { 
                "Ref": "ParameterName"
            }
        }
//...
}
```

#### YAML
<a name="intrinsic-function-reference-tojsonstring-example.yaml"></a>

```
Transform: 'AWS::LanguageExtensions'
#...
  Fn::ToJsonString: 
    key1: value1
    key2: !Ref ParameterName
#...
```

두 예제 모두에서 `ParameterName`에 대한 `Ref`가 `resolvedValue`로 확인되면 함수는 다음 JSON 문자열을 확인합니다.

```
"{\"key1\":\"value1\",\"key2\":\"resolvedValue\"}"
```

### 배열을 JSON 문자열로 변환
<a name="intrinsic-function-reference-tojsonstring-example2"></a>

이 예제 코드 조각은 내장 함수로 전달된 배열을 JSON 문자열로 변환합니다.

#### JSON
<a name="intrinsic-function-reference-tojsonstring-example2.json"></a>

```
{
//...
    "Transform": "AWS::LanguageExtensions"
    //...
        "Fn::ToJsonString": [{
            "key1": "value1",
            "key2": { 
                "Ref": "ParameterName" 
            }
        }]
//...
}
```

#### YAML
<a name="intrinsic-function-reference-tojsonstring-example2.yaml"></a>

```
Transform: 'AWS::LanguageExtensions'
#...
  Fn::ToJsonString: 
    - key1: value1
      key2: !Ref ParameterName
#...
```

두 예제 모두에서 `ParameterName`에 대한 `Ref`가 `resolvedValue`로 확인되면 함수는 다음 JSON 문자열을 확인합니다.

```
"[{\"key1\":\"value1\"},{\"key2\":\"resolvedValue\"}]"
```

## 지원되는 함수
<a name="tojsonstring-supported-functions"></a>

`Fn::ToJsonString` 내장 함수 또는 배열에서 다음 함수를 사용할 수 있습니다.
+ `Fn::Base64`
+ `Fn::FindInMap`
+ `Fn::GetAtt`
+ `Fn::GetAZs`
+ `Fn::If`
+ `Fn::ImportValue`
+ `Fn::Join`
+ `Fn::Length`
+ `Fn::Select`
+ `Fn::Split`
+ `Fn::Sub`
+ `Fn::ToJsonString`
+ `Ref`

# `Fn::Transform`
<a name="intrinsic-function-reference-transform"></a>

내장 함수 `Fn::Transform`은 스택 템플릿의 일부분인 사용자 지정 처리를 수행하는 매크로를 지정합니다. 매크로를 통해 찾기 및 바꾸기 작업 같은 간단한 작업부터 전체 템플릿 변형과 같은 작업까지 템플릿에 대한 사용자 지정 처리를 수행할 수 있습니다. 자세한 내용은 *AWS CloudFormation 사용 설명서*의 [템플릿 매크로를 사용하여 CloudFormation 템플릿에서 사용자 지정 처리 수행](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-macros.html)을 참조하세요.

또한 `Fn::Transform`을 사용하여 CloudFormation에서 호스팅된 매크로인 [`AWS::Include` 변환](transform-aws-include.md) 변형을 호출할 수 있습니다.

## 선언
<a name="intrinsic-function-reference-transform-declaration"></a>

### JSON
<a name="intrinsic-function-reference-transform-syntax.json"></a>

전체 함수 이름의 구문:

```
{
    "Fn::Transform": {
        "Name": "macro name",
        "Parameters": {
            "Key": "value"
        }
    }
}
```

짧은 형식의 구문:

```
{
    "Transform": {
        "Name": "macro name",
        "Parameters": {
            "Key": "value"
        }
    }
}
```

### YAML
<a name="intrinsic-function-reference-transform-syntax.yaml"></a>

전체 함수 이름의 구문:

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

짧은 형식의 구문:

```
!Transform
  Name: macro name
  Parameters:
    Key: value
```

## 파라미터
<a name="intrinsic-function-reference-transform-parameters"></a>

`Name`  
처리를 수행하고자 하는 매크로의 이름입니다.

`Parameters`  
매크로에 전달하는 키-값 페어로 지정된 목록 파라미터입니다.

## 반환 값
<a name="intrinsic-function-reference-transform-returnvalue"></a>

처리된 스택 템플릿에 포함될 처리된 템플릿 코드 조각입니다.

## 예제
<a name="intrinsic-function-reference-transform-examples"></a>

다음 예제에서는 `AWS::Include` 변형을 호출하여 템플릿 코드 조각을 검색하는 위치가 `InputValue` 파라미터에 전달되도록 지정합니다.

### JSON
<a name="intrinsic-function-reference-transform-example-1.json"></a>

```
{
    "Fn::Transform": {
        "Name": "AWS::Include",
        "Parameters": {
            "Location": {
                "Ref": "InputValue"
            }
        }
    }
}
```

### YAML
<a name="intrinsic-function-reference-transform-example-1.yaml"></a>

```
Fn::Transform:
  Name: AWS::Include
  Parameters:
    Location: !Ref InputValue
```

## 지원되는 함수
<a name="intrinsic-function-reference-transform-supported-functions"></a>

없음.

CloudFormation에서는 `Fn::Transform`에 포함된 모든 내장 함수를 리터럴 문자열로 지정된 매크로에 전달합니다.

# `Ref`
<a name="intrinsic-function-reference-ref"></a>

`Ref` 내장 함수는 지정된 파라미터, 리소스 또는 다른 내장 함수의 값을 반환합니다. 이 함수는 일반적으로 CloudFormation 템플릿 내 리소스 사이에서 참조를 생성하는 데 사용됩니다.

## 선언
<a name="ref-declaration"></a>

### JSON
<a name="intrinsic-function-reference-ref-syntax.json"></a>

```
{ "Ref" : "logicalName" }
```

```
{ "Ref" : "IntrinsicFunction" }
```

### YAML
<a name="intrinsic-function-reference-ref-syntax.yaml"></a>

전체 함수 이름의 구문:

```
Ref: logicalName
```

```
Ref:
   IntrinsicFunction
```

짧은 형식의 구문:

```
!Ref logicalName
```

```
!Ref
   IntrinsicFunction
```

## 파라미터
<a name="ref-parameters"></a>

logicalName  
참조하려는 리소스 또는 파라미터의 논리명입니다.

IntrinsicFunction  
유효한 문자열로 확인되는 내장 함수입니다. 파라미터 또는 식별자에 대한 참조를 포함하되, 리소스 논리 식별자를 포함해서는 안 됩니다.

## 반환 값
<a name="ref-return-value"></a>

`Ref`의 반환 값은 참조되는 엔터티 유형에 따라 달라집니다.
+ 파라미터의 논리적 이름을 지정하면 파라미터의 값이 반환됩니다. 자세한 내용은 [CloudFormation 템플릿 Parameters 구문](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/parameters-section-structure.html)을 참조하세요.
+ 리소스의 논리명을 지정하면 해당 리소스를 식별하는 데 사용하는 값이 반환됩니다. 일반적으로 리소스의 이름입니다. 그러나 일부 리소스의 경우 리소스 측면에서 또 다른 중요한 의미를 지닌 식별자가 반환됩니다. 예를 들어 `AWS::EC2::EIP` 리소스는 IP 주소를 반환하고 `AWS::EC2::Instance`는 인스턴스 ID를 반환합니다. 리소스의 `Ref` 반환 값에 대한 자세한 내용은 [리소스 및 속성 참조](aws-template-resource-type-ref.md)의 해당 리소스에 대한 설명서를 참조하세요.
+ 내장 함수를 지정하면 해당 함수의 출력값이 반환됩니다.

## 예제
<a name="ref-examples"></a>

### 리소스 간 참조 생성
<a name="intrinsic-function-reference-ref-example"></a>

탄력적 IP 주소에 대한 다음 리소스 선언에는 EC2 인스턴스의 인스턴스 ID가 필요합니다. `Ref` 함수를 사용하여 템플릿의 다른 위치에 선언된 `MyEC2Instance` 리소스의 인스턴스 ID를 지정합니다.

#### JSON
<a name="intrinsic-function-reference-ref-example.json"></a>

```
{
  "AWSTemplateFormatVersion":"2010-09-09",
  "Resources":{
  
      ...
  
    "MyEIP":{
      "Type":"AWS::EC2::EIP",
      "Properties":{
        "InstanceId":{
          "Ref":"MyEC2Instance"
        }
      }
    }
  }
}
```

#### YAML
<a name="intrinsic-function-reference-ref-example.yaml"></a>

```
AWSTemplateFormatVersion: 2010-09-09
Resources:

  ...

  MyEIP:
    Type: AWS::EC2::EIP
    Properties:
      InstanceId: !Ref MyEC2Instance
```

### 리소스 식별자를 스택 출력으로 반환
<a name="intrinsic-function-reference-ref-example-2"></a>

다음 예제에서는 `Ref` 함수를 사용하여 논리명이 `MyBucket`인 Amazon S3 버킷의 이름을 스택 출력으로 반환하는 방법을 보여줍니다.

#### JSON
<a name="intrinsic-function-reference-ref-example-2.json"></a>

```
{
  "AWSTemplateFormatVersion":"2010-09-09",
  "Resources":{
    "MyBucket":{
      "Type":"AWS::S3::Bucket",
      "Properties":{
        "BucketName":{
          "Fn::Sub": "${AWS::StackName}-mybucket"
        }
      }
    }
  },
  "Outputs":{
    "BucketNameOutput":{
      "Description":"The name of the S3 bucket",
      "Value":{
        "Ref":"MyBucket"
      }
    }
  }
}
```

#### YAML
<a name="intrinsic-function-reference-ref-example-2.yaml"></a>

```
AWSTemplateFormatVersion: 2010-09-09
Resources:
  MyBucket:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: !Sub ${AWS::StackName}-mybucket

Outputs:
  BucketNameOutput:
    Description: The name of the S3 bucket
    Value: !Ref MyBucket
```

### `Ref` 함수 내에서 `Fn::Join` 내장 함수 사용
<a name="ref-example-intrinsic-functions-multiple-stages"></a>

**참고**  
`AWS::LanguageExtensions` 변환을 사용하는 경우 다른 내장 함수와 함께 `Ref`를 사용할 수 있습니다. 지원되는 함수는 [지원되는 함수](#ref-supported-functions) 섹션을 참조하세요.

다음 예제에서는 `Stage` 파라미터에 대한 입력, 조건, `Fn::Sub` 내장 함수를 사용하여 리소스의 식별자를 설정하는 방법을 보여줍니다. 그런 다음 `Ref` 및 `Fn::GetAtt` 함수를 사용하여 단계에 따라 적절한 값을 참조합니다. 먼저 `Fn::Sub`를 `Fn::GetAtt`와 함께 사용하여 Amazon CloudWatch 경보의 크기를 설정하는 데 적합한 Amazon SQS 대기열의 ARN을 가져옵니다. 다음으로 [`Fn::Join`](intrinsic-function-reference-join.md)을 `Ref`와 함께 사용하여 `AlarmActions` 속성에 대한 SNS 주제의 이름을 생성합니다.

#### JSON
<a name="ref-example-intrinsic-functions-multiple-stages.json"></a>

```
{
    "AWSTemplateFormatVersion": "2010-09-09",
    "Transform": "AWS::LanguageExtensions",
    "Parameters": {
        "Stage": {
            "Type": "String",
            "Default": "Dev",
            "AllowedValues": [
                "Dev",
                "Prod"
            ]
        }
    },
    "Conditions": {
        "isProd": {
            "Fn::Equals": [
                {"Ref": "Stage"},
                "Prod"
            ]
        },
        "isDev": {
            "Fn::Equals": [
                {"Ref": "Stage"},
                "Dev"
            ]
        }
    },
    "Resources": {
        "DevQueue": {
            "Type": "AWS::SQS::Queue",
            "Condition": "isDev",
            "Properties": {
                "QueueName": {"Fn::Sub": "My${Stage}Queue"}
            }
        },
        "ProdQueue": {
            "Type": "AWS::SQS::Queue",
            "Condition": "isProd",
            "Properties": {
                "QueueName": {"Fn::Sub": "My${Stage}Queue"}
            }
        },
        "DevTopic": {
            "Condition": "isDev",
            "Type": "AWS::SNS::Topic"
        },
        "ProdTopic": {
            "Condition": "isProd",
            "Type": "AWS::SNS::Topic"
        },
        "MyAlarm": {
            "Type": "AWS::CloudWatch::Alarm",
            "Properties": {
                "AlarmDescription": "Alarm if queue depth grows beyond 10 messages",
                "Namespace": "AWS/SQS",
                "MetricName": "ApproximateNumberOfMessagesVisible",
                "Dimensions":[
                    {
                        "Name": {"Fn::Sub": "${Stage}Queue"},
                        "Value": {"Fn::GetAtt": [{"Fn::Sub": "${Stage}Queue"}, "QueueName"]}
                    }
                ],
                "Statistic": "Sum",
                "Period": 300,
                "EvaluationPeriods": 1,
                "Threshold": 10,
                "ComparisonOperator": "GreaterThanThreshold",
                "AlarmActions": [
                    {
                        "Ref": {"Fn::Join": ["", [{"Ref": "Stage"}, "Topic"]]}
                    }
                ]
            }
        }
    }
}
```

#### YAML
<a name="ref-example-intrinsic-functions-multiple-stages.yaml"></a>

```
AWSTemplateFormatVersion: 2010-09-09
Transform: AWS::LanguageExtensions
Parameters:
  Stage:
    Type: String
    Default: Dev
    AllowedValues:
      - Dev
      - Prod
Conditions:
  isProd: !Equals 
    - !Ref Stage
    - Prod
  isDev: !Equals 
    - !Ref Stage
    - Dev
Resources:
  DevQueue:
    Type: AWS::SQS::Queue
    Condition: isDev
    Properties:
      QueueName: !Sub My${Stage}Queue
  ProdQueu:
    Type: AWS::SQS::Queue
    Condition: isProd
    Properties:
      QueueName: !Sub My${Stage}Queue
  DevTopic:
    Condition: isDev
    Type: AWS::SNS::Topic
  ProdTopic:
    Condition: isProd
    Type: AWS::SNS::Topic
  MyAlarm:
    Type: AWS::CloudWatch::Alarm
    Properties:
      AlarmDescription: Alarm if queue depth grows beyond 10 messages
      Namespace: AWS/SQS
      MetricName: ApproximateNumberOfMessagesVisible
      Dimensions:
        - Name: !Sub '${Stage}Queue'
          Value: !GetAtt 
            - !Sub '${Stage}Queue'
            - QueueName
      Statistic: Sum
      Period: 300
      EvaluationPeriods: 1
      Threshold: 10
      ComparisonOperator: GreaterThanThreshold
      AlarmActions:
        - !Ref 
          'Fn::Join':
            - ''
            - - !Ref Stage
              - Topic
```

## 지원되는 함수
<a name="ref-supported-functions"></a>

[AWS::LanguageExtensions 변환](transform-aws-languageextensions.md)을 사용하는 경우 `Ref` 함수 내에서 다음 함수를 사용할 수 있습니다.
+ [`Fn::Base64`](intrinsic-function-reference-base64.md)
+ [`Fn::FindInMap`](intrinsic-function-reference-findinmap.md)
+ [`Fn::If`](intrinsic-function-reference-conditions.md#intrinsic-function-reference-conditions-if)
+ [`Fn::ImportValue`](intrinsic-function-reference-importvalue.md)
+ [`Fn::Join`](intrinsic-function-reference-join.md)
+ [`Fn::Sub`](intrinsic-function-reference-sub.md)
+ [`Fn::ToJsonString`](intrinsic-function-reference-ToJsonString.md)
+ `Ref`

# 규칙 함수
<a name="intrinsic-function-reference-rules"></a>

규칙 함수는 CloudFormation 템플릿의 `Rules` 섹션에서만 작동하는 특수 함수입니다. 이러한 함수는 사용자 지정 로직을 사용하여 파라미터 값을 검증하는 데 도움이 됩니다. 모든 검증은 CloudFormation에서 리소스를 생성하거나 업데이트하기 전에 수행됩니다.

규칙은 표준 파라미터 제약 조건이 충분하지 않은 경우에 유용합니다. 예를 들어 SSL이 활성화된 경우 인증서와 도메인 이름을 모두 제공해야 합니다. 규칙을 통해 이러한 종속성이 충족되도록 보장할 수 있습니다.

규칙의 조건 또는 어설션에서 `Fn::Equals`, `Fn::Not` 및 `Fn::RefAll` 등의 내장 함수를 사용할 수 있습니다. 이 조건 속성은 CloudFormation이 어설션을 적용할지 여부를 결정합니다. 조건이 `true`로 평가되면 CloudFormation은 스택이 생성되거나 업데이트될 때 파라미터 값의 유효성을 확인하기 위해 어설션을 평가합니다. 파라미터 값이 유효하지 않으면 CloudFormation은 스택을 생성하거나 업데이트하지 않습니다. 조건이 `false`로 평가되면 CloudFormation은 파라미터 값을 확인하지 않고 스택 작업을 진행합니다.

템플릿에서 규칙을 처음 사용하는 경우 먼저 *AWS CloudFormation 사용자 가이드*의 [CloudFormation 템플릿 Rules 구문](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/rules-section-structure.html) 주제를 검토하는 것이 좋습니다.

**Topics**
+ [`Fn::And`](#fn-and)
+ [`Fn::Contains`](#fn-contains)
+ [`Fn::EachMemberEquals`](#fn-eachmemberequals)
+ [`Fn::EachMemberIn`](#fn-eachmemberin)
+ [`Fn::Equals`](#fn-equals)
+ [`Fn::Not`](#fn-not)
+ [`Fn::Or`](#fn-or)
+ [`Fn::RefAll`](#fn-refall)
+ [`Fn::ValueOf`](#fn-valueof)
+ [`Fn::ValueOfAll`](#fn-valueofall)
+ [지원되는 함수](#supported-rule-functions)
+ [지원되는 속성](#rules-parameter-attributes)

## `Fn::And`
<a name="fn-and"></a>

모든 지정된 조건이 `true`로 평가되면 `true`를 반환하고, 조건 중 하나라도 `false`로 평가되면 `false`를 반환합니다. `Fn::And`는 AND 연산자 역할을 합니다. 포함할 수 있는 최소 조건 수는 2이고 최대값은 10입니다.

### 선언
<a name="fn-and-declaration"></a>

```
"Fn::And" : [{condition}, {...}]
```

### 파라미터
<a name="fn-and-parameters"></a>

*condition*  
`true` 또는 `false`로 평가되는 규칙 관련 내장 함수입니다.

### 예시
<a name="fn-and-example"></a>

다음 예제가 `true`로 평가되려면 참조된 보안 그룹 이름이 `sg-mysggroup`과 같고 `InstanceType` 파라미터 값이 `t3.large` 또는 `t3.small`이어야 합니다.

```
"Fn::And": [
  {
    "Fn::Equals": [
      "sg-mysggroup",
      {"Ref": "ASecurityGroup"}
    ]
  },
  {
    "Fn::Contains": [
      [
        "t3.large",
        "t3.small"
      ],
      {"Ref": "InstanceType"}
    ]
  }
]
```

## `Fn::Contains`
<a name="fn-contains"></a>

지정된 문자열이 문자열 목록의 값과 하나 이상 일치하면 `true`를 반환합니다.

### 선언
<a name="fn-contains-declaration"></a>

```
"Fn::Contains" : [[list_of_strings], string]
```

### 파라미터
<a name="fn-contains-parameters"></a>

*list\$1of\$1strings*  
문자열 목록입니다(예 `"A", "B", "C"`).

*문자열*  
문자열 목록과 비교하려는 문자열입니다(예: `"A"`).

### 예시
<a name="fn-contains-example"></a>

다음 함수가 `true`로 평가되려면 `InstanceType` 파라미터 값이 목록(`t3.large` 또는 `t3.small`)에 포함되어야 합니다.

```
"Fn::Contains" : [
  ["t3.large", "t3.small"], {"Ref" : "InstanceType"}
]
```

## `Fn::EachMemberEquals`
<a name="fn-eachmemberequals"></a>

지정된 문자열이 목록의 모든 값과 일치하면 `true`를 반환합니다.

### 선언
<a name="fn-eachmemberequals-declaration"></a>

```
"Fn::EachMemberEquals" : [[list_of_strings], string]
```

### 파라미터
<a name="fn-eachmemberequals-parameters"></a>

*list\$1of\$1strings*  
문자열 목록입니다(예 `"A", "B", "C"`).

*문자열*  
문자열 목록과 비교하려는 문자열입니다(예: `"A"`).

### 예시
<a name="fn-eachmemberequals-example"></a>

`AWS::EC2::VPC::Id` 유형의 모든 파라미터의 `Department` 태그가 `IT` 값을 가지고 있으면 다음 함수는 `true`를 반환합니다.

```
"Fn::EachMemberEquals" : [
  {"Fn::ValueOfAll" : ["AWS::EC2::VPC::Id", "Tags.Department"]}, "IT"
]
```

## `Fn::EachMemberIn`
<a name="fn-eachmemberin"></a>

문자열 목록의 각 멤버가 두 번째 문자열 목록의 값과 하나 이상 일치하면 `true`를 반환합니다.

### 선언
<a name="fn-eachmemberin-declaration"></a>

```
"Fn::EachMemberIn" : [[strings_to_check], [strings_to_match]]
```

### 파라미터
<a name="fn-eachmemberin-parameters"></a>

*strings\$1to\$1check*  
문자열 목록입니다(예 `"A", "B", "C"`). CloudFormation은 `strings_to_check` 파라미터의 각 멤버가 `strings_to_match` 파라미터에 있는지 여부를 확인합니다.

*strings\$1to\$1match*  
문자열 목록입니다(예 `"A", "B", "C"`). `strings_to_match` 파라미터의 각 멤버를 `strings_to_check` 파라미터의 멤버와 비교합니다.

### 예시
<a name="fn-eachmemberin-example"></a>

다음 함수는 사용자가 유효한 Virtual Private Cloud(VPC)에 있는 서브넷을 지정하는지 여부를 확인합니다. VPC는 사용자가 스택을 작업하는 계정과 리전에 있어야 합니다. 이 함수는 `AWS::EC2::Subnet::Id` 유형의 모든 파라미터에 적용됩니다.

```
"Fn::EachMemberIn" : [ 
  {"Fn::ValueOfAll" : ["AWS::EC2::Subnet::Id", "VpcId"]}, {"Fn::RefAll" : "AWS::EC2::VPC::Id"}
]
```

## `Fn::Equals`
<a name="fn-equals"></a>

두 값을 비교하여 동일한지 여부를 확인합니다. 두 값이 같으면 `true`를 반환하고 다르면 `false`를 반환합니다.

### 선언
<a name="fn-equals-declaration"></a>

```
"Fn::Equals" : ["value_1", "value_2"]
```

### 파라미터
<a name="fn-equals-parameters"></a>

*`value`*  
다른 값과 비교하려는 유형의 값입니다.

### 예시
<a name="fn-equals-example"></a>

다음 예제가 `true`로 평가되려면 `EnvironmentType` 파라미터의 값이 `prod`와 같아야 합니다.

```
"Fn::Equals" : [{"Ref" : "EnvironmentType"}, "prod"]
```

## `Fn::Not`
<a name="fn-not"></a>

`false`로 평가되는 조건에 대해 `true`를 반환하고 `true`로 평가되는 조건에 대해 `false`를 반환합니다. `Fn::Not`는 NOT 연산자 역할을 합니다.

### 선언
<a name="fn-not-declaration"></a>

```
"Fn::Not" : [{condition}]
```

### 파라미터
<a name="fn-not-parameters"></a>

*`condition`*  
`true` 또는 `false`로 평가되는 규칙 관련 내장 함수입니다.

### 예시
<a name="fn-not-example"></a>

다음 예제가 `true`로 평가되려면 `EnvironmentType` 파라미터의 값이 `prod`와 같지 않아야 합니다.

```
"Fn::Not" : [{"Fn::Equals" : [{"Ref" : "EnvironmentType"}, "prod"]}]
```

## `Fn::Or`
<a name="fn-or"></a>

지정된 조건 중 하나라도 `true`로 평가되면 `true`를 반환하고, 모든 조건이 `false`로 평가되면 `false`를 반환합니다. `Fn::Or`는 OR 연산자 역할을 합니다. 포함할 수 있는 최소 조건 수는 2이고 최대값은 10입니다.

### 선언
<a name="fn-or-declaration"></a>

```
"Fn::Or" : [{condition}, {...}]
```

### 파라미터
<a name="fn-or-parameters"></a>

*`condition`*  
`true` 또는 `false`로 평가되는 규칙 관련 내장 함수입니다.

### 예시
<a name="fn-or-example"></a>

다음 예제가 `true`로 평가되려면 참조된 보안 그룹 이름이 `sg-mysggroup`과 같거나 `InstanceType` 파라미터 값이 `t3.large` 또는 `t3.small`이어야 합니다.

```
"Fn::Or" : [
  {"Fn::Equals" : ["sg-mysggroup", {"Ref" : "ASecurityGroup"}]},
  {"Fn::Contains" : [["t3.large", "t3.small"], {"Ref" : "InstanceType"}]}
]
```

## `Fn::RefAll`
<a name="fn-refall"></a>

지정된 파라미터 유형에 대해 모든 값을 반환합니다.

### 선언
<a name="fn-refall-declaration"></a>

```
"Fn::RefAll" : "parameter_type"
```

### 파라미터
<a name="fn-refall-parameters"></a>

*parameter\$1type*  
AWS 특정 파라미터 유형입니다(예: `AWS::EC2::SecurityGroup::Id` 또는 `AWS::EC2::VPC::Id`). 자세한 내용은 *AWS CloudFormation 사용 설명서*의 [지원되는 AWS 특정 파라미터 유형](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cloudformation-supplied-parameter-types.html#aws-specific-parameter-types-supported)을 참조하세요.

### 예시
<a name="fn-refall-example"></a>

다음 함수는 스택이 생성되거나 업데이트되는 리전 및 AWS 계정의 모든 VPC ID 목록을 반환합니다.

```
"Fn::RefAll" : "AWS::EC2::VPC::Id"
```

## `Fn::ValueOf`
<a name="fn-valueof"></a>

특정 파라미터 및 속성의 속성 값 또는 값 목록을 반환합니다.

### 선언
<a name="fn-valueof-declaration"></a>

```
"Fn::ValueOf" : [ "parameter_logical_id", "attribute" ]
```

### 파라미터
<a name="fn-valueof-parameters"></a>

*속성*  
값을 가져올 속성의 이름입니다. 속성에 대한 자세한 내용은 [지원되는 속성](#rules-parameter-attributes)을 참조하십시오.

*parameter\$1logical\$1id*  
속성 값을 가져올 파라미터의 이름입니다. 이 파라미터는 템플릿의 `Parameters` 섹션에서 선언해야 합니다.

### 예시
<a name="fn-valueof-examples"></a>

다음 예제는 `ElbVpc` 파라미터에서 지정한 VPC의 `Department` 태그 값을 반환합니다.

```
"Fn::ValueOf" : ["ElbVpc", "Tags.Department"]
```

파라미터 하나에 값을 여러 개 지정하면 Fn::ValueOf 함수가 목록을 반환할 수 있습니다. 예를 들어 서브넷을 여러 개 지정하고 각 멤버가 특정 서브넷의 가용 영역인 가용 영역 목록을 가져올 수 있습니다.

```
"Fn::ValueOf" : ["ListOfElbSubnets", "AvailabilityZone"]
```

## `Fn::ValueOfAll`
<a name="fn-valueofall"></a>

지정된 파라미터 유형 및 속성의 모든 속성 값 목록을 반환합니다.

### 선언
<a name="fn-valueofall-declaration"></a>

```
"Fn::ValueOfAll" : ["parameter_type", "attribute"]
```

### 파라미터
<a name="fn-valueofall-parameters"></a>

*속성*  
값을 가져올 속성의 이름입니다. 속성에 대한 자세한 내용은 [지원되는 속성](#rules-parameter-attributes)을 참조하십시오.

*parameter\$1type*  
AWS 특정 파라미터 유형입니다(예: `AWS::EC2::SecurityGroup::Id` 또는 `AWS::EC2::VPC::Id`). 자세한 내용은 *AWS CloudFormation 사용 설명서*의 [지원되는 AWS 특정 파라미터 유형](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cloudformation-supplied-parameter-types.html#aws-specific-parameter-types-supported)을 참조하세요.

### 예시
<a name="fn-valueofall-example"></a>

다음 예제에서 `Fn::ValueOfAll` 함수는 값 목록을 반환합니다. 여기에서 각 멤버는 `Department` 태그가 있는 VPC의 해당 태그 값입니다.

```
"Fn::ValueOfAll" : ["AWS::EC2::VPC::Id", "Tags.Department"]
```

## 지원되는 함수
<a name="supported-rule-functions"></a>

`Fn::ValueOf` 및 `Fn::ValueOfAll` 함수 내에서는 다른 함수를 사용할 수 없습니다. 그러나 기타 모든 규칙 관련 내장 함수 내에서 다음 함수를 사용할 수 있습니다.
+ `Ref`
+ 다른 규칙 관련 내장 함수

## 지원되는 속성
<a name="rules-parameter-attributes"></a>

다음 목록은 특정 리소스 및 파라미터 유형에 대해 가져올 수 있는 속성 값을 설명합니다.

`AWS::EC2::VPC::Id` 파라미터 유형 또는 VPC ID  
+ DefaultNetworkAcl
+ DefaultSecurityGroup
+ 태그.*tag\$1key*

`AWS::EC2::Subnet::Id` 파라미터 유형 또는 서브넷 ID  
+ AvailabilityZone
+ 태그.*tag\$1key*
+ VpcId

`AWS::EC2::SecurityGroup::Id` 파라미터 유형 또는 보안 그룹 ID  
+ 태그.*tag\$1key*