

# 获取从已部署的 CloudFormation 堆栈导出的输出
<a name="using-cfn-stack-exports"></a>

如果在同一 AWS 账户和区域中有多个堆栈，您可能需要在这些堆栈之间共享信息。当一个堆栈需要使用另一个堆栈创建的资源时，此功能非常实用。

例如，您可能有一个堆栈为您的 Web 服务器创建子网和安全组等网络资源。然后，创建实际 Web 服务器的其他堆栈可以使用第一个堆栈创建的网络资源。您无需对堆栈的模板中的资源 ID 进行硬编码或将 ID 作为输入参数传递。

要在堆栈之间共享信息，请从一个堆栈中*导出*输出值，然后将这些值*导入*另一个堆栈。下面将介绍操作方式：

1. 在第一个堆栈的模板（例如，联网堆栈）中，您可以使用 `Outputs` 部分中的 `Export` 字段来定义要导出的特定值。有关更多信息，请参阅 [CloudFormation 模板 Outputs 语法](outputs-section-structure.md)。

1. 当您创建或更新该堆栈时，CloudFormation 会导出输出值，使其可供同一 AWS 账户和区域中的其他堆栈使用。

1. 在另一个堆栈的模板中，您可以使用 [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-importvalue.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-importvalue.html) 函数导入从第一个堆栈导出的值。

1. 创建或更新第二个堆栈（例如，Web 服务器堆栈）时，CloudFormation 会自动从第一个堆栈中检索并使用导出的值。

有关演练和示例模板，请参阅[引用其他 CloudFormation 堆栈中的资源输出](walkthrough-crossstackref.md)。

## 导出堆栈输出值与使用嵌套堆栈
<a name="output-vs-nested"></a>

嵌套堆栈是您使用 `AWS::CloudFormation::Stack` 资源在其他堆栈中创建的堆栈。利用嵌套堆栈，您可从一个堆栈部署和管理所有资源。您可将来自嵌套堆栈组中的一个堆栈的输出用作该组中的另一个堆栈的输入。这不同于导出值。

如果您要将信息共享隔离在嵌套堆栈组中，建议您使用嵌套堆栈。要与其他堆栈 (不只是在嵌套堆栈组中) 共享信息，请导出值。例如，您可使用某个子网创建一个堆栈，然后导出其 ID。其他堆栈可通过导入子网的 ID 来使用该子网。每个堆栈都不需要创建自己的子网。只要堆栈导入子网 ID，您就无法更改或删除它。

有关嵌套堆栈的更多信息，请参阅[使用嵌套堆栈将模板拆分为可重复使用的部分](using-cfn-nested-stacks.md)。

## 注意事项
<a name="using-cfn-stack-exports-considerations"></a>

以下限制适用于跨堆栈引用：
+ 对于每个 AWS 账户，`Export` 名称在区域内必须是唯一的。
+ 不能跨区域创建跨堆栈引用。您可以使用内置函数 `Fn::ImportValue` 仅导入已在同一区域内导出的值。
+ 对于输出，`Export` 的 `Name` 属性值无法使用依赖于资源的 `Ref` 或 `GetAtt` 函数。

  同样，`ImportValue` 函数无法包含依赖于资源的 `Ref` 或 `GetAtt` 函数。
+ 在另一个堆栈导入输出值后，您将无法删除正在导出输出值的堆栈或修改已导出的输入值。必须先删除所有导入，然后才能删除导出堆栈或修改输出值。

## 列出导出的输出值
<a name="using-cfn-stack-exports-listing"></a>

如果您需要查看从堆栈导出的输出值，则请使用以下方法之一：

**列出已导出输出值（控制台）**

1. 通过以下网址打开 CloudFormation 控制台：[https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/)。

1. 在屏幕顶部的导航栏中，选择您的 AWS 区域。

1. 从左侧导航窗格中选择**导出**。

**列出已导出输出值 (AWS CLI)**  
使用以下 [https://docs.aws.amazon.com/cli/latest/reference/cloudformation/list-exports.html](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/list-exports.html) 命令。将 *us-east-1* 替换为您的 AWS 区域。

```
aws cloudformation list-exports --region us-east-1
```

下面是示例输出。

```
{
    "Exports": [
        {
            "ExportingStackId": "arn:aws:cloudformation:us-west-2:123456789012:stack/private-vpc/99764070-b56c-xmpl-bee8-062a88d1d800",
            "Name": "private-vpc-subnet-a",
            "Value": "subnet-07b410xmplddcfa03"
        },
        {
            "ExportingStackId": "arn:aws:cloudformation:us-west-2:123456789012:stack/private-vpc/99764070-b56c-xmpl-bee8-062a88d1d800",
            "Name": "private-vpc-subnet-b",
            "Value": "subnet-075ed3xmplebd2fb1"
        },
        {
            "ExportingStackId": "arn:aws:cloudformation:us-west-2:123456789012:stack/private-vpc/99764070-b56c-xmpl-bee8-062a88d1d800",
            "Name": "private-vpc-vpcid",
            "Value": "vpc-011d7xmpl100e9841"
        }
    ]
}
```

CloudFormation 会显示当前区域已导出输出的名称和值，以及导出这些输出的来源堆栈。要在其他堆栈的模板中使用导出的输出值，请使用导出名称和 `Fn::ImportValue` 函数来引用该输出值。

## 列出导入已导出输出值的堆栈
<a name="using-cfn-stack-imports"></a>

要删除或更改导出的输出值，必须首先确定要导入这些输出值的堆栈。

要查看导入导出的输出值的堆栈，请使用以下方法之一：

**列出导入已导出的输出值的堆栈 (控制台)**

1. 通过以下网址打开 CloudFormation 控制台：[https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/)。

1. 从左侧导航窗格中选择**导出**。

1. 要查看哪些堆栈导入给定的导出值，请选择该导出值的 **Export Name**（导出名称）。CloudFormation 会显示导出详细信息页面，其中列出了要导入值的所有堆栈。

**列出导入已导出的输出值的堆栈 (AWS CLI)**  
使用 [https://docs.aws.amazon.com/cli/latest/reference/cloudformation/list-imports.html](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/list-imports.html) 命令。将 *us-east-1* 替换为您的 AWS 区域，并将 `private-vpc-vpcid` 替换为所导出输出值的名称。

```
aws cloudformation list-imports --region us-east-1 \
    --export-name private-vpc-vpcid
```

CloudFormation 将返回正在导入该值的堆栈的列表。

```
{
    "Imports": [
        "my-app-stack"
    ]
}
```

确定要导入特定导出值的堆栈后，您需要修改这些堆栈以移除引用相关输出值的 `Fn::ImportValue` 函数。您必须先删除引用了已导出输出值的所有导入，然后才能删除或修改已导出的输出值。