

這是新的 *CloudFormation 範本參考指南*。請更新您的書籤和連結。如需 CloudFormation 入門的說明，請參閱 [AWS CloudFormation 使用者指南](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html)。

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

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

內部函數會`Fn::GetStackOutput`傳回來自另一個堆疊的輸出值。與 不同`Fn::ImportValue`，此函數不需要參考的堆疊來明確匯出輸出值。它也支援跨帳戶和跨區域參考。

當您需要跨 AWS 帳戶或區域參考堆疊輸出，或您想要在沒有管理明確匯出的情況下參考輸出時，請使用此函數。

**注意**  
`Fn::GetStackOutput` 會建立弱參考。參考值會在堆疊建立或更新時間解析。如果稍後刪除或修改參考的堆疊或輸出，則不會自動更新或通知耗用堆疊。為了確保一致性，請保護參考的堆疊和輸出免於意外變更。

**注意**  
`Fn::GetStackOutput` 不支援跨分割區參考。

## 宣告
<a name="w2aac24c43c11"></a>

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

```
{
  "Fn::GetStackOutput": {
    "StackName": "{{stack-name}}",
    "OutputName": "{{output-name}}",
    "Region": "{{region}}",
    "RoleArn": "{{role-arn}}"
  }
}
```

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

您可以使用完整的函數名稱：

```
Fn::GetStackOutput:
  StackName: {{stack-name}}
  OutputName: {{output-name}}
  Region: {{region}}
  RoleArn: {{role-arn}}
```

或者，您也可以使用較短的名稱：

```
!GetStackOutput
  StackName: {{stack-name}}
  OutputName: {{output-name}}
  Region: {{region}}
  RoleArn: {{role-arn}}
```

**重要**  
當包含其他短格式函數，例如 `!Sub`或 `!Ref`做為參數值`!GetStackOutput`時，您無法使用短格式的 。在這種情況下，請使用完整的函數名稱：  

```
# Do not use
!GetStackOutput
  StackName: !Ref MyStackNameParam
  OutputName: VpcId

# Use this instead
Fn::GetStackOutput:
  StackName: !Ref MyStackNameParam
  OutputName: VpcId
```

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

StackName  
包含您要參考之輸出的堆疊名稱。  
*必要*：是

OutputName  
要參考之輸出的邏輯 ID。這是參考堆疊範本的輸出區段中定義的金鑰。  
*必要*：是

區域  
部署參考堆疊 AWS 的區域。預設為要建立或更新的堆疊區域。  
*必要*：否

RoleArn  
在參考堆疊上具有`cloudformation:DescribeStacks`許可的 IAM 角色 ARN。此角色必須由要建立或更新之堆疊的執行角色擔任。預設為目前堆疊的執行角色。參考不同 AWS 帳戶中的堆疊時，請使用此參數。  
*必要*：否

## 傳回值
<a name="w2aac24c43c15"></a>

參考堆疊中指定輸出的值。

## 範例
<a name="w2aac24c43c17"></a>

### 相同帳戶、相同區域
<a name="intrinsic-function-reference-getstackoutput-example-same-account-region"></a>

下列範例參考來自相同帳戶和區域中名為 之堆疊`ProducerStack`的`VpcId`輸出。由於未`RoleArn`指定 `Region`或 ，CloudFormation 會使用目前堆疊的區域和執行角色。

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

```
{
  "Fn::GetStackOutput": {
    "StackName": "ProducerStack",
    "OutputName": "VpcId"
  }
}
```

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

```
Fn::GetStackOutput:
  StackName: ProducerStack
  OutputName: VpcId
```

### 相同帳戶、不同區域
<a name="intrinsic-function-reference-getstackoutput-example-cross-region"></a>

下列範例參考 中`ProducerStack`部署的`VpcId`輸出`us-west-2`，而耗用堆疊位於不同的區域。`Region` 參數會指示 CloudFormation 在 中查詢參考的值`us-west-2`。

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

```
{
  "Fn::GetStackOutput": {
    "StackName": "ProducerStack",
    "OutputName": "VpcId",
    "Region": "us-west-2"
  }
}
```

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

```
Fn::GetStackOutput:
  StackName: ProducerStack
  OutputName: VpcId
  Region: us-west-2
```

### 跨帳戶
<a name="intrinsic-function-reference-getstackoutput-example-cross-account"></a>

下列範例參考帳戶 `ProducerStack`中來自 的`VpcId`輸出`111111111111`。耗用堆疊位於帳戶 中`222222222222`。`RoleArn` 指定`111111111111`帳戶中具有`cloudformation:DescribeStacks`許可的角色，該許可必須由耗用堆疊的執行角色擔任。

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

```
{
  "Fn::GetStackOutput": {
    "StackName": "ProducerStack",
    "OutputName": "VpcId",
    "RoleArn": "arn:aws:iam::111111111111:role/GetStackOutputRole"
  }
}
```

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

```
Fn::GetStackOutput:
  StackName: ProducerStack
  OutputName: VpcId
  RoleArn: arn:aws:iam::111111111111:role/GetStackOutputRole
```

### 跨帳戶和跨區域
<a name="intrinsic-function-reference-getstackoutput-example-cross-account-region"></a>

下列範例參考來自不同帳戶和不同區域中堆疊的輸出。`RoleArn` 和 `Region` 參數都會指定。

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

```
{
  "Fn::GetStackOutput": {
    "StackName": "ProducerStack",
    "OutputName": "VpcId",
    "RoleArn": "arn:aws:iam::111111111111:role/GetStackOutputRole",
    "Region": "us-west-2"
  }
}
```

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

```
Fn::GetStackOutput:
  StackName: ProducerStack
  OutputName: VpcId
  RoleArn: arn:aws:iam::111111111111:role/GetStackOutputRole
  Region: us-west-2
```

## IAM 角色組態
<a name="intrinsic-function-reference-getstackoutput-iam"></a>

將 `RoleArn` 參數用於跨帳戶參考時，IAM 角色必須具有描述包含參考堆疊之帳戶中堆疊的許可：

```
{
  "Version": "2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "cloudformation:DescribeStacks"
      ],
      "Resource": "*"
    }
  ]
}
```

**提示**  
如需更嚴格的政策，請將 範圍`Resource`限定為您要參考的特定堆疊 ARN。

角色必須具有信任政策，將`AssumeRole`許可授予取用堆疊的執行角色：

```
{
  "Version": "2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::222222222222:role/CloudFormationExecutionRole"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
```

## 支援的函數
<a name="w2aac24c43c21"></a>

下列函數可用於 的參數值 `Fn::GetStackOutput`（例如，建構 `StackName`或 `RoleArn`)。但您無法使用某個資源決定這些函數值。
+ `Fn::Base64`
+ `Fn::FindInMap`
+ `Fn::If`
+ `Fn::Join`
+ `Fn::Select`
+ `Fn::Sub`
+ `Ref`

`Fn::GetStackOutput` 本身可用於下列範本位置：
+ 直接資源屬性值
+ 內部 `Fn::Join`
+ 內部 `Fn::If`
+ 內部 `Fn::Select`

如需尚未支援的位置，請參閱[已知限制](#intrinsic-function-reference-getstackoutput-limitations)下方。

例如，您可以使用 `Ref`將參數值傳遞為堆疊名稱：

```
Parameters:
  SourceStackName:
    Type: String

Resources:
  MyResource:
    Type: AWS::EC2::Instance
    Properties:
      SubnetId:
        Fn::GetStackOutput:
          StackName: !Ref SourceStackName
          OutputName: SubnetId
```

## 已知限制
<a name="intrinsic-function-reference-getstackoutput-limitations"></a>

此版本不支援下列使用模式。所有 都會傳回`InternalFailure`錯誤。這些模式的支援將在未來的更新中新增。
+ `Fn::GetStackOutput` 在`Fn::Sub`變數映射值內
+ `Fn::GetStackOutput` 內部 `Fn::Base64`
+ `Fn::GetStackOutput` 作為直接`Outputs`區段值
+ `Fn::GetStackOutput` `Conditions`區段`Fn::Equals`中的 內部
+ `Fn::GetStackOutput` 內部 `Fn::ImportValue`

`Fn::GetStackOutput` 直接使用 做為資源屬性值`Fn::If`，或將其包裝在 `Fn::Join`、 或 內`Fn::Select`。

## 錯誤處理
<a name="intrinsic-function-reference-getstackoutput-errors"></a>

CloudFormation 會在堆疊建立或更新操作期間驗證`Fn::GetStackOutput`參考。以下是您可能遇到的常見錯誤：
+ *無法擔任 IAM 角色* – 堆疊操作失敗，並出現存取遭拒錯誤。確認取用堆疊的執行角色可以擔任該角色。
+ *IAM 角色缺少 DescribeStacks 許可* – 堆疊操作失敗，並出現存取遭拒錯誤。驗證角色的許可政策包含 `cloudformation:DescribeStacks`。
+ *參考堆疊不存在* – 堆疊操作失敗，並出現驗證錯誤，指出找不到堆疊。如果您包含 `Region` 參數，請檢查這是您要參考之堆疊的正確區域。
+ *參考的堆疊上不存在輸出金鑰* – 堆疊操作失敗，並出現驗證錯誤，指出找不到輸出。
+ *參考堆疊位於未針對目的地帳戶啟用的區域* – 堆疊操作失敗。確保目標區域已在擁有參考堆疊的帳戶中啟用。
+ *參考區域無效* – 堆疊操作失敗並出現驗證錯誤。

### us-east-1 和選擇加入區域之間的參考
<a name="intrinsic-function-reference-getstackoutput-errors-optin"></a>

在`us-east-1`區域與選擇加入區域之間實作參考時，您可能會遇到錯誤。若要避免此類錯誤，請遵循[本指南更新全域 STS 端點的字符相容性](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_enable-regions.html)。

## 搭配 使用 Fn：：GetStackOutput AWS Cloud Development Kit (AWS CDK)
<a name="intrinsic-function-reference-getstackoutput-cdk"></a>

 AWS Cloud Development Kit (AWS CDK) (CDK) 透過 `Fn.getStackOutput()`方法支援 `Fn::GetStackOutput` 。當您在 CDK 堆疊之間有跨區域或跨帳戶參考時，CDK 現在可以`Fn::GetStackOutput`原生使用 ，而不是使用 SSM 參數產生自訂資源。這可簡化合成的範本，並消除先前`crossRegionReferences`解決方法的需求。

如需詳細資訊，請參閱 [CDK API 參考](https://docs.aws.amazon.com/cdk/api/v2/)。

## 與 Fn：：ImportValue 的比較
<a name="intrinsic-function-reference-getstackoutput-comparison"></a>


| 功能 | `Fn::ImportValue` | `Fn::GetStackOutput` | 
| --- | --- | --- | 
| 相同帳戶、相同區域 | 支援 | 支援 | 
| 跨帳戶 | 不支援 | 支援 | 
| 跨區域 | 不支援 | 支援 | 
| 需要明確匯出 | 是 | 否 | 
| 參考類型 | 強 （封鎖匯出堆疊的刪除） | 弱點 （在部署時間解決） | 
| 參考完整性 | 是 | 否 | 

當您在同一帳戶和區域內需要強大的參考完整性`Fn::ImportValue`時，請使用 。`Fn::GetStackOutput` 當您需要跨帳戶或跨區域參考，或您想要避免管理明確匯出時，請使用 。

## 最佳實務
<a name="intrinsic-function-reference-getstackoutput-best-practices"></a>
+ *保護參考的堆疊和輸出。*由於 `Fn::GetStackOutput`會建立弱參考，因此刪除參考的堆疊並不會阻止建立或更新耗用堆疊。不過，重新解析參考的後續操作將會失敗。使用堆疊政策、刪除保護或 IAM 政策，以防止意外刪除參考的堆疊。
+ *縮小範圍 IAM 角色。*設定 `RoleArn`進行跨帳戶存取時，請盡可能限制特定堆疊 ARN 的`DescribeStacks`許可。
+ *請注意解決時機。*參考值會在堆疊建立或更新時間解析。如果來源值變更，耗用堆疊不會自動更新。若要取得變更，請在耗用堆疊上執行更新。