

这是新的《CloudFormation 模板参考指南》**。请更新您的书签和链接。有关开始使用 CloudFormation 的帮助，请参阅《AWS CloudFormation 用户指南》[https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html)。

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

`AWS::LanguageExtensions` 转换增强了 CloudFormation 模板中 `Fn::FindInMap` 内置函数的功能。

`Fn::FindInMap` 函数用于从 CloudFormation 模板 `Mappings` 部分中定义的映射中检索值。但是，标准的 `Fn::FindInMap` 函数存在一些局限，例如无法处理缺失的映射，也无法使用嵌套了某些内置函数的 `Fn::FindInMap` 函数。

`AWS::LanguageExtensions` 转换通过引入以下增强功能来解决这些限制：
+ **默认值支持** – 您可以指定在找不到映射时返回默认值。
+ **内置函数支持** – 您还可以使用更广泛的内置函数来定义 `Fn::FindInMap` 的字段，而不是使用标准的 `Fn::FindInMap` 函数。

## 声明
<a name="intrinsic-function-reference-findinmap-enhancements-declaration"></a>

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

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

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

完整函数名称的语法：

```
Fn::FindInMap:
  - MapName
  - TopLevelKey
  - SecondLevelKey
  - DefaultValue: DefaultValue
```

短格式的语法：

```
!FindInMap
  - MapName
  - TopLevelKey
  - SecondLevelKey
  - DefaultValue: DefaultValue
```

## 参数
<a name="intrinsic-function-reference-findinmap-enhancements-parameters"></a>

DefaultValue  <a name="DefaultValue"></a>
如果在 `MapName` 映射上找不到 `TopLevelKey` 和/或 `SecondLevelKey`，则 `Fn::FindInMap` 将解析为的值。该字段是可选的。

所有参数 `MapName`、`TopLevelKey`、`SecondLevelKey` 和 `DefaultValue` 都可以是内部函数，只要其能够在转换期间解析为有效值。

## 示例
<a name="w2aac28c16c20c15"></a>

以下示例演示如何在添加 `AWS::LanguageExtensions` 转换时定义 `Fn::FindInMap` 的字段。

### 使用默认值
<a name="intrinsic-function-reference-findinmap-enhancements-example"></a>

以下是在 `Fn::FindInMap` 函数中使用默认值的示例：

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

```
{
  //...
    "Transform": "AWS::LanguageExtensions",
    //...
    "Fn::FindInMap": [
      "RegionMap",
      { "Ref": "AWS::Region" },
      "InstanceType",
      { "DefaultValue": "t3.micro" }
    ]
  //...
}
```

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

```
Transform: 'AWS::LanguageExtensions'
#...
    !FindInMap 
        - 'RegionMap'
        - !Ref 'AWS::Region'
        - 'InstanceType'
        - DefaultValue: t3.micro
#...
```

#### 使用内置函数定义顶层键
<a name="intrinsic-function-reference-findinmap-enhancements-example"></a>

以下示例使用 `Fn::FindInMap` 函数以及其中嵌入的 `Fn::Select` 和 `Fn::Split` 内置函数定义顶层键。

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

```
{
  //...
  "Transform": "AWS::LanguageExtensions",
  //...
      "Fn::FindInMap": [
        "MyMap",
        {
          "Fn::Select": [
            0,
            {
              "Fn::Split": [
                "|",
                { "Ref": "InputKeys" }
              ]
            }
          ]
        },
        "SecondKey"
      ]
//...
}
```

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

```
Transform: 'AWS::LanguageExtensions'
#...
    !FindInMap: [MyMap, !Select [0, !Split [|, !Ref InputKeys]], SecondKey]
#...
```

## 支持的函数
<a name="intrinsic-function-reference-findinmap-enhancements-supported-functions"></a>

您可以在 `Fn::FindInMap:` 增强参数中使用以下函数：
+ ``Fn::FindInMap``
+ ``Fn::Join``
+ ``Fn::Sub``
+ ``Fn::If``
+ ``Fn::Select``
+ ``Fn::Length``
+ ``Fn::ToJsonString``
+ ``Fn::Split`` – 除非将其用作默认值，否则 `Fn::Split` 必须与生成字符串（例如 ``Fn::Join`` 或 ``Fn::Select``）的内部函数结合使用。
+ ``Ref``

## 相关资源
<a name="w2aac28c16c20c19"></a>

有关如何使用 `Fn::FindInMap` 内置函数的更多信息和示例，请参阅[`Fn::FindInMap`](intrinsic-function-reference-findinmap.md)。

有关 `AWS::LanguageExtensions` 转换的更多信息，请参阅 [`AWS::LanguageExtensions` 转换](transform-aws-languageextensions.md)。