

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

# `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)