

これは新しい CloudFormation テンプレートリファレンスガイドです。ブックマークとリンクを更新してください。CloudFormation の開始方法については、『[AWS CloudFormation ユーザーガイド](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html)』を参照してください。

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

`Fn::If`、`Fn::Equals` などの組み込み関数を使用して、条件付きロジックに基づいてスタックリソースを作成および設定できます。これらの条件は、スタックの作成時または更新時に評価されます。必要な条件をすべて定義したら、テンプレートの `Resources` セクションと `Outputs` セクションでそれらをリソースまたはリソースプロパティに関連付けることができます。

高度なシナリオでは、`Fn::And` または `Fn::Or` 関数を使用して条件を組み合わせたり、`Fn::Not` を使用して条件の値を否定したりできます。条件をネストして、より複雑な条件付きロジックを作成することもできます。

テンプレートで条件を初めて使用する場合は、まず「*AWS CloudFormation ユーザーガイド*」の「[CloudFormation テンプレートの Conditions 構文](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/conditions-section-structure.html)」トピックを確認することをお勧めします。

**注記**  
`Fn::If` 条件を除くすべての条件は、テンプレートの `Conditions` セクションで定義する必要があります。`Fn::If` 条件は、`Metadata` 属性、`UpdatePolicy` 属性、および `Resources` セクションと `Outputs` セクションのプロパティ値で使用できます。

**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 演算子として機能します。含めることができる条件の最小数は 2 で、最大数は 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` と等しく、`SomeOtherCondition` が true に評価された場合、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>

2 つの値が等しいかどうかを比較します。2 つの値が同じ場合は `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` に評価された場合は 1 つの値を返し、指定された条件が `false` に評価された場合はもう 1 つの値を返します。現在、CloudFormation では、`Metadata` 属性、`UpdatePolicy` 属性、およびテンプレートの `Resources` セクションと `Outputs` セクションのプロパティ値で `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\_name  <a name="condition_name"></a>
Conditions セクションの条件への参照です。参照するには条件の名前を使用します。

value\_if\_true  <a name="value_if_true"></a>
指定された条件が true に評価された場合に返される値です。

value\_if\_false  <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 に評価された場合、3 つのパブリックサブネットを使用します。それ以外の場合は、2 つのパブリックサブネットのみを使用します。

##### 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>

次の例では、`Fn::If` 関数で `AWS::NoValue` 擬似パラメータを使用します。条件は、スナップショット ID が指定されている場合にのみ、Amazon RDS DB インスタンスのスナップショットを使用します。`UseDBSnapshot` 条件が true に評価された場合は、CloudFormation は `DBSnapshotIdentifier` プロパティに `DBSnapshotName` パラメータ値を使用します。条件が false に評価された場合は、CloudFormation は `DBSnapshotIdentifier` プロパティを削除します。

また、Amazon RDS DB インスタンスの `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 に評価される場合にだけ、自動拡大縮小更新ポリシーを提供します。条件が 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>

`false` と評価された条件に対しては、`true` を返し、`true` と評価された条件に対しては、`false` を返します。`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>

次の `EnvCondition` 条件は、`EnvironmentType` パラメータの値が `prod` と等しくない場合に 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 演算子として機能します。含めることができる条件の最小数は 2 で、最大数は 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` と等しいか、`SomeOtherCondition` が true に評価された場合、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` セクションで 2 つの条件を定義します。1 つは `CreateProdResources` で、`EnvType` パラメータ値が `prod` に等しい場合は true に評価されます。もう 1 つは `CreateDevResources` で、パラメータ値が `dev` に等しい場合は true に評価されます。

`InstanceType` プロパティ内で、テンプレートは 2 つの `Fn::If` 組み込み関数を使用して、どのインスタンスタイプを使用するかを調べます。`CreateProdResources` 条件が true の場合、インスタンスタイプは `c5.xlarge` です。条件が false の場合は、`CreateDevResources` 条件が評価されます。`CreateDevResources` 条件が true の場合、インスタンスタイプは `t3.medium` です。その他の場合、インスタンスタイプは `t3.small` です。

インスタンスタイプの他に、本稼働環境は Amazon EC2 ボリュームを作成して、インスタンスにアタッチします。`MountPoint` および `NewVolume` リソースは、条件が true に評価される場合にだけリソースが作成されるように、`CreateProdResources` 条件に関連付けられています。

**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)」トピックを参照してください。