

这是新的《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"></a>

CloudFormation 提供多个内置函数帮助您管理堆栈。在模板中使用内部函数，以便为仅在运行时可用的属性分配值。

**注意**  
您只能在模板的特定部分使用内部函数。目前，您可以在资源属性、输出、元数据属性和更新策略属性中使用内部函数。您还可以使用内部函数有条件地创建堆栈资源。

**Topics**
+ [`Fn::Base64`](intrinsic-function-reference-base64.md)
+ [`Fn::Cidr`](intrinsic-function-reference-cidr.md)
+ [条件函数](intrinsic-function-reference-conditions.md)
+ [`Fn::FindInMap`](intrinsic-function-reference-findinmap.md)
+ [`Fn::ForEach`](intrinsic-function-reference-foreach.md)
+ [`Fn::GetAtt`](intrinsic-function-reference-getatt.md)
+ [`Fn::GetAZs`](intrinsic-function-reference-getavailabilityzones.md)
+ [`Fn::ImportValue`](intrinsic-function-reference-importvalue.md)
+ [`Fn::Join`](intrinsic-function-reference-join.md)
+ [`Fn::Length`](intrinsic-function-reference-length.md)
+ [`Fn::Select`](intrinsic-function-reference-select.md)
+ [`Fn::Split`](intrinsic-function-reference-split.md)
+ [`Fn::Sub`](intrinsic-function-reference-sub.md)
+ [`Fn::ToJsonString`](intrinsic-function-reference-ToJsonString.md)
+ [`Fn::Transform`](intrinsic-function-reference-transform.md)
+ [`Ref`](intrinsic-function-reference-ref.md)
+ [规则函数](intrinsic-function-reference-rules.md)

# `Fn::Base64`
<a name="intrinsic-function-reference-base64"></a>

内部函数`Fn::Base64`返回输入字符串的 Base64 表示方法。该函数通常用于通过 `UserData` 属性将编码的数据传递给 Amazon EC2 实例。

## 声明
<a name="w2aac24c12b5"></a>

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

```
{ "Fn::Base64" : valueToEncode }
```

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

完整函数名称的语法：

```
Fn::Base64: valueToEncode
```

短格式的语法：

```
!Base64 valueToEncode
```

**注意**  
如果您使用简短格式并直接在 `valueToEncode` 参数中包含另一个函数，请在至少一个函数中使用完整函数名称。例如，以下语法是无效的：  

```
!Base64 !Sub string
!Base64 !Ref logical_ID
```
应该改为对至少一个函数使用完整函数名，如以下示例所示：  

```
!Base64
  "Fn::Sub": string

Fn::Base64:
  !Sub string
```

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

valueToEncode  
您想转换成 Base64 的字符串值。

## 返回值：
<a name="w2aac24c12b9"></a>

用 Base64 表示方法的原始字符串。

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

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

```
{ "Fn::Base64" : "AWS CloudFormation" }
```

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

```
Fn::Base64: AWS CloudFormation
```

## 支持的函数
<a name="w2aac24c12c13"></a>

您可以在 `Fn::Base64` 函数内部使用返回字符串的任意函数。

# `Fn::Cidr`
<a name="intrinsic-function-reference-cidr"></a>

内部函数 `Fn::Cidr` 返回 CIDR 地址块的数组。返回的 CIDR 块数取决于 `count` 参数。

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

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

```
{ "Fn::Cidr" : [ipBlock, count, cidrBits]}
```

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

完整函数名称的语法：

```
Fn::Cidr: 
  - ipBlock
  - count
  - cidrBits
```

短格式的语法：

```
!Cidr [ ipBlock, count, cidrBits ]
```

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

ipBlock  <a name="ipBlock"></a>
要拆分为更小的 CIDR 块的用户指定 CIDR 地址块。

count  <a name="count"></a>
要生成的 CIDR 数。有效范围在 1 到 256 之间。

cidrBits  <a name="cidrBits"></a>
CIDR 的子网位数。例如，如果为该参数指定值“8”，将创建一个具有“/24”掩码的 CIDR。  
子网位数是子网掩码的逆运算。要计算给定子网位数所需的主机位数，请从 32 位 (IPv4) 或 128 位 (IPv6) 中减去子网位数。

## 返回值
<a name="intrinsic-function-reference-cidr-return-values"></a>

CIDR 地址块的数组。

## 示例
<a name="intrinsic-function-reference-cidr-examples"></a>

### 基本用法
<a name="intrinsic-function-reference-cidr-example1"></a>

该示例从具有“/24”掩码的 CIDR 创建 6 个具有“/27”子网掩码的 CIDR。

#### JSON
<a name="intrinsic-function-reference-cidr-example1.json"></a>

```
{ "Fn::Cidr" : [ "192.168.0.0/24", "6", "5"] }
```

#### YAML
<a name="intrinsic-function-reference-cidr-example1.yaml"></a>

```
!Cidr [ "192.168.0.0/24", 6, 5 ]
```

### 创建启用了 IPv6 的 VPC
<a name="intrinsic-function-reference-cidr-example2"></a>

该示例模板创建一个启用了 IPv6 的子网。

#### JSON
<a name="intrinsic-function-reference-cidr-example2.json"></a>

```
{
    "Resources": {
        "ExampleVpc": {
            "Type": "AWS::EC2::VPC",
            "Properties": {
                "CidrBlock": "10.0.0.0/16"
            }
        },
        "IPv6CidrBlock": {
            "Type": "AWS::EC2::VPCCidrBlock",
            "Properties": {
                "AmazonProvidedIpv6CidrBlock": true,
                "VpcId": {
                    "Ref": "ExampleVpc"
                }
            }
        },
        "ExampleSubnet": {
            "Type": "AWS::EC2::Subnet",
            "DependsOn": "IPv6CidrBlock",
            "Properties": {
                "AssignIpv6AddressOnCreation": true,
                "CidrBlock": {
                    "Fn::Select": [
                        0,
                        {
                            "Fn::Cidr": [
                                {
                                    "Fn::GetAtt": [
                                        "ExampleVpc",
                                        "CidrBlock"
                                    ]
                                },
                                1,
                                8
                            ]
                        }
                    ]
                },
                "Ipv6CidrBlock": {
                    "Fn::Select": [
                        0,
                        {
                            "Fn::Cidr": [
                                {
                                    "Fn::Select": [
                                        0,
                                        {
                                            "Fn::GetAtt": [
                                                "ExampleVpc",
                                                "Ipv6CidrBlocks"
                                            ]
                                        }
                                    ]
                                },
                                1,
                                64
                            ]
                        }
                    ]
                },
                "VpcId": {
                    "Ref": "ExampleVpc"
                }
            }
        }
    }
}
```

#### YAML
<a name="intrinsic-function-reference-cidr-example2.yaml"></a>

```
Resources:
  ExampleVpc:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.0.0.0/16
  IPv6CidrBlock:
    Type: AWS::EC2::VPCCidrBlock
    Properties:
      AmazonProvidedIpv6CidrBlock: true
      VpcId: !Ref ExampleVpc
  ExampleSubnet:
    Type: AWS::EC2::Subnet
    DependsOn: IPv6CidrBlock
    Properties:
      AssignIpv6AddressOnCreation: true
      CidrBlock: !Select
        - 0
        - !Cidr
          - !GetAtt ExampleVpc.CidrBlock
          - 1
          - 8
      Ipv6CidrBlock: !Select
        - 0
        - !Cidr
          - !Select
            - 0
            - !GetAtt ExampleVpc.Ipv6CidrBlocks
          - 1
          - 64
      VpcId: !Ref ExampleVpc
```

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

您可以在 `Fn::Cidr` 函数中使用以下函数：
+ [`Fn::Select`](intrinsic-function-reference-select.md)
+ [`Ref`](intrinsic-function-reference-ref.md)

# 条件函数
<a name="intrinsic-function-reference-conditions"></a>

您可以使用内置函数（如 `Fn::If` 或 `Fn::Equals`）按条件逻辑创建和配置堆栈资源。这些条件会在堆栈创建或更新过程中进行评估。定义所有条件后，您可以在模板的 `Resources` 和 `Outputs` 部分将它们与资源或资源属性关联起来。

对于复杂场景，您可以使用 `Fn::And` 或 `Fn::Or` 函数组合多个条件，也可以使用 `Fn::Not` 函数对条件值取反。您还可以嵌套条件，以创建更复杂的条件逻辑。

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

**注意**  
必须在模板的 `Conditions` 部分中定义所有条件（`Fn::If` 条件除外）。您可以在 `Resources` 和 `Outputs` 部分的 `Metadata` 属性、`UpdatePolicy` 属性和属性值中使用 `Fn::If` 条件。

**Topics**
+ [`Fn::And`](#intrinsic-function-reference-conditions-and)
+ [`Fn::Equals`](#intrinsic-function-reference-conditions-equals)
+ [`Fn::If`](#intrinsic-function-reference-conditions-if)
+ [`Fn::Not`](#intrinsic-function-reference-conditions-not)
+ [`Fn::Or`](#intrinsic-function-reference-conditions-or)
+ [支持的函数](#w2aac24c20c25)
+ [示例模板](#conditions-sample-templates)

## `Fn::And`
<a name="intrinsic-function-reference-conditions-and"></a>

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

### 声明
<a name="intrinsic-function-reference-conditions-and-syntax"></a>

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

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

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

完整函数名称的语法：

```
Fn::And: [condition]
```

短格式的语法：

```
!And [condition]
```

### 参数
<a name="w2aac24c20c13b7"></a>

condition  <a name="fn-and-condition"></a>
计算为 `true` 或 `false` 的条件。

### `Fn::And` 用法示例
<a name="w2aac24c20c13b9"></a>

当引用的安全组名称等于 `MyAndCondition` 并且 `sg-mysggroup` 计算为 true 时，下面的 `SomeOtherCondition` 计算为 true：

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

```
"MyAndCondition": {
   "Fn::And": [
      {"Fn::Equals": ["sg-mysggroup", {"Ref": "ASecurityGroup"}]},
      {"Condition": "SomeOtherCondition"}
   ]
}
```

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

```
MyAndCondition: !And
  - !Equals ["sg-mysggroup", !Ref ASecurityGroup]
  - !Condition SomeOtherCondition
```

## `Fn::Equals`
<a name="intrinsic-function-reference-conditions-equals"></a>

比较两个值是否相等。如果两个值相等，则返回 `true`，如果不等，则返回 `false`。

### 声明
<a name="intrinsic-function-reference-conditions-equals-syntax"></a>

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

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

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

完整函数名称的语法：

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

短格式的语法：

```
!Equals [value_1, value_2]
```

### 参数
<a name="w2aac24c20c15b7"></a>

value  
您想要比较的字符串值。

### `Fn::Equals` 用法示例
<a name="w2aac24c20c15b9"></a>

如果 `IsProduction` 参数的值等于 `EnvironmentType`，则下面的 `prod` 条件计算为 true：

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

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

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

```
IsProduction:
  !Equals [!Ref EnvironmentType, prod]
```

## `Fn::If`
<a name="intrinsic-function-reference-conditions-if"></a>

如果指定的条件计算为 `true`，则返回一个值，如果指定的条件计算为 `false`，则返回另一个值。当前，CloudFormation 在模板 `Resources` 部分和 `Outputs` 部分的 `Metadata` 属性、`UpdatePolicy` 属性和属性值中支持 `Fn::If` 内置函数。您可以使用 `AWS::NoValue` 伪参数作为返回值来删除相应的属性。

### 声明
<a name="intrinsic-function-reference-conditions-if-syntax"></a>

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

```
"Fn::If": [condition_name, value_if_true, value_if_false]
```

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

完整函数名称的语法：

```
Fn::If: [condition_name, value_if_true, value_if_false]
```

短格式的语法：

```
!If [condition_name, value_if_true, value_if_false]
```

### 参数
<a name="w2aac24c20c19b7"></a>

condition\$1name  <a name="condition_name"></a>
条件部分中对条件的引用。使用条件名称引用它。

value\$1if\$1true  <a name="value_if_true"></a>
当指定的条件计算为 true 时要返回的值。

value\$1if\$1false  <a name="value_if_false"></a>
当指定的条件计算为 `false` 时要返回的值。

### `Fn::If` 用法示例
<a name="w2aac24c20c19b9"></a>

**Topics**
+ [有条件地选择资源](#w2aac24c20c19b9b5)
+ [条件输出](#w2aac24c20c19b9b7)
+ [条件数组值](#w2aac24c20c19b9b9)
+ [条件属性和属性值](#w2aac24c20c19b9c11)
+ [条件更新策略](#w2aac24c20c19b9c13)

#### 有条件地选择资源
<a name="w2aac24c20c19b9b5"></a>

以下示例在 Amazon EC2 资源定义中使用了一个 `Fn::If` 函数，用于确定将哪个安全组资源与实例关联。如果 `CreateNewSecurityGroup` 的评估结果为 true，则 CloudFormation 会使用 `NewSecurityGroup`（在模板的其他位置创建的安全组）的引用值来指定 `SecurityGroupIds` 属性；如果 `CreateNewSecurityGroup` 为 false，则 CloudFormation 会使用 `ExistingSecurityGroupId`（引用现有安全组的参数）的引用值。

##### JSON
<a name="intrinsic-function-reference-conditions-if-example1.json"></a>

```
"Resources": {
  "EC2Instance": {
    "Type": "AWS::EC2::Instance",
    "Properties": {
      "ImageId": "ami-0abcdef1234567890",
      "InstanceType": "t3.micro",
      "SecurityGroupIds": {
        "Fn::If": [
          "CreateNewSecurityGroup",
          [{"Ref": "NewSecurityGroup"}],
          [{"Ref": "ExistingSecurityGroupId"}]
        ]
      }]
    }
  }
}
```

##### YAML
<a name="intrinsic-function-reference-conditions-if-example1.yaml"></a>

```
Resources:
  EC2Instance:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: ami-0abcdef1234567890
      InstanceType: t3.micro
      SecurityGroupIds: !If
        - CreateNewSecurityGroup
        - [!Ref NewSecurityGroup]
        - [!Ref ExistingSecurityGroupId]
```

#### 条件输出
<a name="w2aac24c20c19b9b7"></a>

在模板的 `Output` 部分中，您可以使用 `Fn::If` 函数按条件输出信息。在以下代码段中，如果 `CreateNewSecurityGroup` 条件的计算结果为 true，则 CloudFormation 输出 `NewSecurityGroup` 资源的安全组 ID。如果条件为 false，则 CloudFormation 输出 `ExistingSecurityGroup` 资源的安全组 ID。

##### JSON
<a name="intrinsic-function-reference-conditions-if-example2.json"></a>

```
"Outputs" : {
  "SecurityGroupId" : {
    "Description" : "Group ID of the security group used.",
    "Value" : {
      "Fn::If" : [
        "CreateNewSecurityGroup",
        {"Ref" : "NewSecurityGroup"},
        {"Ref" : "ExistingSecurityGroupId"}
      ]
    }
  }
}
```

##### YAML
<a name="intrinsic-function-reference-conditions-if-example2.yaml"></a>

```
Outputs:
  SecurityGroupId: 
    Description: Group ID of the security group used.
    Value: !If [CreateNewSecurityGroup, !Ref NewSecurityGroup, !Ref ExistingSecurityGroupId]
```

#### 条件数组值
<a name="w2aac24c20c19b9b9"></a>

以下示例使用 `Fn::If` 根据条件提供不同的数组值。如果 `MoreThan2AZs` 条件的评估结果为 true，则使用三个公共子网。否则，仅使用两个公共子网。

##### JSON
<a name="intrinsic-function-reference-conditions-if-example-arrays.json"></a>

```
"Subnets": {
  "Fn::If": [
    "MoreThan2AZs",
    [
      {"Fn::ImportValue": "PublicSubnet01"},
      {"Fn::ImportValue": "PublicSubnet02"},
      {"Fn::ImportValue": "PublicSubnet03"}
    ],
    [
      {"Fn::ImportValue": "PublicSubnet01"},
      {"Fn::ImportValue": "PublicSubnet02"}
    ]
  ]
}
```

##### YAML
<a name="intrinsic-function-reference-conditions-if-example-arrays.yaml"></a>

```
Subnets:
  Fn::If:
    - MoreThan2AZs
    - - Fn::ImportValue: PublicSubnet01
      - Fn::ImportValue: PublicSubnet02
      - Fn::ImportValue: PublicSubnet03
    - - Fn::ImportValue: PublicSubnet01
      - Fn::ImportValue: PublicSubnet02
```

#### 条件属性和属性值
<a name="w2aac24c20c19b9c11"></a>

下面的示例在 `AWS::NoValue` 函数中使用 `Fn::If` 伪参数。仅当提供了快照 ID 时，该条件才对 Amazon RDS 数据库实例使用快照。如果 `UseDBSnapshot` 条件计算为 true，则 CloudFormation 对 `DBSnapshotIdentifier` 属性使用 `DBSnapshotName` 参数值。如果条件计算为 false，则 CloudFormation 删除 `DBSnapshotIdentifier` 属性。

此外，它还在 Amazon RDS 数据库实例的 `AllocatedStorage` 属性中使用了一个 `Fn::If` 函数。如果 `IsProduction` 的评估结果为 true，则存储大小将设置为 `100`；否则，该值将设置为 `20`。

##### JSON
<a name="intrinsic-function-reference-conditions-if-example3.json"></a>

```
"MyDatabase" : {
  "Type" : "AWS::RDS::DBInstance",
  "Properties": {
    "DBInstanceClass": "db.t3.micro",
    "AllocatedStorage": {
      "Fn::If": [
        "IsProduction",
        100,
        20
      ]
    },
    "Engine" : "MySQL",
    "EngineVersion" : "5.5",
    "MasterUsername" : { "Ref" : "DBUser" },
    "MasterUserPassword" : { "Ref" : "DBPassword" },
    "DBParameterGroupName" : { "Ref" : "MyRDSParamGroup" },
    "DBSnapshotIdentifier" : {
      "Fn::If" : [
        "UseDBSnapshot",
        {"Ref" : "DBSnapshotName"},
        {"Ref" : "AWS::NoValue"}
      ]
    }
  }
}
```

##### YAML
<a name="intrinsic-function-reference-conditions-if-example3.yaml"></a>

```
MyDatabase:
  Type: AWS::RDS::DBInstance
  Properties:
    DBInstanceClass: db.t3.micro
    AllocatedStorage: !If [IsProduction, 100, 20]
    Engine: MySQL
    EngineVersion: 5.5
    MasterUsername: !Ref DBUser
    MasterUserPassword: !Ref DBPassword
    DBParameterGroupName: !Ref MyRDSParamGroup
    DBSnapshotIdentifier: !If [UseDBSnapshot, !Ref DBSnapshotName, !Ref "AWS::NoValue"]
```

#### 条件更新策略
<a name="w2aac24c20c19b9c13"></a>

以下代码段仅当 `RollingUpdates` 条件计算为 true 时，才提供 Auto Scaling 更新策略。如果条件计算结果为 false，则 CloudFormation 删除 `AutoScalingRollingUpdate` 更新策略。

##### JSON
<a name="intrinsic-function-reference-conditions-if-example4.json"></a>

```
"UpdatePolicy": {
  "Fn::If": [
    "RollingUpdates",
    {
      "AutoScalingRollingUpdate": {
        "MaxBatchSize": 2,
        "MinInstancesInService": 2,
        "PauseTime": "PT0M30S"
      }
    },
    {
      "Ref": "AWS::NoValue"
    }
  ]
}
```

##### YAML
<a name="intrinsic-function-reference-conditions-if-example4.yaml"></a>

```
UpdatePolicy: !If
  - RollingUpdates
  - AutoScalingRollingUpdate:
      MaxBatchSize: 2
      MinInstancesInService: 2
      PauseTime: PT0M30S
  - !Ref "AWS::NoValue"
```

## `Fn::Not`
<a name="intrinsic-function-reference-conditions-not"></a>

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

### 声明
<a name="intrinsic-function-reference-conditions-not-syntax"></a>

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

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

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

完整函数名称的语法：

```
Fn::Not: [condition]
```

短格式的语法：

```
!Not [condition]
```

### 参数
<a name="w2aac24c20c21b7"></a>

condition  <a name="condition"></a>
计算为 `Fn::Equals` 或 `true` 的条件 (如 `false`)。

### `Fn::Not` 用法示例
<a name="w2aac24c20c21b9"></a>

如果 `EnvironmentType` 参数的值不等于 `prod`，则下面的 `EnvCondition` 条件计算为 true：

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

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

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

```
MyNotCondition:
  !Not [!Equals [!Ref EnvironmentType, prod]]
```

## `Fn::Or`
<a name="intrinsic-function-reference-conditions-or"></a>

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

### 声明
<a name="intrinsic-function-reference-conditions-or-syntax"></a>

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

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

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

完整函数名称的语法：

```
Fn::Or: [condition, ...]
```

短格式的语法：

```
!Or [condition, ...]
```

### 参数
<a name="w2aac24c20c23b7"></a>

condition  
计算为 `true` 或 `false` 的条件。

### `Fn::Or` 用法示例
<a name="w2aac24c20c23b9"></a>

如果引用的安全组名称等于 `MyOrCondition` 或者 `sg-mysggroup` 计算为 true，则下面的 `SomeOtherCondition` 计算为 true：

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

```
"MyOrCondition" : {
   "Fn::Or" : [
      {"Fn::Equals" : ["sg-mysggroup", {"Ref" : "ASecurityGroup"}]},
      {"Condition" : "SomeOtherCondition"}
   ]
}
```

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

```
MyOrCondition:
  !Or [!Equals [sg-mysggroup, !Ref ASecurityGroup], Condition: SomeOtherCondition]
```

## 支持的函数
<a name="w2aac24c20c25"></a>

您可以在 `Fn::If` 条件中使用以下函数：
+ `Fn::Base64`
+ `Fn::FindInMap`
+ `Fn::GetAtt`
+ `Fn::GetAZs`
+ `Fn::If`
+ `Fn::Join`
+ `Fn::Select`
+ `Fn::Sub`
+ `Ref`

您可在所有其他条件函数中使用以下函数，如 `Fn::Equals` 和 `Fn::Or`：
+ `Fn::FindInMap`
+ `Ref`
+ 其他条件函数

## 示例模板
<a name="conditions-sample-templates"></a>

### 按条件为生产、开发或测试堆栈创建资源
<a name="w2aac24c20c27b3"></a>

在某些情况下，您可能需要创建类似但略有不同的堆栈。例如，您可能有一个用于生产应用程序的模板。您需要创建相同的生产堆栈来用于开发或测试。但是，对于开发和测试，您可能不需要生产级堆栈中包含的所有额外容量。您可以使用环境类型输入参数按条件创建特定于生产、开发或测试的堆栈资源，如以下示例所示：

您可以为 `prod` 参数指定 `dev`、`test` 或 `EnvType`。对于每种环境类型，模板都指定一个不同的实例类型。实例类型范围可以从大型计算优化实例类型到小型通用实例类型。为了按条件指定实例类型，该模板在模板的 `Conditions` 部分定义两个条件：`CreateProdResources`，如果 `EnvType` 参数值等于 `prod`，则计算为 true；`CreateDevResources`，如果该参数值等于 `dev`，则计算为 true。

在 `InstanceType` 属性中，该模板嵌套了两个 `Fn::If` 内部函数来确定使用哪个实例类型。如果 `CreateProdResources` 条件为 true，则实例类型为 `c5.xlarge`。如果条件为 false，则计算 `CreateDevResources` 条件。如果 `CreateDevResources` 条件为 true，则实例类型为 `t3.medium`，否则实例类型为 `t3.small`。

除实例类型之外，生产环境还向实例创建并附加一个 Amazon EC2 卷。`MountPoint` 和 `NewVolume` 资源与 `CreateProdResources` 条件相关联，目的是仅当条件计算为 true 时才创建资源。

**Example JSON**  

```
{
  "AWSTemplateFormatVersion" : "2010-09-09",
  "Parameters" : {
    "EnvType" : {
      "Description" : "Environment type.",
      "Default" : "test",
      "Type" : "String",
      "AllowedValues" : ["prod", "dev", "test"],
      "ConstraintDescription" : "must specify prod, dev, or test."
    }
  },
  "Conditions" : {
    "CreateProdResources" : {"Fn::Equals" : [{"Ref" : "EnvType"}, "prod"]},
    "CreateDevResources" : {"Fn::Equals" : [{"Ref" : "EnvType"}, "dev"]}
  },
  "Resources" : {
    "EC2Instance" : {
      "Type" : "AWS::EC2::Instance",
      "Properties" : {
        "ImageId" : "ami-1234567890abcdef0",
        "InstanceType" : { "Fn::If" : [
          "CreateProdResources",
          "c5.xlarge",
          {"Fn::If" : [
            "CreateDevResources",
            "t3.medium",
            "t3.small"
          ]}
        ]}
      }
    },
    "MountPoint" : {
      "Type" : "AWS::EC2::VolumeAttachment",
      "Condition" : "CreateProdResources",
      "Properties" : {
        "InstanceId" : { "Ref" : "EC2Instance" },
        "VolumeId"  : { "Ref" : "NewVolume" },
        "Device" : "/dev/sdh"
      }
    },
    "NewVolume" : {
      "Type" : "AWS::EC2::Volume",
      "Condition" : "CreateProdResources",
      "Properties" : {
        "Size" : "100",
        "AvailabilityZone" : { "Fn::GetAtt" : [ "EC2Instance", "AvailabilityZone" ]}
      }
    }
  }
}
```

**Example YAML**  

```
AWSTemplateFormatVersion: "2010-09-09"
Parameters:
  EnvType:
    Description: Environment type.
    Default: test
    Type: String
    AllowedValues: [prod, dev, test]
    ConstraintDescription: must specify prod, dev, or test.
Conditions:
  CreateProdResources: !Equals [!Ref EnvType, prod]
  CreateDevResources: !Equals [!Ref EnvType, "dev"]
Resources:
  EC2Instance:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: ami-1234567890abcdef0
      InstanceType: !If [CreateProdResources, c5.xlarge, !If [CreateDevResources, t3.medium, t3.small]]    
  MountPoint:
    Type: AWS::EC2::VolumeAttachment
    Condition: CreateProdResources
    Properties:
      InstanceId: !Ref EC2Instance
      VolumeId: !Ref NewVolume
      Device: /dev/sdh
  NewVolume:
    Type: AWS::EC2::Volume
    Condition: CreateProdResources
    Properties:
      Size: 100
      AvailabilityZone: !GetAtt EC2Instance.AvailabilityZone
```

**注意**  
有关使用条件创建资源的更复杂示例，请参阅 [`Condition` 属性](aws-attribute-condition.md) 主题。

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

内部函数 `Fn::FindInMap` 返回与 `Mappings` 部分声明的双层映射中的键对应的值。

## 声明
<a name="w2aac24c25b5"></a>

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

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

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

完整函数名称的语法：

```
Fn::FindInMap: [ MapName, TopLevelKey, SecondLevelKey ]
```

短格式的语法：

```
!FindInMap [ MapName, TopLevelKey, SecondLevelKey ]
```

**注意**  
您无法以简短形式嵌套两个函数的两个实例。

## 参数
<a name="w2aac24c25b7"></a>

MapName  <a name="MapName"></a>
Mappings 部分中所声明映射的逻辑名称，包含密钥和值。

TopLevelKey  <a name="TopLevelKey"></a>
顶层密钥名称。其值是一个键值对列表。

SecondLevelKey  <a name="SecondLevelKey"></a>
第二层密钥的名称，设置为分配给 `TopLevelKey` 的列表中的其中一个密钥。

## 返回值
<a name="w2aac24c25b9"></a>

分配给 `SecondLevelKey` 的值。

## 示例
<a name="intrinsic-function-reference-findinmap-examples"></a>

以下示例说明如何使用 `Fn::FindInMap` 函数。

**Topics**
+ [将区域特定的值与 Fn::FindInMap 一起使用](#intrinsic-function-reference-findinmap-region-example)
+ [将 Fn::FindInMap 用于环境特定的配置](#intrinsic-function-reference-findinmap-environment-example)

### 将区域特定的值与 Fn::FindInMap 一起使用
<a name="intrinsic-function-reference-findinmap-region-example"></a>

以下示例说明如何在一个包含两个映射的模板中使用 `Fn::FindInMap`：`AWSInstanceType2Arch` 和 `AWSRegionArch2AMI`。此外还包括一个允许在 `t3.micro` 和 `t4g.nano` 之间进行选择的 `InstanceType` 参数。默认为 `t3.micro`，但可以在创建堆栈期间覆盖。

`Fn::FindInMap` 首先根据选定的实例类型确定架构（`HVM64` 或 `ARM64`），然后在当前 AWS 区域 查找该架构的正确 AMI ID。

**注意**  
这些示例中显示的 AMI ID 是演示用的占位符。应尽量考虑使用 AWS Systems Manager 参数的动态引用，作为 `Mappings` 部分的替代方案。要避免每次要使用的 AMI 发生更改时都使用新 ID 来更新所有模板，请在创建或更新堆栈时使用 AWS Systems Manager 参数来检索最新 AMI ID。常用 AMI 的最新版本也可作为 Systems Manager 中的公有参数提供。有关更多信息，请参阅[使用动态引用获取存储在其他服务中的值](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/dynamic-references.html)。

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

```
{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Parameters": {
    "InstanceType": {
      "Description": "The EC2 instance type",
      "Type": "String",
      "AllowedValues": [
        "t3.micro",
        "t4g.nano"
      ],
      "Default": "t3.micro"
    }
  },
  "Mappings": {
    "AWSInstanceType2Arch": {
      "t3.micro": {
        "Arch": "HVM64"
      },
      "t4g.nano": {
        "Arch": "ARM64"
      }
    },
    "AWSRegionArch2AMI": {
      "us-east-1" : { 
        "HVM64" : "ami-12345678901234567", "ARM64" : "ami-23456789012345678" 
      },
      "us-west-1" : { 
        "HVM64" : "ami-34567890123456789", "ARM64" : "ami-45678901234567890"
      },
      "eu-west-1" : { 
        "HVM64" : "ami-56789012345678901", "ARM64" : "ami-67890123456789012" 
      },
      "ap-southeast-1" : { 
        "HVM64" : "ami-78901234567890123", "ARM64" : "ami-89012345678901234" 
      },
      "ap-northeast-1" : { 
        "HVM64" : "ami-90123456789012345", "ARM64" : "ami-01234567890123456" 
      }
    }
  },
  "Resources" : {
    "MyEC2Instance" : {
      "Type" : "AWS::EC2::Instance",
      "Properties" : {
        "InstanceType" : { "Ref": "InstanceType" },
        "ImageId" : {
          "Fn::FindInMap" : [ "AWSRegionArch2AMI", { "Ref": "AWS::Region" }, { "Fn::FindInMap": [ "AWSInstanceType2Arch", { "Ref": "InstanceType" }, "Arch" ]}]
        }
      }
    }
  }
}
```

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

```
AWSTemplateFormatVersion: 2010-09-09
Parameters:
  InstanceType:
    Description: The EC2 instance type
    Type: String
    AllowedValues:
      - t3.micro
      - t4g.nano
    Default: t3.micro
Mappings: 
  AWSInstanceType2Arch:
    t3.micro:
      Arch: HVM64
    t4g.nano:
      Arch: ARM64
  AWSRegionArch2AMI:
    us-east-1: 
      HVM64: ami-12345678901234567
      ARM64: ami-23456789012345678
    us-west-1: 
      HVM64: ami-34567890123456789
      ARM64: ami-45678901234567890
    eu-west-1: 
      HVM64: ami-56789012345678901
      ARM64: ami-67890123456789012
    ap-southeast-1: 
      HVM64: ami-78901234567890123
      ARM64: ami-89012345678901234
    ap-northeast-1: 
      HVM64: ami-90123456789012345
      ARM64: ami-01234567890123456
Resources: 
  myEC2Instance: 
    Type: AWS::EC2::Instance
    Properties:
      InstanceType: !Ref InstanceType
      ImageId:
        Fn::FindInMap:
        - AWSRegionArch2AMI
        - Ref: AWS::Region
        - Fn::FindInMap:
          - AWSInstanceType2Arch
          - Ref: InstanceType
          - Arch
```

### 将 Fn::FindInMap 用于环境特定的配置
<a name="intrinsic-function-reference-findinmap-environment-example"></a>

下面的示例演示了如何在具有包含单一映射 `SecurityGroups` 的 `Mappings` 部分的模板中使用 `Fn::FindInMap`。它还包含一个 `EnvironmentType` 参数，让您能够指定环境是 `Dev` 还是 `Prod`。该参数默认为 `Dev`，但可以在创建堆栈期间覆盖。

`Fn::FindInMap` 会根据 `EnvironmentType` 参数返回相应的 `SecurityGroupIds`。然后 `Fn::Split` 会将以逗号分隔的安全组 ID 字符串拆分成一个列表，后者是 [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-instance.html#cfn-ec2-instance-securitygroupids](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-instance.html#cfn-ec2-instance-securitygroupids) 预期的格式。

如果您在部署此堆栈时将 `EnvironmentType` 设置为 `Dev`，则 `EC2Instance` 的 `SecurityGroupIds` 将为 `sg-12345678`。如果将 `EnvironmentType` 设置为 `Prod`，则将使用 `sg-abcdef01` 和 `sg-ghijkl23`。

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

```
{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Parameters":{
    "EnvironmentType":{
      "Description":"The environment type (Dev or Prod)",
      "Type":"String",
      "Default":"Dev",
      "AllowedValues":[
        "Dev",
        "Prod"
      ]
    }
  },
  "Mappings":{
    "SecurityGroups":{
      "Dev":{
        "SecurityGroupIds":"sg-12345678"
      },
      "Prod":{
        "SecurityGroupIds":"sg-abcdef01,sg-ghijkl23"
      }
    }
  },
  "Resources":{
    "Ec2Instance":{
      "Type":"AWS::EC2::Instance",
      "Properties":{
        "ImageId": "{{resolve:ssm:/aws/service/ami-amazon-linux-latest/al2023-ami-kernel-6.1-x86_64}}",
        "InstanceType": "t2.micro",
        "SecurityGroupIds":{
          "Fn::Split":[
            ",",
            {
              "Fn::FindInMap":[
                "SecurityGroups",
                {
                  "Ref":"EnvironmentType"
                },
                "SecurityGroupIds"
              ]
            }
          ]
        }
      }
    }
  }
}
```

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

```
AWSTemplateFormatVersion: 2010-09-09
Parameters:
  EnvironmentType:
    Description: The environment type (Dev or Prod)
    Type: String
    Default: Dev
    AllowedValues:
      - Dev
      - Prod
Mappings:
  SecurityGroups:
    Dev:
      SecurityGroupIds: sg-12345678
    Prod:
      SecurityGroupIds: sg-abcdef01,sg-ghijkl23
Resources:
  Ec2Instance:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: '{{resolve:ssm:/aws/service/ami-amazon-linux-latest/al2023-ami-kernel-6.1-x86_64}}'
      InstanceType: t2.micro
      SecurityGroupIds:
        Fn::Split:
          - ","
          - Fn::FindInMap: [ SecurityGroups, !Ref EnvironmentType, SecurityGroupIds ]
```

## 支持的函数
<a name="w2aac24c25c13"></a>

您可以在 `Fn::FindInMap` 函数中使用以下函数：
+ `Fn::FindInMap`
+ `Ref`

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

要使用其他内置函数或 `Fn::FindInMap` 函数中的默认值，您必须在模板中声明 `AWS::LanguageExtensions` 转换。有关更多信息，请参阅 [`Fn::FindInMap enhancements`](intrinsic-function-reference-findinmap-enhancements.md)。

在开发使用 `Fn::FindInMap` 函数的模板时，这些相关主题可能对您有所帮助。
+ [`Fn::Sub`](intrinsic-function-reference-sub.md)
+ 《AWS CloudFormation 用户指南》**中的 [CloudFormation 模板 Mappings 语法](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/mappings-section-structure.html)

# `Fn::ForEach`
<a name="intrinsic-function-reference-foreach"></a>

`Fn::ForEach` 内置函数接受一个集合和一个片段，并将集合中的项目应用于提供的片段中的标识符。`Fn::ForEach` 可以包含其他内置函数，包括 `Fn::ForEach` 本身，并可以在 `Conditions`、`Outputs` 和 `Resources`（包括资源属性）部分中使用。它不能用于以下任何部分：`AWSTemplateFormatVersion`、`Description`、`Metadata`、`Transform`、`Parameters`、`Mappings`、`Rules` 或 `Hooks` 部分。

如果您在模板中使用 `Fn::ForEach` 内置函数，则还必须使用 [`AWS::LanguageExtensions` 转换](transform-aws-languageextensions.md)。

使用 `Fn::ForEach` 内置函数不会更改限额，限额适用于生成的模板。限额包括模板的最大大小和模板中资源的最大数量。有关更多信息，请参阅《AWS CloudFormation 用户指南》**中的 [了解 CloudFormation 配额](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cloudformation-limits.html)。

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

### JSON
<a name="intrinsic-function-reference-foreach-declaration.json"></a>

```
"Fn::ForEach::LoopLogicalName": [
  "Identifier",
  ["Value1","Value2"], // Collection
  {"OutputKey": {OutputValue}}
]
```

### YAML
<a name="intrinsic-function-reference-foreach-declaration.yaml"></a>

```
'Fn::ForEach::LoopLogicalName':
    - Identifier
    - - Value1 # Collection
      - Value2
    - 'OutputKey':
        OutputValue
```

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

*循环逻辑名称*  
循环的逻辑 ID。此名称在模板中必须是唯一的，并且不能与模板 `Resources` 部分中的任何逻辑 ID 值冲突。此名称不在转换后的输出中。它用于 CloudFormation 模板本身的内部引用。

*标识符*  
在 `OutputKey` 和 `OutputValue` 参数中替换占位符的标识符。`OutputKey` 和 `OutputValue` 参数中 `${Identifier}` 或 `&{Identifier}` 的所有实例都将替换为 `Collection` 参数中的值。

*集合*  
要迭代的值的集合。这可以是此参数中的数组，也可以是 [`Ref`](intrinsic-function-reference-ref.md) 到 `CommaDelimitedList`。使用 `&{Identifier}` 时，可以在 `Collection` 中传递非字母数字字符。

*输出密钥*  
转换模板中的密钥。`${Identifier}` 或 `&{Identifier}` 须包含在 `OutputKey` 参数中。例如，如果在模板的 `Resources` 部分中使用 `Fn::ForEach`，则这是每个资源的逻辑 ID。  
`&{}` 语法允许在 `OutputKey` 参数中使用 `Collection` 的非字母数字字符。相关示例，请参阅 [在 `Fn::ForEach` 的 `Collection` 中传递非字母数字字符](intrinsic-function-reference-foreach-example-resource.md#intrinsic-function-reference-foreach-example-non-alphanumeric)。

*输出值*  
在转换后的模板中为 `Collection` 参数中的每个项目复制的值。例如，如果在模板的 `Resources` 部分中使用 `Fn::ForEach`，则这是重复以配置每个资源的模板片段。

## 返回值
<a name="intrinsic-function-reference-foreach-return-value"></a>

一个扩展对象，其中包含为集合中的每个项目重复一次的对象片段，其中，片段中的标识符将替换为集合中的项目。

## 支持的函数
<a name="intrinsic-function-reference-foreach-nested-functions"></a>

您可以在 `Fn::ForEach` 中使用以下函数。
+ 条件函数：
  + [`Fn::And`](intrinsic-function-reference-conditions.md#intrinsic-function-reference-conditions-and)
  + [`Fn::Equals`](intrinsic-function-reference-conditions.md#intrinsic-function-reference-conditions-equals)
  + [`Fn::If`](intrinsic-function-reference-conditions.md#intrinsic-function-reference-conditions-if)
  + [`Fn::Not`](intrinsic-function-reference-conditions.md#intrinsic-function-reference-conditions-not)
  + [`Fn::Or`](intrinsic-function-reference-conditions.md#intrinsic-function-reference-conditions-or)
+ [`Fn::Base64`](intrinsic-function-reference-base64.md)
+ [`Fn::FindInMap`](intrinsic-function-reference-findinmap.md)
+ [`Fn::GetAtt`](intrinsic-function-reference-getatt.md)
+ [`Fn::GetAZs`](intrinsic-function-reference-getavailabilityzones.md)
+ [`Fn::ImportValue`](intrinsic-function-reference-importvalue.md)
+ [`Fn::Join`](intrinsic-function-reference-join.md)
+ [`Fn::Length`](intrinsic-function-reference-length.md)
+ [`Fn::Transform`](intrinsic-function-reference-transform.md)
+ [`Fn::Select`](intrinsic-function-reference-select.md)
+ [`Fn::Sub`](intrinsic-function-reference-sub.md)
+ [`Fn::ToJsonString`](intrinsic-function-reference-ToJsonString.md)
+ [`Ref`](intrinsic-function-reference-ref.md)

## 示例
<a name="intrinsic-function-reference-foreach-example-pointer"></a>

您可以在 [示例](intrinsic-function-reference-foreach-examples.md) 中找到 `Conditions`、`Outputs` 和 `Resources` 部分的示例。

# 示例
<a name="intrinsic-function-reference-foreach-examples"></a>

**Topics**
+ [`Resources` 部分中的 `Fn::ForEach` 示例](intrinsic-function-reference-foreach-example-resource.md)
+ [`Outputs` 部分中的 `Fn::ForEach` 示例](intrinsic-function-reference-foreach-example-outputs.md)
+ [`Conditions` 部分中的 `Fn::ForEach` 示例](intrinsic-function-reference-foreach-example-conditions.md)

# `Resources` 部分中的 `Fn::ForEach` 示例
<a name="intrinsic-function-reference-foreach-example-resource"></a>

这些示例演示了如何使用 `Resources` 部分中的 `Fn::ForEach` 内置函数。有关此部分的更多信息，请参阅《AWS CloudFormation 用户指南》**中的 [Resources](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/resources-section-structure.html)。

**Topics**
+ [复制 Amazon SNS 资源](#intrinsic-function-reference-foreach-example-replicate-resource)
+ [复制 Amazon DynamoDB 资源](#intrinsic-function-reference-foreach-example-replicate-ddb-resource)
+ [复制多个资源](#intrinsic-function-reference-foreach-example-replicate-multiple-resources)
+ [使用嵌套 `Fn::ForEach` 循环复制多个资源](#intrinsic-function-reference-foreach-example-nested-loop-resources)
+ [引用 Amazon EC2 资源的复制属性](#intrinsic-function-reference-foreach-example-reference-replicated-resource)
+ [复制 Amazon EC2 资源的属性](#intrinsic-function-reference-foreach-example-replicate-resource-properties)
+ [在 `Fn::ForEach` 的 `Collection` 中传递非字母数字字符](#intrinsic-function-reference-foreach-example-non-alphanumeric)

## 复制 Amazon SNS 资源
<a name="intrinsic-function-reference-foreach-example-replicate-resource"></a>

此示例片段返回包含四个 Amazon SNS 主题的列表，其逻辑 ID 对应于集合中的项目（`Success`、`Failure`、`Timeout`、`Unknown`），相匹配的 `TopicName` 和 `FifoTopic` 设置为 `true`。

**注意**  
对于需要同时使用 FIFO 和标准主题的模板，您可以使用 `DisplayName` 属性而不是 `TopicName`。这样，当 `FifoTopic` 为 `true` 时，CloudFormation 会自动生成带有相应 `.fifo` 后缀的主题名称。只需在 `Properties` 部分中将 `TopicName` 替换为 `DisplayName: !Ref TopicName` 即可。

### JSON
<a name="intrinsic-function-reference-foreach-example-replicate-resource.json"></a>

```
{
    "AWSTemplateFormatVersion": "2010-09-09",
    "Transform": "AWS::LanguageExtensions",
    "Resources": {
        "Fn::ForEach::Topics": [
            "TopicName",
            ["Success", "Failure", "Timeout", "Unknown"],
            {
                "SnsTopic${TopicName}": {
                    "Type": "AWS::SNS::Topic",
                    "Properties": {
                        "TopicName": {"Fn::Sub": "${TopicName}.fifo"},
                        "FifoTopic": true
                    }
                }
            }
        ]
    }
}
```

### YAML
<a name="intrinsic-function-reference-foreach-example-replicate-resource.yaml"></a>

```
AWSTemplateFormatVersion: 2010-09-09
Transform: AWS::LanguageExtensions
Resources:
  'Fn::ForEach::Topics':
    - TopicName
    - [Success, Failure, Timeout, Unknown]
    - 'SnsTopic${TopicName}':
        Type: AWS::SNS::Topic
        Properties:
          TopicName: !Sub '${TopicName}.fifo'
          FifoTopic: true
```

转换后的模板将等同于以下模板：

```
AWSTemplateFormatVersion: 2010-09-09
Resources:
  SnsTopicSuccess:
    Type: AWS::SNS::Topic
    Properties:
      TopicName: Success.fifo
      FifoTopic: true
  SnsTopicFailure:
    Type: AWS::SNS::Topic
    Properties:
      TopicName: Failure.fifo
      FifoTopic: true
  SnsTopicTimeout:
    Type: AWS::SNS::Topic
    Properties:
      TopicName: Timeout.fifo
      FifoTopic: true
  SnsTopicUnknown:
    Type: AWS::SNS::Topic
    Properties:
      TopicName: Unknown.fifo
      FifoTopic: true
```

## 复制 Amazon DynamoDB 资源
<a name="intrinsic-function-reference-foreach-example-replicate-ddb-resource"></a>

此示例片段创建了四个 [AWS::DynamoDB::Table](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-dynamodb-table.html) 资源，其名称为 `Points`、`Score` 等。

### JSON
<a name="intrinsic-function-reference-foreach-example-replicate-ddb-resource.json"></a>

```
{
    "AWSTemplateFormatVersion": "2010-09-09",
    "Transform": "AWS::LanguageExtensions",
    "Resources": {
        "Fn::ForEach::Tables": [
            "TableName",
            ["Points", "Score", "Name", "Leaderboard"],
            {
                "DynamoDB${TableName}": {
                    "Type": "AWS::DynamoDB::Table",
                    "Properties": {
                        "TableName": {
                            "Ref": "TableName"
                        },
                        "AttributeDefinitions": [
                            {
                                "AttributeName": "id",
                                "AttributeType": "S"
                            }
                        ],
                        "KeySchema": [
                            {
                                "AttributeName": "id",
                                "KeyType": "HASH"
                            }
                        ],
                        "ProvisionedThroughput": {
                            "ReadCapacityUnits": "5",
                            "WriteCapacityUnits": "5"
                        }
                    }
                }
            }
        ]
    }
}
```

### YAML
<a name="intrinsic-function-reference-foreach-example-replicate-ddb-resource.yaml"></a>

```
AWSTemplateFormatVersion: 2010-09-09
Transform: AWS::LanguageExtensions
Resources:
  'Fn::ForEach::Tables':
    - TableName
    - [Points, Score, Name, Leaderboard]
    - 'DynamoDB${TableName}':
        Type: AWS::DynamoDB::Table
        Properties:
          TableName: !Ref TableName
          AttributeDefinitions:
            - AttributeName: id
              AttributeType: S
          KeySchema:
            - AttributeName: id
              KeyType: HASH
          ProvisionedThroughput:
            ReadCapacityUnits: '5'
            WriteCapacityUnits: '5'
```

转换后的模板将等同于以下模板：

```
AWSTemplateFormatVersion: 2010-09-09
Transform: AWS::LanguageExtensions
Resources:
  DynamoDBPoints:
    Type: AWS::DynamoDB::Table
    Properties:
      TableName: Points
      AttributeDefinitions:
        - AttributeName: id
          AttributeType: S
      KeySchema:
        - AttributeName: id
          KeyType: HASH
      ProvisionedThroughput:
        ReadCapacityUnits: '5'
        WriteCapacityUnits: '5'
  DynamoDBScore:
    Type: AWS::DynamoDB::Table
    Properties:
      TableName: Score
      AttributeDefinitions:
        - AttributeName: id
          AttributeType: S
      KeySchema:
        - AttributeName: id
          KeyType: HASH
      ProvisionedThroughput:
        ReadCapacityUnits: '5'
        WriteCapacityUnits: '5'
  DynamoDBName:
    Type: AWS::DynamoDB::Table
    Properties:
      TableName: Name
      AttributeDefinitions:
        - AttributeName: id
          AttributeType: S
      KeySchema:
        - AttributeName: id
          KeyType: HASH
      ProvisionedThroughput:
        ReadCapacityUnits: '5'
        WriteCapacityUnits: '5'
  DynamoDBLeaderboard:
    Type: AWS::DynamoDB::Table
    Properties:
      TableName: Leaderboard
      AttributeDefinitions:
        - AttributeName: id
          AttributeType: S
      KeySchema:
        - AttributeName: id
          KeyType: HASH
      ProvisionedThroughput:
        ReadCapacityUnits: '5'
        WriteCapacityUnits: '5'
```

## 复制多个资源
<a name="intrinsic-function-reference-foreach-example-replicate-multiple-resources"></a>

此示例使用命名约定 `"{ResourceType}${Identifier}"` 创建了多个 [AWS::EC2::NatGateway](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-natgateway.html) 和 [AWS::EC2::EIP](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-eip.html) 实例。您可以在单个 `Fn::ForEach` 循环中声明多个资源类型，以利用单个标识符。

集合中每个元素的唯一值在 `Mappings` 部分中定义，其中 [`Fn::FindInMap`](intrinsic-function-reference-findinmap.md) 内置函数用于引用相应的值。如果 `Fn::FindInMap` 无法找到相应的标识符，则 `Condition` 属性将不会设置为解析为 `!Ref AWS:::NoValue`。

### JSON
<a name="intrinsic-function-reference-foreach-example-replicate-multiple-resources.json"></a>

```
{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Transform": "AWS::LanguageExtensions",
  "Conditions": {
    "TwoNatGateways": {"Fn::Equals": [{"Ref": "AWS::Region"}, "us-east-1"]},
    "ThreeNatGateways": {"Fn::Equals": [{"Ref": "AWS::Region"}, "us-west-2"]}
  },
  "Mappings": {
    "NatGateway": {
      "Condition": {
        "B": "TwoNatGateways",
        "C": "ThreeNatGateways"
      }
    }
  },
  "Resources": {
    "VPC": {
      "Type": "AWS::EC2::VPC",
      "Properties": {"CidrBlock": "10.0.0.0/16"}
    },
    "PublicSubnetA": {
      "Type": "AWS::EC2::Subnet",
      "Properties": {
        "VpcId": {"Ref": "VPC"},
        "CidrBlock": "10.0.1.0/24",
        "AvailabilityZone": {"Fn::Select": [0, {"Fn::GetAZs": ""}]}
      }
    },
    "PublicSubnetB": {
      "Type": "AWS::EC2::Subnet",
      "Properties": {
        "VpcId": {"Ref": "VPC"},
        "CidrBlock": "10.0.2.0/24",
        "AvailabilityZone": {"Fn::Select": [1, {"Fn::GetAZs": ""}]}
      }
    },
    "PublicSubnetC": {
      "Type": "AWS::EC2::Subnet",
      "Properties": {
        "VpcId": {"Ref": "VPC"},
        "CidrBlock": "10.0.3.0/24",
        "AvailabilityZone": {"Fn::Select": [2, {"Fn::GetAZs": ""}]}
      }
    },
    "Fn::ForEach::NatGatewayAndEIP": [
      "Identifier",
      [ "A", "B", "C" ],
      {
        "NatGateway${Identifier}": {
          "Type": "AWS::EC2::NatGateway",
          "Properties": {
            "AllocationId": {"Fn::GetAtt": [{"Fn::Sub": "NatGatewayAttachment${Identifier}"}, "AllocationId"]},
            "SubnetId": {"Ref": {"Fn::Sub": "PublicSubnet${Identifier}"}}
          },
          "Condition": {"Fn::FindInMap": ["NatGateway", "Condition", {"Ref": "Identifier"}, {"DefaultValue": {"Ref": "AWS::NoValue"}}]}
        },
        "NatGatewayAttachment${Identifier}": {
          "Type": "AWS::EC2::EIP",
          "Properties": {
            "Domain": "vpc"
          },
          "Condition": {"Fn::FindInMap": ["NatGateway", "Condition", {"Ref": "Identifier"}, {"DefaultValue": {"Ref": "AWS::NoValue"}}]}
        }
      }
    ]
  }
}
```

### YAML
<a name="intrinsic-function-reference-foreach-example-replicate-multiple-resources.yaml"></a>

```
AWSTemplateFormatVersion: 2010-09-09
Transform: AWS::LanguageExtensions
Conditions:
  TwoNatGateways: !Equals [!Ref "AWS::Region", "us-east-1"]
  ThreeNatGateways: !Equals [!Ref "AWS::Region", "us-west-2"]
Mappings:
  NatGateway:
    Condition:
      B: TwoNatGateways
      C: ThreeNatGateways
Resources:
  VPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.0.0.0/16
  PublicSubnetA:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC
      CidrBlock: 10.0.1.0/24
      AvailabilityZone: !Select [0, !GetAZs ""]
  PublicSubnetB:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC
      CidrBlock: 10.0.2.0/24
      AvailabilityZone: !Select [1, !GetAZs ""]
  PublicSubnetC:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC
      CidrBlock: 10.0.3.0/24
      AvailabilityZone: !Select [2, !GetAZs ""]
  Fn::ForEach::NatGatewayAndEIP:
    - Identifier
    - - A
      - B
      - C
    - NatGateway${Identifier}:
        Type: AWS::EC2::NatGateway
        Properties:
          AllocationId: !GetAtt
            - !Sub NatGatewayAttachment${Identifier}
            - AllocationId
          SubnetId: !Ref
            Fn::Sub: PublicSubnet${Identifier}
        Condition: !FindInMap
          - NatGateway
          - Condition
          - !Ref Identifier
          - DefaultValue: !Ref AWS::NoValue
      NatGatewayAttachment${Identifier}:
        Type: AWS::EC2::EIP
        Properties:
          Domain: vpc
        Condition: !FindInMap
          - NatGateway
          - Condition
          - !Ref Identifier
          - DefaultValue: !Ref AWS::NoValue
```

转换后的模板将等同于以下模板：

```
AWSTemplateFormatVersion: 2010-09-09
Transform: AWS::LanguageExtensions
Conditions:
  TwoNatGateways: !Equals [!Ref "AWS::Region", "us-east-1"]
  ThreeNatGateways: !Equals [!Ref "AWS::Region", "us-west-2"]
Resources:
  VPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.0.0.0/16
  PublicSubnetA:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC
      CidrBlock: 10.0.1.0/24
      AvailabilityZone: !Select [0, !GetAZs ""]
  PublicSubnetB:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC
      CidrBlock: 10.0.2.0/24
      AvailabilityZone: !Select [1, !GetAZs ""]
  PublicSubnetC:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC
      CidrBlock: 10.0.3.0/24
      AvailabilityZone: !Select [2, !GetAZs ""]
  NatGatewayA:
    Type: AWS::EC2::NatGateway
    Properties:
      AllocationId: !GetAtt
        - NatGatewayAttachmentA
        - AllocationId
      SubnetId: !Ref PublicSubnetA
  NatGatewayB:
    Type: AWS::EC2::NatGateway
    Properties:
      AllocationId: !GetAtt
        - NatGatewayAttachmentB
        - AllocationId
      SubnetId: !Ref PublicSubnetB
    Condition: TwoNatGateways
  NatGatewayC:
    Type: AWS::EC2::NatGateway
    Properties:
      AllocationId: !GetAtt
        - NatGatewayAttachmentC
        - AllocationId
      SubnetId: !Ref PublicSubnetC
    Condition: ThreeNatGateways
  NatGatewayAttachmentA:
    Type: AWS::EC2::EIP
    Properties:
      Domain: vpc
  NatGatewayAttachmentB:
    Type: AWS::EC2::EIP
    Properties:
      Domain: vpc
    Condition: TwoNatGateways
  NatGatewayAttachmentC:
    Type: AWS::EC2::EIP
    Properties:
      Domain: vpc
    Condition: ThreeNatGateways
```

## 使用嵌套 `Fn::ForEach` 循环复制多个资源
<a name="intrinsic-function-reference-foreach-example-nested-loop-resources"></a>

此示例使用嵌套的 `Fn::ForEach` 循环将三个资源（[AWS::EC2::NetworkAcl](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-natgateway.html)、[AWS::EC2::Subnet](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-subnet.html) 和 [AWS::EC2::SubnetNetworkAclAssociation](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-subnetnetworkaclassociation.html)）相互映射。

### JSON
<a name="intrinsic-function-reference-foreach-example-nested-loop-resources.json"></a>

```
{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Transform": "AWS::LanguageExtensions",
  "Resources": {
    "VPC": {
      "Type": "AWS::EC2::VPC",
      "Properties": {
        "CidrBlock": "10.0.0.0/16",
        "EnableDnsSupport": "true",
        "EnableDnsHostnames": "true"
      }
    },
    "Fn::ForEach::SubnetResources": [
      "Prefix",
      [
        "Transit",
        "Public"
      ],
      {
        "Nacl${Prefix}Subnet": {
          "Type": "AWS::EC2::NetworkAcl",
          "Properties": {
            "VpcId": {
              "Ref": "VPC"
            }
          }
        },
        "Fn::ForEach::LoopInner": [
          "Suffix",
          [
            "A",
            "B",
            "C"
          ],
          {
            "${Prefix}Subnet${Suffix}": {
              "Type": "AWS::EC2::Subnet",
              "Properties": {
                "VpcId": {
                  "Ref": "VPC"
                }
              }
            },
            "Nacl${Prefix}Subnet${Suffix}Association": {
              "Type": "AWS::EC2::SubnetNetworkAclAssociation",
              "Properties": {
                "SubnetId": {
                  "Ref": {
                    "Fn::Sub": "${Prefix}Subnet${Suffix}"
                  }
                },
                "NetworkAclId": {
                  "Ref": {
                    "Fn::Sub": "Nacl${Prefix}Subnet"
                  }
                }
              }
            }
          }
        ]
      }
    ]
  }
}
```

### YAML
<a name="intrinsic-function-reference-foreach-example-nested-loop-resources.yaml"></a>

```
AWSTemplateFormatVersion: 2010-09-09
Transform: AWS::LanguageExtensions
Resources:
  VPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.0.0.0/16
      EnableDnsSupport: 'true'
      EnableDnsHostnames: 'true'
  'Fn::ForEach::SubnetResources':
  - Prefix
  - [Transit, Public]
  - 'Nacl${Prefix}Subnet':
      Type: AWS::EC2::NetworkAcl
      Properties:
        VpcId: !Ref 'VPC'
    'Fn::ForEach::LoopInner':
    - Suffix
    - [A, B, C]
    - '${Prefix}Subnet${Suffix}':
        Type: AWS::EC2::Subnet
        Properties:
          VpcId: !Ref 'VPC'
      'Nacl${Prefix}Subnet${Suffix}Association':
        Type: AWS::EC2::SubnetNetworkAclAssociation
        Properties:
          SubnetId: !Ref
            'Fn::Sub': '${Prefix}Subnet${Suffix}'
          NetworkAclId: !Ref
            'Fn::Sub': 'Nacl${Prefix}Subnet'
```

转换后的模板将等同于以下模板：

```
AWSTemplateFormatVersion: 2010-09-09
Transform: AWS::LanguageExtensions
Resources:
  VPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.0.0.0/16
      EnableDnsSupport: 'true'
      EnableDnsHostnames: 'true'
  NaclTransitSubnet:
    Type: AWS::EC2::NetworkAcl
    Properties:
      VpcId: !Ref VPC
  TransitSubnetA:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC
  NaclTransitSubnetAAssociation:
    Type: AWS::EC2::SubnetNetworkAclAssociation
    Properties:
      SubnetId: !Ref TransitSubnetA
      NetworkAclId: !Ref NaclTransitSubnet
  TransitSubnetB:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC
  NaclTransitSubnetBAssociation:
    Type: AWS::EC2::SubnetNetworkAclAssociation
    Properties:
      SubnetId: !Ref TransitSubnetB
      NetworkAclId: !Ref NaclTransitSubnet
  TransitSubnetC:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC
  NaclTransitSubnetCAssociation:
    Type: AWS::EC2::SubnetNetworkAclAssociation
    Properties:
      SubnetId: !Ref TransitSubnetC
      NetworkAclId: !Ref NaclTransitSubnet
  NaclPublicSubnet:
    Type: AWS::EC2::NetworkAcl
    Properties:
      VpcId: !Ref VPC
  PublicSubnetA:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC
  NaclPublicSubnetAAssociation:
    Type: AWS::EC2::SubnetNetworkAclAssociation
    Properties:
      SubnetId: !Ref PublicSubnetA
      NetworkAclId: !Ref NaclPublicSubnet
  PublicSubnetB:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC
  NaclPublicSubnetBAssociation:
    Type: AWS::EC2::SubnetNetworkAclAssociation
    Properties:
      SubnetId: !Ref PublicSubnetB
      NetworkAclId: !Ref NaclPublicSubnet
  PublicSubnetC:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC
  NaclPublicSubnetCAssociation:
    Type: AWS::EC2::SubnetNetworkAclAssociation
    Properties:
      SubnetId: !Ref PublicSubnetC
      NetworkAclId: !Ref NaclPublicSubnet
```

## 引用 Amazon EC2 资源的复制属性
<a name="intrinsic-function-reference-foreach-example-reference-replicated-resource"></a>

此示例使用 `Fn::ForEach` 内置函数来引用复制的 [AWS::EC2::Instance](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-instance.html) 资源。

### JSON
<a name="intrinsic-function-reference-foreach-example-reference-replicated-resource.json"></a>

```
{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Transform": "AWS::LanguageExtensions",
  "Mappings": {
    "Instances": {
      "InstanceType": {
        "B": "m5.4xlarge",
        "C": "c5.2xlarge"
      },
      "ImageId": {"A": "ami-id1"}
    }
  },
  "Resources": {
    "Fn::ForEach::Instances": [
      "Identifier",
      [
        "A",
        "B",
        "C"
      ],
      {
        "Instance${Identifier}": {
          "Type": "AWS::EC2::Instance",
          "Properties": {
            "InstanceType": {"Fn::FindInMap": ["Instances", "InstanceType", {"Ref": "Identifier"}, {"DefaultValue": "m5.xlarge"}]},
            "ImageId": {"Fn::FindInMap": ["Instances", "ImageId", {"Ref": "Identifier"}, {"DefaultValue": "ami-id-default"}]}
          }
        }
      }
    ]
  },
  "Outputs": {
    "SecondInstanceId": {
      "Description": "Instance Id for InstanceB",
      "Value": {"Ref": "InstanceB"}
    },
    "SecondPrivateIp": {
      "Description": "Private IP for InstanceB",
      "Value": {
        "Fn::GetAtt": [
          "InstanceB",
          "PrivateIp"
        ]
      }
    }
  }
}
```

### YAML
<a name="intrinsic-function-reference-foreach-example-reference-replicated-resource.yaml"></a>

```
AWSTemplateFormatVersion: 2010-09-09
Transform: AWS::LanguageExtensions
Mappings:
  Instances:
    InstanceType:
      B: m5.4xlarge
      C: c5.2xlarge
    ImageId:
      A: ami-id1
Resources:
  'Fn::ForEach::Instances':
  - Identifier
  - [A, B, C]
  - 'Instance${Identifier}':
      Type: AWS::EC2::Instance
      Properties:
        InstanceType: !FindInMap [Instances, InstanceType, !Ref 'Identifier', {DefaultValue: m5.xlarge}]
        ImageId: !FindInMap [Instances, ImageId, !Ref 'Identifier', {DefaultValue: ami-id-default}]
Outputs:
  SecondInstanceId:
    Description: Instance Id for InstanceB
    Value: !Ref 'InstanceB'
  SecondPrivateIp:
    Description: Private IP for InstanceB
    Value: !GetAtt [InstanceB, PrivateIp]
```

转换后的模板将等同于以下模板：

```
AWSTemplateFormatVersion: 2010-09-09
Transform: AWS::LanguageExtensions
Resources:
  InstanceA:
    Type: AWS::EC2::Instance
    Properties:
      InstanceType: m5.xlarge
      ImageId: ami-id1
  InstanceB:
    Type: AWS::EC2::Instance
    Properties:
      InstanceType: m5.4xlarge
      ImageId: ami-id-default
  InstanceC:
    Type: AWS::EC2::Instance
    Properties:
      InstanceType: c5.2xlarge
      ImageId: ami-id-default
Outputs:
  SecondInstanceId:
    Description: Instance Id for InstanceB
    Value: !Ref InstanceB
  SecondPrivateIp:
    Description: Private IP for InstanceB
    Value: !GetAtt [InstanceB, PrivateIp]
```

## 复制 Amazon EC2 资源的属性
<a name="intrinsic-function-reference-foreach-example-replicate-resource-properties"></a>

此示例使用 `Fn::ForEach` 内置函数将某些属性（例如 `ImageId`、`InstanceType` 和 `AvailabilityZone`）重复到 [AWS::EC2::Instance](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-instance.html) 资源。

### JSON
<a name="intrinsic-function-reference-foreach-example-replicate-resource-properties.json"></a>

```
{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Transform": "AWS::LanguageExtensions",
  "Mappings": {
    "InstanceA": {
      "Properties": {
        "ImageId": "ami-id1",
        "InstanceType": "m5.xlarge"
      }
    },
    "InstanceB": {
      "Properties": {
        "ImageId": "ami-id2"
      }
    },
    "InstanceC": {
      "Properties": {
        "ImageId": "ami-id3",
        "InstanceType": "m5.2xlarge",
        "AvailabilityZone": "us-east-1a"
      }
    }
  },
  "Resources": {
    "Fn::ForEach::Instances": [
      "InstanceLogicalId",
      [ "InstanceA", "InstanceB", "InstanceC" ],
      {
        "${InstanceLogicalId}": {
          "Type": "AWS::EC2::Instance",
          "Properties": {
            "DisableApiTermination": true,
            "UserData": {
              "Fn::Base64": {
                "Fn::Join": [
                  "",
                  [
                    "#!/bin/bash\n",
                    "yum update -y\n",
                    "yum install -y httpd.x86_64\n",
                    "systemctl start httpd.service\n",
                    "systemctl enable httpd.service\n",
                    "echo \"Hello World from $(hostname -f)\" > /var/www/html/index.html\n"
                  ]
                ]
              }
            },
            "Fn::ForEach::Properties": [
              "PropertyName",
              [ "ImageId", "InstanceType", "AvailabilityZone" ],
              {
                "${PropertyName}": {
                  "Fn::FindInMap": [
                    { "Ref": "InstanceLogicalId" },
                    "Properties",
                    { "Ref": "PropertyName"},
                    {
                      "DefaultValue": { "Ref": "AWS::NoValue" }
                    }
                  ]
                }
              }
            ]
          }
        }
      }
    ]
  }
}
```

### YAML
<a name="intrinsic-function-reference-foreach-example-replicate-resource-properties.yaml"></a>

```
AWSTemplateFormatVersion: 2010-09-09
Transform: AWS::LanguageExtensions
Mappings:
  InstanceA:
    Properties:
      ImageId: ami-id1
      InstanceType: m5.xlarge
  InstanceB:
    Properties:
      ImageId: ami-id2
  InstanceC:
    Properties:
      ImageId: ami-id3
      InstanceType: m5.2xlarge
      AvailabilityZone: us-east-1a
Resources:
  'Fn::ForEach::Instances':
  - InstanceLogicalId
  - [InstanceA, InstanceB, InstanceC]
  - '${InstanceLogicalId}':
      Type: AWS::EC2::Instance
      Properties:
        DisableApiTermination: true
        UserData:
          Fn::Base64: !Sub |
            #!/bin/bash
            yum update -y
            yum install -y httpd.x86_64
            systemctl start httpd.service
            systemctl enable httpd.service
            echo "Hello World from $(hostname -f)" > /var/www/html/index.html
        'Fn::ForEach::Properties':
          - PropertyName
          - [ImageId, InstanceType, AvailabilityZone]
          - '${PropertyName}':
             'Fn::FindInMap':
               - Ref: 'InstanceLogicalId'
               - Properties
               - Ref: 'PropertyName'
               - {DefaultValue: !Ref 'AWS::NoValue'}
```

转换后的模板将等同于以下模板：

```
AWSTemplateFormatVersion: 2010-09-09
Transform: AWS::LanguageExtensions
Resources:
  InstanceA:
    Type: AWS::EC2::Instance
    Properties:
      DisableApiTermination: true
      UserData:
        Fn::Base64: 
          !Sub |
            #!/bin/bash
            yum update -y
            yum install -y httpd.x86_64
            systemctl start httpd.service
            systemctl enable httpd.service
            echo "Hello World from $(hostname -f)" > /var/www/html/index.html
      ImageId: ami-id1
      InstanceType: m5.xlarge
  InstanceB:
    Type: AWS::EC2::Instance
    Properties:
      DisableApiTermination: true
      UserData:
        Fn::Base64: 
          !Sub |
            #!/bin/bash
            yum update -y
            yum install -y httpd.x86_64
            systemctl start httpd.service
            systemctl enable httpd.service
            echo "Hello World from $(hostname -f)" > /var/www/html/index.html
      ImageId: ami-id2
  InstanceC:
    Type: AWS::EC2::Instance
    Properties:
      DisableApiTermination: true
      UserData:
        Fn::Base64: 
          !Sub |
            #!/bin/bash
            yum update -y
            yum install -y httpd.x86_64
            systemctl start httpd.service
            systemctl enable httpd.service
            echo "Hello World from $(hostname -f)" > /var/www/html/index.html
      ImageId: ami-id3
      InstanceType: m5.2xlarge
      AvailabilityZone: us-east-1a
```

## 在 `Fn::ForEach` 的 `Collection` 中传递非字母数字字符
<a name="intrinsic-function-reference-foreach-example-non-alphanumeric"></a>

此示例使用 `&{}` 语法，该语法允许在 `Collection` 中传递 IP 地址中的非字母数字字符（`.` 和 `/`）。

### JSON
<a name="intrinsic-function-reference-foreach-example-non-alphanumeric-json.json"></a>

```
{
    "AWSTemplateFormatVersion": "2010-09-09",
    "Transform": "AWS::LanguageExtensions",
    "Parameters": {
        "IpAddresses": {
            "Type": "CommaDelimitedList",
            "Default": "10.0.2.0/24,10.0.3.0/24,10.0.4.0/24"
        }
    },
    "Resources": {
        "VPC": {
            "Type": "AWS::EC2::VPC",
            "Properties": {
                "CidrBlock": "10.0.0.0/16",
                "EnableDnsSupport": "true",
                "EnableDnsHostnames": "true"
            }
        },
        "Fn::ForEach::Subnets": [
            "CIDR",
            {
                "Ref": "IpAddresses"
            },
            {
                "Subnet&{CIDR}": {
                    "Type": "AWS::EC2::Subnet",
                    "Properties": {
                        "VpcId": {
                            "Ref": "VPC"
                        },
                        "CidrBlock": {
                            "Ref": "CIDR"
                        }
                    }
                }
            }
        ]
    }
}
```

### YAML
<a name="intrinsic-function-reference-foreach-example-non-alphanumeric-yaml.yaml"></a>

```
AWSTemplateFormatVersion: 2010-09-09
Transform: AWS::LanguageExtensions
Parameters:
  IpAddresses:
    Type: CommaDelimitedList
    Default: '10.0.2.0/24,10.0.3.0/24,10.0.4.0/24'
Resources:
  VPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.0.0.0/16
      EnableDnsSupport: 'true'
      EnableDnsHostnames: 'true'
  'Fn::ForEach::Subnets':
    - CIDR
    - !Ref IpAddresses
    - 'Subnet&{CIDR}':
        Type: AWS::EC2::Subnet
        Properties:
          VpcId: !Ref VPC
          CidrBlock: !Ref CIDR
```

转换后的模板将等同于以下模板：

```
AWSTemplateFormatVersion: 2010-09-09
Transform: AWS::LanguageExtensions
Parameters:
  IpAddresses:
    Type: CommaDelimitedList
    Default: '10.0.2.0/24,10.0.3.0/24,10.0.4.0/24'
Resources:
  VPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.0.0.0/16
      EnableDnsSupport: 'true'
      EnableDnsHostnames: 'true'
  Subnet1002024:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC
      CidrBlock: 10.0.2.0/24
  Subnet1003024:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC
      CidrBlock: 10.0.3.0/24
  Subnet1004024:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC
      CidrBlock: 10.0.4.0/24
```

# `Outputs` 部分中的 `Fn::ForEach` 示例
<a name="intrinsic-function-reference-foreach-example-outputs"></a>

这些示例演示了如何使用 `Outputs` 部分中的 `Fn::ForEach` 内置函数。有关此部分的更多信息，请参阅《AWS CloudFormation 用户指南》**中的 [Outputs](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/outputs-section-structure.html)。

**Topics**
+ [引用复制的 `AWS::S3::Bucket` 资源](#intrinsic-function-reference-foreach-example-replicate-outputs)
+ [引用复制的 `AWS::EC2::Instance` 资源](#intrinsic-function-reference-foreach-example-replicate-conditions)

## 引用复制的 `AWS::S3::Bucket` 资源
<a name="intrinsic-function-reference-foreach-example-replicate-outputs"></a>

此示例使用 `Outputs` 部分中的嵌套 `Fn::ForEach` 循环来缩短模板长度。

### JSON
<a name="intrinsic-function-reference-foreach-example-replicate-outputs.json"></a>

```
{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Transform": "AWS::LanguageExtensions",
  "Resources": {
    "Fn::ForEach::Buckets": [
      "Identifier",
      [ "A", "B", "C" ],
      {
        "S3Bucket${Identifier}": {
          "Type": "AWS::S3::Bucket",
          "Properties": {
            "AccessControl": "PublicRead",
            "MetricsConfigurations": [
              {
                "Id": {"Fn::Sub": "EntireBucket${Identifier}"}
              }
            ],
            "WebsiteConfiguration": {
              "IndexDocument": "index.html",
              "ErrorDocument": "error.html",
              "RoutingRules": [
                {
                  "RoutingRuleCondition": {
                    "HttpErrorCodeReturnedEquals": "404",
                    "KeyPrefixEquals": "out1/"
                  },
                  "RedirectRule": {
                    "HostName": "ec2-11-22-333-44.compute-1.amazonaws.com",
                    "ReplaceKeyPrefixWith": "report-404/"
                  }
                }
              ]
            }
          },
          "DeletionPolicy": "Retain",
          "UpdateReplacePolicy": "Retain"
        }
      }
    ]
  },
  "Outputs": {
    "Fn::ForEach::BucketOutputs": [
      "Identifier",
      [ "A", "B", "C" ],
      {
        "Fn::ForEach::GetAttLoop": [
          "Property",
          [ "Arn", "DomainName", "WebsiteURL" ],
          {
            "S3Bucket${Identifier}${Property}": {
              "Value": {"Fn::GetAtt": [{"Fn::Sub": "S3Bucket${Identifier}"}, {"Ref": "Property"}]}
            }
          }
        ]
      }
    ]
  }
}
```

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

```
AWSTemplateFormatVersion: 2010-09-09
Transform: AWS::LanguageExtensions
Resources:
  'Fn::ForEach::Buckets':
    - Identifier
    - [A, B, C]
    - 'S3Bucket${Identifier}':
        Type: AWS::S3::Bucket
        Properties:
          AccessControl: PublicRead
          MetricsConfigurations:
            - Id: !Sub 'EntireBucket${Identifier}'
          WebsiteConfiguration:
            IndexDocument: index.html
            ErrorDocument: error.html
            RoutingRules:
              - RoutingRuleCondition:
                  HttpErrorCodeReturnedEquals: '404'
                  KeyPrefixEquals: out1/
                RedirectRule:
                  HostName: ec2-11-22-333-44.compute-1.amazonaws.com
                  ReplaceKeyPrefixWith: report-404/
        DeletionPolicy: Retain
        UpdateReplacePolicy: Retain
Outputs:
  'Fn::ForEach::BucketOutputs':
    - Identifier
    - [A, B, C]
    - 'Fn::ForEach::GetAttLoop':
        - Property
        - [Arn, DomainName, WebsiteURL]
        - 'S3Bucket${Identifier}${Property}':
            Value: !GetAtt [!Sub 'S3Bucket${Identifier}', !Ref Property]
```

转换后的模板将等同于以下模板：

```
AWSTemplateFormatVersion: 2010-09-09
Transform: AWS::LanguageExtensions
Resources:
  S3BucketA:
    Type: AWS::S3::Bucket
    Properties:
      AccessControl: PublicRead
      MetricsConfigurations:
        - Id: EntireBucketA
      WebsiteConfiguration:
        IndexDocument: index.html
        ErrorDocument: error.html
        RoutingRules:
          - RoutingRuleCondition:
              HttpErrorCodeReturnedEquals: '404'
              KeyPrefixEquals: out1/
            RedirectRule:
              HostName: ec2-11-22-333-44.compute-1.amazonaws.com
              ReplaceKeyPrefixWith: report-404/
    DeletionPolicy: Retain
    UpdateReplacePolicy: Retain
  S3BucketB:
    Type: AWS::S3::Bucket
    Properties:
      AccessControl: PublicRead
      MetricsConfigurations:
        - Id: EntireBucketB
      WebsiteConfiguration:
        IndexDocument: index.html
        ErrorDocument: error.html
        RoutingRules:
          - RoutingRuleCondition:
              HttpErrorCodeReturnedEquals: '404'
              KeyPrefixEquals: out1/
            RedirectRule:
              HostName: ec2-11-22-333-44.compute-1.amazonaws.com
              ReplaceKeyPrefixWith: report-404/
    DeletionPolicy: Retain
    UpdateReplacePolicy: Retain
  S3BucketC:
    Type: AWS::S3::Bucket
    Properties:
      AccessControl: PublicRead
      MetricsConfigurations:
        - Id: EntireBucketC
      WebsiteConfiguration:
        IndexDocument: index.html
        ErrorDocument: error.html
        RoutingRules:
          - RoutingRuleCondition:
              HttpErrorCodeReturnedEquals: '404'
              KeyPrefixEquals: out1/
            RedirectRule:
              HostName: ec2-11-22-333-44.compute-1.amazonaws.com
              ReplaceKeyPrefixWith: report-404/
    DeletionPolicy: Retain
    UpdateReplacePolicy: Retain
Outputs:
  S3BucketAArn:
    Value: !GetAtt [S3BucketA, Arn]
  S3BucketADomainName:
    Value: !GetAtt [S3BucketA, DomainName]
  S3BucketAWebsiteURL:
    Value: !GetAtt [S3BucketA, WebsiteURL]
  S3BucketBArn:
    Value: !GetAtt [S3BucketB, Arn]
  S3BucketBDomainName:
    Value: !GetAtt [S3BucketB, DomainName]
  S3BucketBWebsiteURL:
    Value: !GetAtt [S3BucketB, WebsiteURL]
  S3BucketCArn:
    Value: !GetAtt [S3BucketC, Arn]
  S3BucketCDomainName:
    Value: !GetAtt [S3BucketC, DomainName]
  S3BucketCWebsiteURL:
    Value: !GetAtt [S3BucketC, WebsiteURL]
```

## 引用复制的 `AWS::EC2::Instance` 资源
<a name="intrinsic-function-reference-foreach-example-replicate-conditions"></a>

此示例使用生成的逻辑 ID 引用 `Resources` 部分中复制的资源。

### JSON
<a name="intrinsic-function-reference-foreach-example-replicate-conditions.json"></a>

```
{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Transform": "AWS::LanguageExtensions",
  "Mappings": {
    "Instances": {
      "InstanceType": {
        "B": "m5.4xlarge",
        "C": "c5.2xlarge"
      },
      "ImageId": {"A": "ami-id1"}
    }
  },
  "Resources": {
    "Fn::ForEach::Instances": [
      "Identifier",
      [ "A", "B", "C" ],
      {
        "Instance${Identifier}": {
          "Type": "AWS::EC2::Instance",
          "Properties": {
            "InstanceType": {"Fn::FindInMap": ["Instances", "InstanceType", {"Ref": "Identifier"}, {"DefaultValue": "m5.xlarge"}]},
            "ImageId": {"Fn::FindInMap": ["Instances", "ImageId", {"Ref": "Identifier"}, {"DefaultValue": "ami-id-default"}]}
          }
        }
      }
    ]
  },
  "Outputs": {
    "SecondInstanceId": {
      "Description": "Instance Id for InstanceB",
      "Value": {"Ref": "InstanceB"}
    },
    "SecondPrivateIp": {
      "Description": "Private IP for InstanceB",
      "Value": {
        "Fn::GetAtt": [
          "InstanceB",
          "PrivateIp"
        ]
      }
    }
  }
}
```

### YAML
<a name="intrinsic-function-reference-foreach-example-replicate-conditions.yaml"></a>

```
AWSTemplateFormatVersion: 2010-09-09
Transform: AWS::LanguageExtensions
Mappings:
  Instances:
    InstanceType:
      B: m5.4xlarge
      C: c5.2xlarge
    ImageId:
      A: ami-id1
Resources:
  'Fn::ForEach::Instances':
    - Identifier
    - [A, B, C]
    - 'Instance${Identifier}':
        Type: AWS::EC2::Instance
        Properties:
          InstanceType: !FindInMap [Instances, InstanceType, !Ref Identifier, DefaultValue: m5.xlarge]
          ImageId: !FindInMap [Instances, ImageId, !Ref Identifier, DefaultValue: ami-id-default]
Outputs:
  SecondInstanceId:
    Description: Instance Id for InstanceB
    Value: !Ref InstanceB
  SecondPrivateIp:
    Description: Private IP for InstanceB
    Value: !GetAtt [InstanceB, PrivateIp]
```

转换后的模板将等同于以下模板：

```
AWSTemplateFormatVersion: 2010-09-09
Transform: AWS::LanguageExtensions
Resources:
  InstanceA:
    Type: AWS::EC2::Instance
    Properties:
      InstanceType: m5.xlarge
      ImageId: ami-id1
  InstanceB:
    Type: AWS::EC2::Instance
    Properties:
      InstanceType: m5.4xlarge
      ImageId: ami-id-default
  InstanceC:
    Type: AWS::EC2::Instance
    Properties:
      InstanceType: c5.2xlarge
      ImageId: ami-id-default
Outputs:
  SecondInstanceId:
    Description: Instance Id for InstanceB
    Value: !Ref InstanceB
  SecondPrivateIp:
    Description: Private IP for InstanceB
    Value: !GetAtt [InstanceB, PrivateIp]
```

# `Conditions` 部分中的 `Fn::ForEach` 示例
<a name="intrinsic-function-reference-foreach-example-conditions"></a>

这些示例演示了如何使用 `Conditions` 部分中的 `Fn::ForEach` 内置函数。有关此部分的更多信息，请参阅《AWS CloudFormation 用户指南》**中的 [Conditions](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/conditions-section-structure.html)。

**重要**  
`Conditions` 必须是列出的第二个属性或更高属性。如果 `Conditions` 是 `Fn::ForEach` 的模板片段参数中列出的第一个属性，则堆栈创建将失败。

```
Resources:
  'Fn::ForEach::Topics':
    - LogicalId
    - !Ref TopicList
    - '${LogicalId}':
        Condition: !Sub 'TopicCondition${LogicalId}'
        Type: AWS::SNS::Topic
        Properties:
          TopicName: !Sub 'My${LogicalId}'
```

`Conditions` 必须作为第二个密钥或更高密钥添加，创建堆栈才能成功：

```
Resources:
  'Fn::ForEach::Topics':
    - LogicalId
    - !Ref TopicList
    - '${LogicalId}':
        Type: AWS::SNS::Topic
        Condition: !Sub 'TopicCondition${LogicalId}'
        Properties:
          TopicName: !Sub 'My${LogicalId}'
```

**Topics**
+ [复制单个条件](#intrinsic-function-reference-foreach-example-replicated-single-condition)

## 复制单个条件
<a name="intrinsic-function-reference-foreach-example-replicated-single-condition"></a>

此示例使用 `Conditions` 部分中的 `Fn::ForEach` 内置函数来复制具有不同属性的多个相似条件。

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

```
{
    "AWSTemplateFormatVersion": "2010-09-09",
    "Transform": "AWS::LanguageExtensions",
    "Parameters": {
        "ParamA": {
            "Type": "String",
            "AllowedValues": [
                "true",
                "false"
            ]
        },
        "ParamB": {
            "Type": "String",
            "AllowedValues": [
                "true",
                "false"
            ]
        },
        "ParamC": {
            "Type": "String",
            "AllowedValues": [
                "true",
                "false"
            ]
        },
        "ParamD": {
            "Type": "String",
            "AllowedValues": [
                "true",
                "false"
            ]
        }
    },
    "Conditions": {
        "Fn::ForEach::CheckTrue": [
            "Identifier",
            ["A", "B", "C", "D"],
            {
                "IsParam${Identifier}Enabled": {
                    "Fn::Equals": [
                        {"Ref": {"Fn::Sub": "Param${Identifier}"}},
                        "true"
                    ]
                }
            }
        ]
    },
    "Resources": {
        "WaitConditionHandle": {
            "Type": "AWS::CloudFormation::WaitConditionHandle"
        }
    }
}
```

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

```
AWSTemplateFormatVersion: 2010-09-09
Transform: AWS::LanguageExtensions
Parameters:
  ParamA:
    Type: String
    AllowedValues:
      - 'true'
      - 'false'
  ParamB:
    Type: String
    AllowedValues:
      - 'true'
      - 'false'
  ParamC:
    Type: String
    AllowedValues:
      - 'true'
      - 'false'
  ParamD:
    Type: String
    AllowedValues:
      - 'true'
      - 'false'
Conditions:
  'Fn::ForEach::CheckTrue':
    - Identifier
    - [A, B, C, D]
    - 'IsParam${Identifier}Enabled': !Equals 
        - !Ref 
          'Fn::Sub': 'Param${Identifier}'
        - 'true'
Resources:
  WaitConditionHandle:
    Type: AWS::CloudFormation::WaitConditionHandle
```

转换后的模板将等同于以下模板：

```
AWSTemplateFormatVersion: 2010-09-09
Parameters:
  ParamA:
    Type: String
    AllowedValues:
      - 'true'
      - 'false'
  ParamB:
    Type: String
    AllowedValues:
      - 'true'
      - 'false'
  ParamC:
    Type: String
    AllowedValues:
      - 'true'
      - 'false'
  ParamD:
    Type: String
    AllowedValues:
      - 'true'
      - 'false'
Conditions:
  IsParamAEnabled: !Equals 
    - !Ref ParamA
    - 'true'
  IsParamBEnabled: !Equals 
    - !Ref ParamB
    - 'true'
  IsParamCEnabled: !Equals 
    - !Ref ParamC
    - 'true'
  IsParamDEnabled: !Equals 
    - !Ref ParamD
    - 'true'
Resources:
  WaitConditionHandle:
    Type: AWS::CloudFormation::WaitConditionHandle
```

# `Fn::GetAtt`
<a name="intrinsic-function-reference-getatt"></a>

`Fn::GetAtt` 内部函数返回模板中的资源的属性值。

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

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

```
{ "Fn::GetAtt" : [ "logicalNameOfResource", "attributeName" ] }
```

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

完整函数名称的语法：

```
Fn::GetAtt: [ logicalNameOfResource, attributeName ]
```

短格式的语法：

```
!GetAtt logicalNameOfResource.attributeName
```

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

`logicalNameOfResource`  
包含所需属性的资源的逻辑名称 (也称为*逻辑 ID*)。

`attributeName`  
您想要获得其值的资源特定属性名称。有关该资源类型之可用属性的详细信息，请参阅资源的引用页面。

## 返回值
<a name="intrinsic-function-reference-getatt-return"></a>

属性值。有关资源的 `GetAtt` 返回值的更多信息，请参阅 [资源和属性参考](aws-template-resource-type-ref.md) 中相关资源的文档。

## 示例
<a name="intrinsic-function-reference-getatt-examples"></a>

### 返回属性值
<a name="intrinsic-function-reference-getatt-example"></a>

以下示例返回的字符串包含逻辑名称为 `myELB` 的负载均衡器的 DNS 名称。

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

```
"Fn::GetAtt" : [ "myELB" , "DNSName" ]
```

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

```
!GetAtt myELB.DNSName
```

#### 返回多个属性值
<a name="intrinsic-function-reference-getatt-example2"></a>

以下示例模板将返回逻辑名称为 `myELB` 的负载均衡器的 `SourceSecurityGroup.OwnerAlias` 和 `SourceSecurityGroup.GroupName`。

##### JSON
<a name="intrinsic-function-reference-getatt-example2.json"></a>

```
{
    "AWSTemplateFormatVersion": "2010-09-09",
    "Resources": {
        "myELB": {
            "Type": "AWS::ElasticLoadBalancing::LoadBalancer",
            "Properties": {
                "AvailabilityZones": [
                    "eu-west-1a"
                ],
                "Listeners": [
                    {
                        "LoadBalancerPort": "80",
                        "InstancePort": "80",
                        "Protocol": "HTTP"
                    }
                ]
            }
        },
        "myELBIngressGroup": {
            "Type": "AWS::EC2::SecurityGroup",
            "Properties": {
                "GroupDescription": "ELB ingress group",
                "SecurityGroupIngress": [
                    {
                        "IpProtocol": "tcp",
                        "FromPort": 80,
                        "ToPort": 80,
                        "SourceSecurityGroupOwnerId": {
                            "Fn::GetAtt": [
                                "myELB",
                                "SourceSecurityGroup.OwnerAlias"
                            ]
                        },
                        "SourceSecurityGroupName": {
                            "Fn::GetAtt": [
                                "myELB",
                                "SourceSecurityGroup.GroupName"
                            ]
                        }
                    }
                ]
            }
        }
    }
}
```

##### YAML
<a name="intrinsic-function-reference-getatt-example2.yaml"></a>

```
AWSTemplateFormatVersion: 2010-09-09
Resources:
  myELB:
    Type: AWS::ElasticLoadBalancing::LoadBalancer
    Properties:
      AvailabilityZones:
        - eu-west-1a
      Listeners:
        - LoadBalancerPort: '80'
          InstancePort: '80'
          Protocol: HTTP
  myELBIngressGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: ELB ingress group
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 80
          ToPort: 80
          SourceSecurityGroupOwnerId: !GetAtt myELB.SourceSecurityGroup.OwnerAlias
          SourceSecurityGroupName: !GetAtt myELB.SourceSecurityGroup.GroupName
```

#### 在 `Fn::GetAtt` 函数内使用 `Fn::Sub`
<a name="intrinsic-function-reference-getatt-foreach"></a>

**注意**  
使用 `AWS::LanguageExtensions` 转换时，可以将 `Fn::GetAtt` 与其他内置函数结合使用。有关支持的函数，请参阅[支持的函数](#getatt-supported-functions)。

以下示例展示了如何在模板的 `Outputs` 部分中将 `Fn::GetAtt` 与 [`Fn::Sub`](intrinsic-function-reference-sub.md) 以及 [`Fn::ForEach`](intrinsic-function-reference-foreach.md) 结合使用，从而减少模板的长度和详细程度。在 `Fn::GetAtt` 中使用 `Fn::Sub` 能使模板包含一个内置函数，该函数可以在每次迭代 `Fn::ForEach` 调用时引用不同的存储桶。

##### JSON
<a name="intrinsic-function-reference-getatt-foreach.json"></a>

```
{
    "AWSTemplateFormatVersion": "2010-09-09",
    "Transform": "AWS::LanguageExtensions",
    "Mappings": {
        "Buckets": {
            "Properties": {
                "Identifiers": ["A", "B", "C"]
            }
        }
    },
    "Resources": {
        "Fn::ForEach::Buckets": [
            "Identifier",
            {"Fn::FindInMap": ["Buckets", "Properties", "Identifiers"]},
            {
                "S3Bucket${Identifier}": {
                    "Type": "AWS::S3::Bucket",
                    "Properties": {
                        "AccessControl": "PublicRead",
                        "MetricsConfigurations": [
                            {
                                "Id": {"Fn::Sub": "EntireBucket${Identifier}"}
                            }
                        ],
                        "WebsiteConfiguration": {
                            "IndexDocument": "index.html",
                            "ErrorDocument": "error.html",
                            "RoutingRules": [
                                {
                                    "RoutingRuleCondition": {
                                        "HttpErrorCodeReturnedEquals": "404",
                                        "KeyPrefixEquals": "out1/"
                                    },
                                    "RedirectRule": {
                                        "HostName": "ec2-11-22-333-44.compute-1.amazonaws.com",
                                        "ReplaceKeyPrefixWith": "report-404/"
                                    }
                                }
                            ]
                        }
                    },
                    "DeletionPolicy": "Retain",
                    "UpdateReplacePolicy": "Retain"
                }
            }
        ]
    },
    "Outputs": {
        "Fn::ForEach::BucketOutputs": [
            "Identifier",
            {"Fn::FindInMap": ["Buckets", "Properties", "Identifiers"]},
            {
                "Fn::ForEach::GetAttLoop": [
                    "Property",
                    ["Arn", "DomainName", "WebsiteURL"],
                    {
                        "S3Bucket${Identifier}${Property}": {
                            "Value": {
                                "Fn::GetAtt": [{"Fn::Sub": "S3Bucket${Identifier}"}, {"Ref": "Property"}]
                            }
                        }
                    }
                ]
            }
        ]
    }
}
```

##### YAML
<a name="intrinsic-function-reference-getatt-foreach.yaml"></a>

```
AWSTemplateFormatVersion: 2010-09-09
Transform: AWS::LanguageExtensions
Mappings:
  Buckets:
    Properties:
      Identifiers:
        - A
        - B
        - C
Resources:
  'Fn::ForEach::Buckets':
    - Identifier
    - Fn::FindInMap: 
      - Buckets
      - Properties
      - Identifiers
    - 'S3Bucket${Identifier}':
        Type: AWS::S3::Bucket
        Properties:
          AccessControl: PublicRead
          MetricsConfigurations:
            - Id: 
                Fn::Sub: 'EntireBucket${Identifier}'
          WebsiteConfiguration:
            IndexDocument: index.html
            ErrorDocument: error.html
            RoutingRules:
              - RoutingRuleCondition:
                  HttpErrorCodeReturnedEquals: '404'
                  KeyPrefixEquals: out1/
                RedirectRule:
                  HostName: ec2-11-22-333-44.compute-1.amazonaws.com
                  ReplaceKeyPrefixWith: report-404/
        DeletionPolicy: Retain
        UpdateReplacePolicy: Retain
Outputs:
  'Fn::ForEach::BucketOutputs':
    - Identifier
    - Fn::FindInMap:
      - Buckets
      - Properties
      - Identifiers
    - 'Fn::ForEach::GetAttLoop':
        - Property
        - - Arn
          - DomainName
          - WebsiteURL
        - 'S3Bucket${Identifier}${Property}':
            Value: !GetAtt 
              - !Sub 'S3Bucket${Identifier}'
              - !Ref Property
```

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

使用 [AWS::LanguageExtensions 转换](transform-aws-languageextensions.md)时，您可以在 `Fn::GetAtt` 函数中使用以下函数。对于 `Fn::GetAtt` 逻辑资源名称或 `Fn::GetAtt` 属性名称都是如此。
+ [`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::Join`](intrinsic-function-reference-join.md)
+ [`Fn::Sub`](intrinsic-function-reference-sub.md)
+ [`Fn::ToJsonString`](intrinsic-function-reference-ToJsonString.md)
+ [`Ref`](intrinsic-function-reference-ref.md)

不使用 `AWS::LanguageExtensions` 转换时：
+ `Fn::GetAtt` 属性名称仅可以使用 [`Ref`](intrinsic-function-reference-ref.md) 函数。
+ `Fn::GetAtt` 逻辑资源名称不能使用函数。必须指定作为资源逻辑 ID 的字符串。

# `Fn::GetAZs`
<a name="intrinsic-function-reference-getavailabilityzones"></a>

内置函数 `Fn::GetAZs` 返回一个数组，该数组按字母顺序列出了指定区域的可用区。因为客户可访问不同的可用区，模板作者可通过内部函数 `Fn::GetAZs` 写出适用于调用用户访问的模板。这样，您就不必对指定区域的可用区的完整列表进行硬编码。

**重要**  
`Fn::GetAZs` 函数仅返回有默认子网的可用区，除非所有可用区都没有默认子网，在后面这种情况下，将返回所有可用区。  
与 `describe-availability-zones` AWS CLI 命令的响应类似，`Fn::GetAZs` 函数的结果顺序是不确定的，可能会在添加新的可用区时发生变化。

IAM 权限

使用 `Fn::GetAZs` 函数所需的权限取决于您用于启动 Amazon EC2 实例的平台。对于这两个平台，您需要对 Amazon EC2 `DescribeAvailabilityZones` 和 `DescribeAccountAttributes` 操作具有权限。对于 EC2-VPC，您还需要对 Amazon EC2 `DescribeSubnets` 操作具有权限。

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

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

```
{ "Fn::GetAZs" : "区域" }
```

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

完整函数名称的语法：

```
Fn::GetAZs: 区域
```

短格式的语法：

```
!GetAZs 区域
```

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

区域  <a name="region"></a>
要获得其可用区的区域的名称。  
您可以使用 `AWS::Region` 伪参数指定在其中创建堆栈的区域。指定空字符串与指定 `AWS::Region` 是对等的。

## 返回值
<a name="intrinsic-function-reference-getazs-return-value"></a>

区域的可用区列表。

## 示例
<a name="intrinsic-function-reference-getazs-examples"></a>

### 计算区域
<a name="intrinsic-function-reference-getazs-examples-evaluate-region"></a>

对于这些示例，CloudFormation 根据以下数组计算 `Fn::GetAZs`，假设用户已在 `us-east-1` 区域创建了堆栈：

`[ "us-east-1a", "us-east-1b", "us-east-1c", "us-east-1d", "us-east-1e" ]`

#### JSON
<a name="intrinsic-function-reference-getazs-example1.json"></a>

```
1. { "Fn::GetAZs" : "" }
2. { "Fn::GetAZs" : { "Ref" : "AWS::Region" } }
3. { "Fn::GetAZs" : "us-east-1" }
```

#### YAML
<a name="intrinsic-function-reference-getazs-example1.yaml"></a>

```
1. Fn::GetAZs: ""
2. Fn::GetAZs:
3.   Ref: "AWS::Region"
4. Fn::GetAZs: us-east-1
```

 

### 指定子网的可用区
<a name="intrinsic-function-reference-getazs-examples-subnet-az"></a>

以下示例使用 `Fn::GetAZs` 来指定子网的可用区：

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

```
"mySubnet" : {
  "Type" : "AWS::EC2::Subnet",
  "Properties" : {
    "VpcId" : { 
      "Ref" : "VPC"   
    },
    "CidrBlock" : "10.0.0.0/24",
    "AvailabilityZone" : {
      "Fn::Select" : [ 
        0, 
        { 
          "Fn::GetAZs" : "" 
        } 
      ]
    }
  }
}
```

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

```
mySubnet: 
  Type: AWS::EC2::Subnet
  Properties: 
    VpcId: 
      !Ref VPC
    CidrBlock: 10.0.0.0/24
    AvailabilityZone: 
      Fn::Select: 
        - 0
        - Fn::GetAZs: ""
```

 

### 具有短格式 YAML 的嵌套函数
<a name="intrinsic-function-reference-getazs-examples-nested-functions"></a>

以下示例显示使用具有短格式 YAML 的嵌套内部函数的有效模式。您不能连续嵌套短格式函数，因此 `!GetAZs !Ref` 之类的模式无效。

#### YAML
<a name="intrinsic-function-reference-getavailabilityzones-example3.yaml"></a>

```
1. AvailabilityZone: !Select
2.   - 0
3.   - !GetAZs
4.     Ref: 'AWS::Region'
```

#### YAML
<a name="intrinsic-function-reference-getavailabilityzones-example4.yaml"></a>

```
1. AvailabilityZone: !Select
2.   - 0
3.   - Fn::GetAZs: !Ref 'AWS::Region'
```

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

您可在 `Ref` 函数中使用 `Fn::GetAZs` 函数。

# `Fn::ImportValue`
<a name="intrinsic-function-reference-importvalue"></a>

内置函数 `Fn::ImportValue` 返回由另一个堆栈导出的输出的值。您通常使用此函数来创建跨堆栈引用。有关更多信息，请参阅《AWS CloudFormation 用户指南》**中的[演练：引用其他 CloudFormation 堆栈中的资源输出](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/walkthrough-crossstackref.html)。

在以下示例模板代码段中，堆栈 A 导出 VPC 安全组值，而堆栈 B 导入这些值。

**注意**  
以下限制适用于跨堆栈引用：  
对于每个 AWS 账户，`Export` 名称在区域内必须是唯一的。
不能跨区域创建跨堆栈引用。您可以使用内置函数 `Fn::ImportValue` 仅导入已在同一区域内导出的值。
对于输出，`Export` 的 `Name` 属性值无法使用依赖于资源的 `Ref` 或 `GetAtt` 函数。  
同样，`ImportValue` 函数无法包含依赖于资源的 `Ref` 或 `GetAtt` 函数。
在另一个堆栈导入输出值后，您将无法删除正在导出输出值的堆栈或修改已导出的输入值。必须先删除所有导入，然后才能删除导出堆栈或修改输出值。

## JSON
<a name="intrinsic-function-reference-importvalue-export.json"></a>

堆栈 A 导出

```
"Outputs" : {
  "PublicSubnet" : {
    "Description" : "The subnet ID to use for public web servers",
    "Value" :  { "Ref" : "PublicSubnet" },
    "Export" : { "Name" : {"Fn::Sub": "${AWS::StackName}-SubnetID" }}
  },
  "WebServerSecurityGroup" : {
    "Description" : "The security group ID to use for public web servers",
    "Value" :  { "Fn::GetAtt" : ["WebServerSecurityGroup", "GroupId"] },
    "Export" : { "Name" : {"Fn::Sub": "${AWS::StackName}-SecurityGroupID" }}
  }
}
```

## YAML
<a name="intrinsic-function-reference-importvalue-export.yaml"></a>

堆栈 A 导出

```
Outputs:
  PublicSubnet:
    Description: The subnet ID to use for public web servers
    Value:
      Ref: PublicSubnet
    Export:
      Name:
        'Fn::Sub': '${AWS::StackName}-SubnetID'
  WebServerSecurityGroup:
    Description: The security group ID to use for public web servers
    Value:
      'Fn::GetAtt':
        - WebServerSecurityGroup
        - GroupId
    Export:
      Name:
        'Fn::Sub': '${AWS::StackName}-SecurityGroupID'
```

## JSON
<a name="intrinsic-function-reference-importvalue-import.json"></a>

堆栈 B 导入

```
"Resources" : {
  "WebServerInstance" : {
    "Type" : "AWS::EC2::Instance",
    "Properties" : {
      "InstanceType" : "t2.micro",
      "ImageId" : "ami-a1b23456",
      "NetworkInterfaces" : [{
        "GroupSet" : [{"Fn::ImportValue" : {"Fn::Sub" : "${NetworkStackNameParameter}-SecurityGroupID"}}],
        "AssociatePublicIpAddress" : "true",
        "DeviceIndex" : "0",
        "DeleteOnTermination" : "true",
        "SubnetId" : {"Fn::ImportValue" : {"Fn::Sub" : "${NetworkStackNameParameter}-SubnetID"}}
      }]
    }
  }
}
```

## YAML
<a name="intrinsic-function-reference-importvalue-import.yaml"></a>

堆栈 B 导入

```
Resources:
  WebServerInstance:
    Type: AWS::EC2::Instance
    Properties:
      InstanceType: t2.micro
      ImageId: ami-a1b23456
      NetworkInterfaces:
        - GroupSet:
            - Fn::ImportValue: 
              'Fn::Sub': '${NetworkStackNameParameter}-SecurityGroupID'
          AssociatePublicIpAddress: 'true'
          DeviceIndex: '0'
          DeleteOnTermination: 'true'
          SubnetId: Fn::ImportValue: 
            'Fn::Sub': '${NetworkStackNameParameter}-SubnetID'
```

## 声明
<a name="w2aac24c43c11"></a>

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

```
{ "Fn::ImportValue" : sharedValueToImport }
```

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

您可以使用完整的函数名称：

```
Fn::ImportValue: sharedValueToImport
```

或者，您也可以使用短格式：

```
!ImportValue sharedValueToImport
```

**重要**  
当包含 `!Sub` 的简写形式时，不能使用 `!ImportValue` 的简写形式。  

```
# do not use
!ImportValue
  !Sub '${NetworkStack}-SubnetID'
```
此时，您必须使用完整的函数名称，例如：  

```
Fn::ImportValue:
  !Sub "${NetworkStack}-SubnetID"
```

## 参数
<a name="w2aac24c43c13"></a>

sharedValueToImport  
要导入的堆栈输出值。

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

堆栈输出值。

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

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

```
{ "Fn::ImportValue" : {"Fn::Sub": "${NetworkStackNameParameter}-SubnetID" } }
```

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

```
Fn::ImportValue:
  !Sub "${NetworkStackName}-SecurityGroupID"
```

## 支持的函数
<a name="w2aac24c43c19"></a>

您可在 `Fn::ImportValue` 函数中使用以下函数。这些函数的值无法依赖资源。
+ `Fn::Base64`
+ `Fn::FindInMap`
+ `Fn::If`
+ `Fn::Join`
+ `Fn::Select`
+ `Fn::Sub`
+ `Ref`

# `Fn::Join`
<a name="intrinsic-function-reference-join"></a>

内部函数 `Fn::Join` 将一组值附加到单值中，中间用特定分隔符隔开。如果分隔符为空字符串，则该组值不通过分隔符被连接在一起。

## 声明
<a name="w2aac24c48b5"></a>

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

```
{ "Fn::Join" : [ "delimiter", [ comma-delimited list of values ] ] }
```

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

完整函数名称的语法：

```
Fn::Join: [ delimiter, [ comma-delimited list of values ] ]
```

短格式的语法：

```
!Join [ delimiter, [ comma-delimited list of values ] ]
```

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

分隔符  
您希望发生在片断之间的值。分隔符只会发生在片断之间。它不会终止终值。

ListOfValues  
您想组合的值之列表。

## 返回值
<a name="intrinsic-function-reference-join-returnvalues"></a>

组合的字符串。

## 示例
<a name="intrinsic-function-reference-join-examples"></a>

### 加入简单字符串数组
<a name="intrinsic-function-reference-join-example1"></a>

以下示例返回：`"a:b:c"`。

#### JSON
<a name="intrinsic-function-reference-join-example1.json"></a>

```
"Fn::Join" : [ ":", [ "a", "b", "c" ] ]
```

#### YAML
<a name="intrinsic-function-reference-join-example1.yaml"></a>

```
!Join [ ":", [ a, b, c ] ]
```

### 使用带参数的 Ref 函数加入
<a name="intrinsic-function-reference-join-example2"></a>

以下示例使用 `Fn::Join` 构造一个字符串值。它将 `Ref` 函数与 `AWS::Partition` 参数和 `AWS::AccountId` 伪参数一起使用。

#### JSON
<a name="intrinsic-function-reference-join-example2.json"></a>

```
{
  "Fn::Join": [
    "", [
      "arn:",
      {
        "Ref": "AWS::Partition"
      },
      ":s3:::elasticbeanstalk-*-",
      {
        "Ref": "AWS::AccountId"
      }
    ]
  ]
}
```

#### YAML
<a name="intrinsic-function-reference-join-example2.yaml"></a>

```
!Join
  - ''
  - - 'arn:'
    - !Ref AWS::Partition
    - ':s3:::elasticbeanstalk-*-'
    - !Ref AWS::AccountId
```

**注意**  
另请参阅 [`Fn::Sub`](intrinsic-function-reference-sub.md) 函数以了解类似的功能。

## 支持的函数
<a name="intrinsic-function-reference-join-supportedfunctions"></a>

对于 `Fn::Join` 分隔符，不能使用任何函数。您必须指定字符串值。

对于值的 `Fn::Join` 列表，您可使用以下函数：
+ `Fn::Base64`
+ `Fn::FindInMap`
+ `Fn::GetAtt`
+ `Fn::GetAZs`
+ `Fn::If`
+ `Fn::ImportValue`
+ `Fn::Join`
+ `Fn::Split`
+ `Fn::Select`
+ `Fn::Sub`
+ `Ref`

# `Fn::Length`
<a name="intrinsic-function-reference-length"></a>

内部函数 `Fn::Length` 返回数组或返回数组的内部函数中元素的数量。

**重要**  
必须使用 [`AWS::LanguageExtensions` 转换](transform-aws-languageextensions.md) 才能使用 `Fn::Length` 内置函数。

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

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

```
{ "Fn::Length" : IntrinsicFunction }
```

```
{ "Fn::Length" : Array }
```

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

```
Fn::Length : IntrinsicFunction
```

```
Fn::Length : Array
```

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

`IntrinsicFunction`  
返回要从中返回多个元素的数组的内部函数。

`Array`  
要从中返回元素数的数组。

## 返回值
<a name="intrinsic-function-reference-length-return"></a>

返回数组的内部函数中或传递给内部函数的数组中的元素数量。

## 示例
<a name="intrinsic-function-reference-length-examples"></a>

### 返回返回数组的内部函数中的元素数量
<a name="intrinsic-function-reference-length-example-subsection"></a>

此示例代码段返回返回数组的内部函数中的元素数量。函数返回 3。

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

```
{
//...
    "Transform": "AWS::LanguageExtensions"
    //...
        "Fn::Length" : {
            "Fn::Split": ["|", "a|b|c"]
        }
//...
}
```

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

```
Transform: 'AWS::LanguageExtensions'
#...
  Fn::Length: 
    !Split ["|", "a|b|c"]
#...
```

### 返回引用列表参数类型的 Ref 内部函数中的元素数量
<a name="intrinsic-function-reference-length-example2"></a>

此示例代码段返回引用列表参数类型的 `Ref` 内部函数中的元素数量。如果名为 `ListParameter` 的参数是含有 3 个元素的列表，则该函数返回 3。

#### JSON
<a name="intrinsic-function-reference-length-example2.json"></a>

```
{
//...
    "Transform": "AWS::LanguageExtensions"
    //...
        "Fn::Length": {
            "Ref": "ListParameter"
        }
//...
}
```

#### YAML
<a name="intrinsic-function-reference-legnth-example2.yaml"></a>

```
Transform: 'AWS::LanguageExtensions'
#...
  Fn::Length: 
    !Ref ListParameter
#...
```

### 返回数组中的元素数量
<a name="intrinsic-function-reference-length-example3"></a>

此示例代码段返回传递给内部函数的数组中的元素数量。函数返回 3。

#### JSON
<a name="intrinsic-function-reference-length-example3.json"></a>

```
 1. {
 2. //...
 3.     "Transform": "AWS::LanguageExtensions"
 4.     //...
 5.         "Fn::Length": [
 6.             1,
 7.             {"Ref": "ParameterName"}, 
 8.             3
 9.         ]
10. //...
11. }
```

#### YAML
<a name="intrinsic-function-reference-legnth-example3.yaml"></a>

```
Transform: 'AWS::LanguageExtensions'
#...
  Fn::Length: 
    - 1
    - !Ref ParameterName
    - 3
#...
```

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

您可以在 `Fn::Length` 内部函数或数组中使用以下函数：
+ `Condition Functions`
+ `Fn::Base64`
+ `Fn::FindInMap`
+ `Fn::Join`
+ `Fn::Length`
+ `Fn::Select`
+ `Fn::Split`
+ `Fn::Sub`
+ `Fn::ToJsonString`
+ `Ref`

# `Fn::Select`
<a name="intrinsic-function-reference-select"></a>

内部函数`Fn::Select`通过索引返回对象列表中的单个对象。

**重要**  
`Fn::Select` 不会检查空值，或检查索引是否超出数组边界。两种条件都可导致堆栈错误，所以您应该确保您选择的索引有效且列表中包含非空值。

## 声明
<a name="w2aac24c58b7"></a>

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

```
{ "Fn::Select" : [ index, listOfObjects ] }
```

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

完整函数名称的语法：

```
Fn::Select: [ index, listOfObjects ] 
```

短格式的语法：

```
!Select [ index, listOfObjects ]
```

## 参数
<a name="w2aac24c58b9"></a>

索引  
待检索对象的索引。索引必须是零到 N-1 之间的某个值，其中 N 代表数组中元素的数量。

listOfObjects  
选择对象的列表。该列表不得为空，且不能包含空项目。

## 返回值
<a name="w2aac24c58c11"></a>

选定的对象。

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

### 基本示例
<a name="w2aac24c58c13b3"></a>

以下示例返回：`"grapes"`。

#### JSON
<a name="intrinsic-function-reference-select-example0.json"></a>

```
{ "Fn::Select" : [ "1", [ "apples", "grapes", "oranges", "mangoes" ] ] }
```

#### YAML
<a name="intrinsic-function-reference-select-example0.yaml"></a>

```
!Select [ "1", [ "apples", "grapes", "oranges", "mangoes" ] ]
```

 

### 逗号分隔列表参数类型
<a name="w2aac24c58c13b5"></a>

您可以使用 `Fn::Select` 从 `CommaDelimitedList` 参数选择一个对象。您可以使用 `CommaDelimitedList` 参数合并相关参数的值，这样可减少模板中的参数总数。例如，以下参数指定包含三个 CIDR 块的逗号分隔列表：

#### JSON
<a name="intrinsic-function-reference-select-example1.json"></a>

```
"Parameters" : {
  "DbSubnetIpBlocks": {
    "Description": "Comma-delimited list of three CIDR blocks",
    "Type": "CommaDelimitedList",
      "Default": "10.0.48.0/24, 10.0.112.0/24, 10.0.176.0/24"
  }
}
```

#### YAML
<a name="intrinsic-function-reference-select-example1.yaml"></a>

```
Parameters: 
  DbSubnetIpBlocks: 
    Description: "Comma-delimited list of three CIDR blocks"
    Type: CommaDelimitedList
    Default: "10.0.48.0/24, 10.0.112.0/24, 10.0.176.0/24"
```

要指定三个 CIDR 块之一，请在同一模板的 Resources 部分中使用 `Fn::Select`，如以下示例代码段所示：

#### JSON
<a name="intrinsic-function-reference-select-example2.json"></a>

```
"Subnet0": {
  "Type": "AWS::EC2::Subnet",
    "Properties": {
      "VpcId": { "Ref": "VPC" },
      "CidrBlock": { "Fn::Select" : [ "0", {"Ref": "DbSubnetIpBlocks"} ] }
    }
}
```

#### YAML
<a name="intrinsic-function-reference-select-example2.yaml"></a>

```
Subnet0: 
  Type: AWS::EC2::Subnet
  Properties: 
    VpcId: !Ref VPC
    CidrBlock: !Select [ 0, !Ref DbSubnetIpBlocks ]
```

 

### 具有短格式 YAML 的嵌套函数
<a name="w2aac24c58c13b7"></a>

以下示例显示了使用具有 `!Select` 短格式的嵌套内部函数的有效模式。您不能连续嵌套短格式函数，因此 `!GetAZs !Ref` 之类的模式无效。

#### YAML
<a name="intrinsic-function-reference-select-example3.yaml"></a>

```
AvailabilityZone: !Select 
  - 0
  - !GetAZs 
    Ref: 'AWS::Region'
```

#### YAML
<a name="intrinsic-function-reference-select-example4.yaml"></a>

```
AvailabilityZone: !Select 
  - 0
  - Fn::GetAZs: !Ref 'AWS::Region'
```

## 支持的函数
<a name="w2aac24c58c15"></a>

对于 `Fn::Select` 索引值，您可以使用 `Ref` 和 `Fn::FindInMap` 函数。

对于对象的 `Fn::Select` 列表，您可以使用以下函数：
+ `Fn::FindInMap`
+ `Fn::GetAtt`
+ `Fn::GetAZs`
+ `Fn::If`
+ `Fn::Split`
+ `Ref`

# `Fn::Split`
<a name="intrinsic-function-reference-split"></a>

要将字符串拆分为一列字符串值，以便从结果字符串列表中选择一个元素，请使用 `Fn::Split` 内部函数。用分隔符 (例如逗号 `,`) 指定拆分位置。在您拆分字符串后，请使用 [`Fn::Select`](intrinsic-function-reference-select.md) 函数选择特定的元素。

例如，如果将以逗号分隔的子网 ID 字符串导入您的堆栈模板，您可以在每个逗号的位置拆分字符串。在子网 ID 列表中，使用 `Fn::Select` 内部函数来指定资源的子网 ID。

## 声明
<a name="w2aac24c62b7"></a>

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

```
{ "Fn::Split" : [ "delimiter", "source string" ] }
```

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

完整函数名称的语法：

```
Fn::Split: [ delimiter, source string ]
```

短格式的语法：

```
!Split [ delimiter, source string ]
```

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

您必须指定两个参数。

分隔符  
确定源字符串划分位置的字符串值。

源字符串  
要拆分的字符串值。

## 返回值
<a name="w2aac24c62c11"></a>

字符串值的列表。

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

以下示例演示了 `Fn::Split` 函数的行为。

### 简单列表
<a name="w2aac24c62c13b5"></a>

以下示例在每个竖条处拆分字符串 (`|`)。 函数返回 `["a", "b", "c"]`。

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

```
{ "Fn::Split" : [ "|" , "a|b|c" ] }
```

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

```
!Split [ "|" , "a|b|c" ]
```

 

### 空字符串值的列表
<a name="w2aac24c62c13b7"></a>

如果您用连续的分隔符拆分字符串，则结果列表将包含空字符串。以下示例显示了带有两个连续的分隔符和一个附加分隔符的字符串如何进行拆分。 函数返回 `["a", "", "c", ""]`。

#### JSON
<a name="w2aac24c62c13b7b5"></a>

```
{ "Fn::Split" : [ "|" , "a||c|" ] }
```

#### YAML
<a name="w2aac24c62c13b7b7"></a>

```
!Split [ "|" , "a||c|" ]
```

 

### 拆分已导入的输出值
<a name="w2aac24c62c13b9"></a>

以下示例拆分已导入的输出值，然后按照 `Fn::Select` 函数所指定的，从子网 ID 的结果列表中选择第三个元素。

#### JSON
<a name="w2aac24c62c13b9b5"></a>

```
{ "Fn::Select" : [ "2", { "Fn::Split": [",", {"Fn::ImportValue": "AccountSubnetIDs"}]}] }
```

#### YAML
<a name="w2aac24c62c13b9b7"></a>

```
!Select [2, !Split [",", !ImportValue AccountSubnetIDs]]
```

## 支持的函数
<a name="w2aac24c62c15"></a>

对于 `Fn::Split` 分隔符，不能使用任何函数。您必须指定字符串值。

对于值的 `Fn::Split` 列表，您可使用以下函数：
+ `Fn::Base64`
+ `Fn::FindInMap`
+ `Fn::GetAtt`
+ `Fn::GetAZs`
+ `Fn::If`
+ `Fn::ImportValue`
+ `Fn::Join`
+ `Fn::Select`
+ `Fn::Sub`
+ `Ref`

# `Fn::Sub`
<a name="intrinsic-function-reference-sub"></a>

内部函数 `Fn::Sub` 将输入字符串中的变量替换为您指定的值。在您的模板中，可以使用此函数构建命令或输出，其中包含在创建或更新堆栈之前不可用的值。

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

以下部分显示函数的语法。

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

```
{ "Fn::Sub" : [ String, { Var1Name: Var1Value, Var2Name: Var2Value } ] }
```

如果您仅替换 `String` 参数中的模板参数、资源逻辑 ID 或资源属性，则不要指定变量映射。

```
{ "Fn::Sub" : String }
```

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

完整函数名称的语法：

```
Fn::Sub:
  - String
  - Var1Name: Var1Value
    Var2Name: Var2Value
```

短格式的语法：

```
!Sub
  - String
  - Var1Name: Var1Value
    Var2Name: Var2Value
```

如果您仅替换 `String` 参数中的模板参数、资源逻辑 ID 或资源属性，则不要指定变量映射。

完整函数名称的语法：

```
Fn::Sub: String
```

短格式的语法：

```
!Sub String
```

## 参数
<a name="w2aac24c66b7"></a>

`String`  
一个带变量的字符串，CloudFormation 在运行时会将这些变量替换为其关联的值。以 `${MyVarName}` 形式编写变量。变量可以是模板参数名、资源逻辑 ID、资源属性或键值映射中的变量。如果您仅指定模板参数名、资源逻辑 ID 和资源属性，则不要指定键值映射。  
如果您指定模板参数名或资源逻辑 ID（例如 `${InstanceTypeParameter}`），则 CloudFormation 返回的值与您使用 `Ref` 内部函数时返回的值相同。如果您指定资源属性（例如 `${MyInstance.PublicIp}`），则 CloudFormation 返回的值与您使用 `Fn::GetAtt` 内部函数时返回的值相同。  
要按字面书写美元符号和大括号（`${}`），请在左大括号后面添加感叹号（`!`），如 `${!Literal}`。CloudFormation 将该文本解析为 `${Literal}`。  
如果您使用的是启动模板，请在美元符号（如 `\${!Literal}`）前添加反斜杠 `\`，否则字面解析结果将为空字符串。

`VarName`  
`String` 参数中包含的变量的名称。

`VarValue`  
CloudFormation 在运行时要将关联的变量名称替换为的值。

## 返回值
<a name="w2aac24c66b9"></a>

CloudFormation 返回原始字符串，并替换所有变量的值。

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

以下示例说明如何使用 `Fn::Sub` 函数。

### 使用不带键值映射的 `Fn::Sub`
<a name="w2aac24c66c11b5"></a>

在这一简单示例中，`InstanceSecurityGroup` 资源描述使用 `AWS::StackName` 伪参数动态创建。例如，如果堆栈名称为“VPC-EC2-ALB-Stack”，则生成的描述为“SSH security group for VPC-EC2-ALB-Stack”。

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

```
"InstanceSecurityGroup" : {
    "Type" : "AWS::EC2::SecurityGroup",
    "Properties" : {
        "GroupDescription" : {"Fn::Sub": "SSH security group for ${AWS::StackName}"}
}}
```

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

```
InstanceSecurityGroup:
  Type: AWS::EC2::SecurityGroup
  Properties:
    GroupDescription: !Sub "SSH security group for ${AWS::StackName}"
```

### 使用带键值映射的 `Fn::Sub`
<a name="w2aac24c66c11b7"></a>

在此示例中，`WWWBucket` 资源名称使用键值映射动态创建。`Fn::Sub` 函数将输入字符串 `www.${Domain}` 中的 `${Domain}` 替换为引用在同一堆栈模板中定义的 `RootDomainName` 参数的 `Ref` 函数值。例如，如果根域名称为“mydomain.com”，则该资源生成的名称为“www.mydomain.com”。

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

```
"WWWBucket":{
  "Type":"AWS::S3::Bucket",
  "Properties":{
    "BucketName":{
      "Fn::Sub":[
        "www.${Domain}",
        {
          "Domain":{
            "Ref":"RootDomainName"
          }
        }
      ]
    }
  }
}
```

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

```
  WWWBucket:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: !Sub
        - 'www.${Domain}'
        - Domain: !Ref RootDomainName
```

### 使用多个变量构造 ARN
<a name="w2aac24c66c11b9"></a>

以下示例使用 `Fn::Sub`、`AWS::Region` 和 `AWS::AccountId` 伪参数以及 `vpc` 资源逻辑 ID，为 VPC 创建 Amazon 资源名称（ARN）。

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

```
{ "Fn::Sub": "arn:aws:ec2:${AWS::Region}:${AWS::AccountId}:vpc/${vpc}" }
```

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

```
!Sub 'arn:aws:ec2:${AWS::Region}:${AWS::AccountId}:vpc/${vpc}'
```

### 在用户数据脚本中传递参数值
<a name="w2aac24c66c11c11"></a>

以下示例使用 `Fn::Sub` 在运行时将 `AWS::StackName` 和 `AWS::Region` 伪参数替换为实际堆栈名称和区域。

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

为了便于阅读，JSON 示例使用 `Fn::Join` 函数来分隔每条命令，而不是在单个字符串值中指定整个用户数据脚本。

```
"UserData": { "Fn::Base64": { "Fn::Join": ["\n", [
  "#!/bin/bash -xe",
  "yum update -y aws-cfn-bootstrap",
  { "Fn::Sub": "/opt/aws/bin/cfn-init -v --stack ${AWS::StackName} --resource LaunchConfig --configsets wordpress_install --region ${AWS::Region}" },
  { "Fn::Sub": "/opt/aws/bin/cfn-signal -e $? --stack ${AWS::StackName} --resource WebServerGroup --region ${AWS::Region}" }]]
}}
```

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

YAML 示例使用文字块指定用户数据脚本。

```
UserData:
  Fn::Base64:
    !Sub |
      #!/bin/bash -xe
      yum update -y aws-cfn-bootstrap
      /opt/aws/bin/cfn-init -v --stack ${AWS::StackName} --resource LaunchConfig --configsets wordpress_install --region ${AWS::Region}
      /opt/aws/bin/cfn-signal -e $? --stack ${AWS::StackName} --resource WebServerGroup --region ${AWS::Region}
```

### 使用映射指定条件值
<a name="w2aac24c66c11c13"></a>

在此示例中，`myLogGroup` 资源的名称是通过将 `log_group_name` 变量替换为 `Fn::FindInMap` 函数的结果值来动态创建的。

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

```
{
  "Mappings": {
    "LogGroupMapping": {
      "Test": {
        "Name": "test_log_group"
      },
      "Prod": {
        "Name": "prod_log_group"
      }
    }
  },
  "Resources": {
    "myLogGroup": {
      "Type": "AWS::Logs::LogGroup",
      "Properties": {
        "LogGroupName": {
          "Fn::Sub": [
            "cloud_watch_${log_group_name}",
            {
              "log_group_name": {
                "Fn::FindInMap": [
                  "LogGroupMapping",
                  "Test",
                  "Name"
                ]
              }
            }
          ]
        }
      }
    }
  }
}
```

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

```
Mappings:
  LogGroupMapping:
    Test:
      Name: test_log_group
    Prod:
      Name: prod_log_group
Resources:
  myLogGroup:
    Type: AWS::Logs::LogGroup
    Properties:
      LogGroupName: !Sub 
        - 'cloud_watch_${log_group_name}'
        - log_group_name: !FindInMap 
            - LogGroupMapping
            - Test
            - Name
```

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

对于 `String` 参数，您无法使用任何函数。您必须指定字符串值。

对于 `VarName` 和 `VarValue` 参数，您可以使用以下函数：
+ [`Fn::Base64`](intrinsic-function-reference-base64.md)
+ [`Fn::FindInMap`](intrinsic-function-reference-findinmap.md)
+ [`Fn::GetAtt`](intrinsic-function-reference-getatt.md)
+ [`Fn::GetAZs`](intrinsic-function-reference-getavailabilityzones.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::Select`](intrinsic-function-reference-select.md)
+ [`Fn::Sub`](#intrinsic-function-reference-sub)
+ [`Ref`](intrinsic-function-reference-ref.md)

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

`Fn::ToJsonString` 内部函数将对象或数组转换为其对应的 JSON 字符串。

**重要**  
必须使用 [`AWS::LanguageExtensions` 转换](transform-aws-languageextensions.md) 才能使用 `Fn::ToJsonString` 内置函数。

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

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

```
{ "Fn::ToJsonString": Object }
```

```
{ "Fn::ToJsonString": Array }
```

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

```
Fn::ToJsonString: Object
```

```
Fn::ToJsonString: Array
```

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

`Object`  
您想转换为 JSON 字符串的对象。

`Array`  
您想转换为 JSON 字符串的数组。

## 返回值
<a name="intrinsic-function-reference-tojsonstring-return"></a>

转换为 JSON 字符串的对象或数组。

## 示例
<a name="intrinsic-function-reference-tojsonstring-examples"></a>

### 将对象转换为 JSON 字符串
<a name="intrinsic-function-reference-tojsonstring-example-subsection"></a>

此示例代码段将传递给内部函数的对象转换为 JSON 字符串。

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

```
{
//...
    "Transform": "AWS::LanguageExtensions"
    //...
        "Fn::ToJsonString": {
            "key1": "value1",
            "key2": { 
                "Ref": "ParameterName"
            }
        }
//...
}
```

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

```
Transform: 'AWS::LanguageExtensions'
#...
  Fn::ToJsonString: 
    key1: value1
    key2: !Ref ParameterName
#...
```

在这两个例子中，如果 `Ref` 到 `ParameterName` 解析为 `resolvedValue`，则该函数解析为以下 JSON 字符串：

```
"{\"key1\":\"value1\",\"key2\":\"resolvedValue\"}"
```

### 将数组转换为 JSON 字符串
<a name="intrinsic-function-reference-tojsonstring-example2"></a>

此示例代码段将传递给内部函数的数组转换为 JSON 字符串。

#### JSON
<a name="intrinsic-function-reference-tojsonstring-example2.json"></a>

```
{
//...
    "Transform": "AWS::LanguageExtensions"
    //...
        "Fn::ToJsonString": [{
            "key1": "value1",
            "key2": { 
                "Ref": "ParameterName" 
            }
        }]
//...
}
```

#### YAML
<a name="intrinsic-function-reference-tojsonstring-example2.yaml"></a>

```
Transform: 'AWS::LanguageExtensions'
#...
  Fn::ToJsonString: 
    - key1: value1
      key2: !Ref ParameterName
#...
```

在这两个例子中，如果 `Ref` 到 `ParameterName` 解析为 `resolvedValue`，则该函数解析为以下 JSON 字符串：

```
"[{\"key1\":\"value1\"},{\"key2\":\"resolvedValue\"}]"
```

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

您可以在 `Fn::ToJsonString` 内部函数或数组中使用以下函数：
+ `Fn::Base64`
+ `Fn::FindInMap`
+ `Fn::GetAtt`
+ `Fn::GetAZs`
+ `Fn::If`
+ `Fn::ImportValue`
+ `Fn::Join`
+ `Fn::Length`
+ `Fn::Select`
+ `Fn::Split`
+ `Fn::Sub`
+ `Fn::ToJsonString`
+ `Ref`

# `Fn::Transform`
<a name="intrinsic-function-reference-transform"></a>

内部函数 `Fn::Transform` 指定一个宏以对堆栈模板的一部分执行自定义处理。通过使用宏，您可以对模板执行自定义处理，包括查找并替换操作等简单操作以及整个模板的大型转换。有关更多信息，请参阅《AWS CloudFormation 用户指南》**中的[使用 CloudFormation 宏对模板执行自定义处理](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-macros.html)。

您也可以使用 `Fn::Transform` 调用 [`AWS::Include` 转换](transform-aws-include.md) 转换，这是 CloudFormation 托管的宏。

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

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

完整函数名称的语法：

```
{
    "Fn::Transform": {
        "Name": "macro name",
        "Parameters": {
            "Key": "value"
        }
    }
}
```

短格式的语法：

```
{
    "Transform": {
        "Name": "macro name",
        "Parameters": {
            "Key": "value"
        }
    }
}
```

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

完整函数名称的语法：

```
Fn::Transform:
  Name : macro name
  Parameters :
    Key : value
```

短格式的语法：

```
!Transform
  Name: macro name
  Parameters:
    Key: value
```

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

`Name`  
要执行处理的宏的名称。

`Parameters`  
要传递给宏的列表参数，指定为键值对。

## 返回值
<a name="intrinsic-function-reference-transform-returnvalue"></a>

要包含在处理的堆栈模板中的已处理模板代码段。

## 示例
<a name="intrinsic-function-reference-transform-examples"></a>

以下示例调用 `AWS::Include` 转换，并指定从中检索模板代码段的位置是在 `InputValue` 参数中传递的。

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

```
{
    "Fn::Transform": {
        "Name": "AWS::Include",
        "Parameters": {
            "Location": {
                "Ref": "InputValue"
            }
        }
    }
}
```

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

```
Fn::Transform:
  Name: AWS::Include
  Parameters:
    Location: !Ref InputValue
```

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

无。

CloudFormation 将 `Fn::Transform` 中包含的任何内部函数调用作为文本字符串传递到指定的宏。

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

以下示例展示了如何使用 `Fn::Sub` 内置函数、条件以及 `Stage` 参数的输入来设置资源标识符。然后，`Ref` 和 `Fn::GetAtt` 函数会根据阶段的输入来引用适当的值。`Fn::Sub` 首先与 `Fn::GetAtt` 一起使用来获取相应 Amazon SQS 队列的 ARN，从而设置 Amazon CloudWatch 警报的维度。然后，[`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`

# 规则函数
<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*