

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

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