

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

# 规则函数
<a name="intrinsic-function-reference-rules"></a>

规则函数是特殊函数，只能在 CloudFormation 模板的 `Rules` 部分中使用。这些函数可帮助您使用自定义逻辑验证参数值。所有验证都是在 CloudFormation 创建或更新任何资源之前进行的。

当标准参数约束不足时，规则非常有用。例如，如果启用了 SSL，则必须同时提供证书和域名。规则可以确保满足这些依赖关系。

在规则的条件或断言中，您可以使用内部函数，如 `Fn::Equals`、`Fn::Not` 和 `Fn::RefAll`。条件属性确定 CloudFormation 是否应用断言。如果条件的计算结果为 `true`，则 CloudFormation 将评估断言以验证在创建或更新堆栈时参数值是否有效。如果参数值无效，则 CloudFormation 不会创建或更新堆栈。如果条件的计算结果为 `false`，则 CloudFormation 不会检查参数值并继续堆栈操作。

如果您是首次在模板中使用规则，建议您先查看《*AWS CloudFormation 用户指南*》中有关 [CloudFormation 模板 Rules 语法](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/rules-section-structure.html)的内容。

**Topics**
+ [`Fn::And`](#fn-and)
+ [`Fn::Contains`](#fn-contains)
+ [`Fn::EachMemberEquals`](#fn-eachmemberequals)
+ [`Fn::EachMemberIn`](#fn-eachmemberin)
+ [`Fn::Equals`](#fn-equals)
+ [`Fn::Not`](#fn-not)
+ [`Fn::Or`](#fn-or)
+ [`Fn::RefAll`](#fn-refall)
+ [`Fn::ValueOf`](#fn-valueof)
+ [`Fn::ValueOfAll`](#fn-valueofall)
+ [支持的函数](#supported-rule-functions)
+ [支持的属性](#rules-parameter-attributes)

## `Fn::And`
<a name="fn-and"></a>

如果所有指定条件计算为 `true`，则返回 `true`；如果任一条件计算为 `false`，则返回 `false`。`Fn::And` 用作 AND 运算符。您最少可以包含 2 个条件，最多可以包含 10 个条件。

### 声明
<a name="fn-and-declaration"></a>

```
"Fn::And" : [{condition}, {...}]
```

### 参数
<a name="fn-and-parameters"></a>

*条件*  
计算结果为 `true` 或 `false` 的特定于规则的内部函数。

### 示例
<a name="fn-and-example"></a>

当引用的安全组名称等于 `true` 并且 `sg-mysggroup` 参数值为 `InstanceType` 或 `t3.large` 时，以下示例的计算结果为 `t3.small`。

```
"Fn::And": [
  {
    "Fn::Equals": [
      "sg-mysggroup",
      {"Ref": "ASecurityGroup"}
    ]
  },
  {
    "Fn::Contains": [
      [
        "t3.large",
        "t3.small"
      ],
      {"Ref": "InstanceType"}
    ]
  }
]
```

## `Fn::Contains`
<a name="fn-contains"></a>

如果指定字符串与字符串列表中的至少一个值匹配，则返回 `true`。

### 声明
<a name="fn-contains-declaration"></a>

```
"Fn::Contains" : [[list_of_strings], string]
```

### 参数
<a name="fn-contains-parameters"></a>

*list\$1of\$1strings*  
字符串列表，如 `"A", "B", "C"`。

*字符串*  
要与字符串列表进行比较的字符串（如 `"A"`）。

### 示例
<a name="fn-contains-example"></a>

如果 `true` 参数值包含在列表（`InstanceType` 或 `t3.large`）中，则以下函数的计算结果为 `t3.small`。

```
"Fn::Contains" : [
  ["t3.large", "t3.small"], {"Ref" : "InstanceType"}
]
```

## `Fn::EachMemberEquals`
<a name="fn-eachmemberequals"></a>

如果指定的字符串与列表中的所有值都匹配，则返回 `true`。

### 声明
<a name="fn-eachmemberequals-declaration"></a>

```
"Fn::EachMemberEquals" : [[list_of_strings], string]
```

### 参数
<a name="fn-eachmemberequals-parameters"></a>

*list\$1of\$1strings*  
字符串列表，如 `"A", "B", "C"`。

*字符串*  
要与字符串列表进行比较的字符串（如 `"A"`）。

### 示例
<a name="fn-eachmemberequals-example"></a>

在以下情况下，以下函数将返回 `true`：`AWS::EC2::VPC::Id` 类型的所有参数的 `Department` 标签具有 `IT` 值：

```
"Fn::EachMemberEquals" : [
  {"Fn::ValueOfAll" : ["AWS::EC2::VPC::Id", "Tags.Department"]}, "IT"
]
```

## `Fn::EachMemberIn`
<a name="fn-eachmemberin"></a>

如果字符串列表中的每个成员与第二个字符串列表中的至少一个值匹配，则返回 `true`。

### 声明
<a name="fn-eachmemberin-declaration"></a>

```
"Fn::EachMemberIn" : [[strings_to_check], [strings_to_match]]
```

### 参数
<a name="fn-eachmemberin-parameters"></a>

*strings\$1to\$1check*  
字符串列表，如 `"A", "B", "C"`。CloudFormation 检查 `strings_to_check` 参数中的每个成员是否在 `strings_to_match` 参数中。

*strings\$1to\$1match*  
字符串列表，如 `"A", "B", "C"`。`strings_to_match` 参数中的每个成员与 `strings_to_check` 参数中的成员进行比较。

### 示例
<a name="fn-eachmemberin-example"></a>

以下函数检查用户是否指定位于有效的 Virtual Private Cloud (VPC) 中的子网。VPC 必须位于用户在其中使用堆栈的账户和区域中。此函数应用于 `AWS::EC2::Subnet::Id` 类型的所有参数。

```
"Fn::EachMemberIn" : [ 
  {"Fn::ValueOfAll" : ["AWS::EC2::Subnet::Id", "VpcId"]}, {"Fn::RefAll" : "AWS::EC2::VPC::Id"}
]
```

## `Fn::Equals`
<a name="fn-equals"></a>

比较两个值以确定它们是否相等。如果两个值相等，则返回 `true`；否则返回 `false`。

### 声明
<a name="fn-equals-declaration"></a>

```
"Fn::Equals" : ["value_1", "value_2"]
```

### 参数
<a name="fn-equals-parameters"></a>

*`value`*  
要与另一个值进行比较的任意类型的值。

### 示例
<a name="fn-equals-example"></a>

如果 `true` 参数的值等于 `EnvironmentType`，则以下示例的计算结果为 `prod`：

```
"Fn::Equals" : [{"Ref" : "EnvironmentType"}, "prod"]
```

## `Fn::Not`
<a name="fn-not"></a>

对计算为 `true` 的条件返回 `false`，而对计算为 `false` 的条件返回 `true`。`Fn::Not` 用作 NOT 运算符。

### 声明
<a name="fn-not-declaration"></a>

```
"Fn::Not" : [{condition}]
```

### 参数
<a name="fn-not-parameters"></a>

*`condition`*  
计算结果为 `true` 或 `false` 的特定于规则的内部函数。

### 示例
<a name="fn-not-example"></a>

如果 `EnvironmentType` 参数的值不等于 `prod`，则以下示例的计算结果为 `true`：

```
"Fn::Not" : [{"Fn::Equals" : [{"Ref" : "EnvironmentType"}, "prod"]}]
```

## `Fn::Or`
<a name="fn-or"></a>

如果任一指定条件计算为 `true`，则返回 `true`；如果所有条件计算为 `false`，则返回 `false`。`Fn::Or` 用作 OR 运算符。您最少可以包含 2 个条件，最多可以包含 10 个条件。

### 声明
<a name="fn-or-declaration"></a>

```
"Fn::Or" : [{condition}, {...}]
```

### 参数
<a name="fn-or-parameters"></a>

*`condition`*  
计算结果为 `true` 或 `false` 的特定于规则的内部函数。

### 示例
<a name="fn-or-example"></a>

如果引用的安全组名称等于 `true` 或者 `sg-mysggroup` 参数值为 `InstanceType` 或 `t3.large`，则以下示例的计算结果为 `t3.small`。

```
"Fn::Or" : [
  {"Fn::Equals" : ["sg-mysggroup", {"Ref" : "ASecurityGroup"}]},
  {"Fn::Contains" : [["t3.large", "t3.small"], {"Ref" : "InstanceType"}]}
]
```

## `Fn::RefAll`
<a name="fn-refall"></a>

返回指定的参数类型的所有值。

### 声明
<a name="fn-refall-declaration"></a>

```
"Fn::RefAll" : "parameter_type"
```

### 参数
<a name="fn-refall-parameters"></a>

*parameter\$1type*  
AWS 特定的参数类型，如 `AWS::EC2::SecurityGroup::Id` 或 `AWS::EC2::VPC::Id`。有关更多信息，请参阅《AWS CloudFormation 用户指南》**中的[支持的 AWS 特定参数类型](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cloudformation-supplied-parameter-types.html#aws-specific-parameter-types-supported)。

### 示例
<a name="fn-refall-example"></a>

以下函数将返回正在创建或更新堆栈的区域和 AWS 账户 账户的所有 VPC ID 列表：

```
"Fn::RefAll" : "AWS::EC2::VPC::Id"
```

## `Fn::ValueOf`
<a name="fn-valueof"></a>

返回属性值或特定的参数和属性的值的列表。

### 声明
<a name="fn-valueof-declaration"></a>

```
"Fn::ValueOf" : [ "parameter_logical_id", "attribute" ]
```

### 参数
<a name="fn-valueof-parameters"></a>

*属性*  
要从中检索值的属性的名称。有关属性的更多信息，请参阅[支持的属性](#rules-parameter-attributes)。

*parameter\$1logical\$1id*  
要从中检索属性值的参数的名称。必须在模板的 `Parameters` 部分中声明此参数。

### 示例
<a name="fn-valueof-examples"></a>

以下示例对 `ElbVpc` 参数指定的 VPC 返回 `Department` 标签的值：

```
"Fn::ValueOf" : ["ElbVpc", "Tags.Department"]
```

如果为一个参数指定多个值，则 Fn::ValueOf 函数会返回一个列表。例如，您可以指定多个子网并获取可用区的列表，其中每个成员均为特定子网的可用区：

```
"Fn::ValueOf" : ["ListOfElbSubnets", "AvailabilityZone"]
```

## `Fn::ValueOfAll`
<a name="fn-valueofall"></a>

返回给定参数类型和属性的所有属性值的列表。

### 声明
<a name="fn-valueofall-declaration"></a>

```
"Fn::ValueOfAll" : ["parameter_type", "attribute"]
```

### 参数
<a name="fn-valueofall-parameters"></a>

*属性*  
要从中检索值的属性的名称。有关属性的更多信息，请参阅[支持的属性](#rules-parameter-attributes)。

*parameter\$1type*  
AWS 特定的参数类型，如 `AWS::EC2::SecurityGroup::Id` 或 `AWS::EC2::VPC::Id`。有关更多信息，请参阅《AWS CloudFormation 用户指南》**中的[支持的 AWS 特定参数类型](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cloudformation-supplied-parameter-types.html#aws-specific-parameter-types-supported)。

### 示例
<a name="fn-valueofall-example"></a>

在以下示例中，`Fn::ValueOfAll` 函数返回值的列表，其中每个成员均为具有 `Department` 标签的 VPC 的标签值：

```
"Fn::ValueOfAll" : ["AWS::EC2::VPC::Id", "Tags.Department"]
```

## 支持的函数
<a name="supported-rule-functions"></a>

您无法在 `Fn::ValueOf` 和 `Fn::ValueOfAll` 函数中使用其他函数。但是，您可以在所有其他特定于规则的内部函数中使用以下函数：
+ `Ref`
+ 其他特定于规则的内部函数

## 支持的属性
<a name="rules-parameter-attributes"></a>

以下列表介绍了可为特定资源和参数类型检索的属性值：

`AWS::EC2::VPC::Id` 参数类型或 VPC ID。  
+ DefaultNetworkAcl
+ DefaultSecurityGroup
+ Tags.*tag\$1key*

`AWS::EC2::Subnet::Id` 参数类型或子网 ID。  
+ AvailabilityZone
+ Tags.*tag\$1key*
+ VpcId

`AWS::EC2::SecurityGroup::Id` 参数类型或安全组 ID。  
+ Tags.*tag\$1key*