

# CloudFormation が提供するパラメータタイプを使用して、実行時に既存のリソースを指定する
<a name="cloudformation-supplied-parameter-types"></a>

テンプレートを作成するとき、CloudFormation が提供する特殊なパラメータタイプを使用して、既存の AWS リソースまたは Systems Manager パラメータの識別子の入力をユーザーに求めるパラメータを作成できます。

**Topics**
+ [概要:](#cloudformation-supplied-parameter-types-overview)
+ [例](#cloudformation-supplied-parameter-types-example)
+ [考慮事項](#cloudformation-supplied-parameter-types-considerations)
+ [サポートされている AWS 固有のパラメータタイプ](#aws-specific-parameter-types-supported)
+ [サポートされている Systems Manager パラメータタイプ](#systems-manager-parameter-types-supported)
+ [サポートされていない Systems Manager パラメータタイプ](#systems-manager-parameter-types-unsupported)

## 概要:
<a name="cloudformation-supplied-parameter-types-overview"></a>

CloudFormation では、スタックの作成または更新中に入力値を指定して、パラメータを使用してスタックをカスタマイズできます。この機能は、テンプレートをさまざまなシナリオで再利用する柔軟性を実現します。

パラメータは、CloudFormation テンプレートの `Parameters` セクションで定義されます。各パラメータには名前とタイプがあり、デフォルト値や許可された値などの追加設定を持つことができます。詳細については、「[CloudFormation テンプレートの Parameters 構文](parameters-section-structure.md)」を参照してください。

パラメータタイプは、パラメータが受け入れることができる入力値のタイプを決定します。例えば、`Number` は数値のみを受け入れ、`String` はテキスト入力を受け入れます。

CloudFormation には、テンプレートで既存の AWS リソースおよび Systems Manager パラメータを参照するために使用できる追加のパラメータタイプがいくつか用意されています。

これらのパラメータタイプは、次の 2 つのカテゴリに分類されます。
+ **AWS 固有のパラメータタイプ** – CloudFormation は、スタックを作成または更新するときに無効な値をキャッチできるようにする一連のパラメータタイプを提供します。これらのパラメータタイプを使用すると、テンプレートを使用するすべてのユーザーは、スタックを作成する AWS アカウント およびリージョンから有効な値を指定する必要があります。

  AWS マネジメントコンソール を使用する場合、CloudFormation はアカウントおよびリージョンから既存の値の事前入力されたリストを提供します。そのため、ユーザーは特定の名前や ID を記憶して正確に入力する必要がありません。代わりに、ドロップダウンリストから値の選択のみを行います。場合によっては、ID、名前、`Name` タグ値で値を検索することもできます。
+ **Systems Manager パラメータタイプ** - CloudFormation は、Systems Manager Parameter Store の既存パラメータに対応するパラメータタイプも提供します。これらのパラメータタイプを使用すると、テンプレートを使用するすべてのユーザーは、Systems Manager パラメータタイプの値として Parameter Store キーを指定する必要があり、CloudFormation はスタックで使用する最新の値を Parameter Store から取得します。新しい Amazon マシンイメージ (AMI) ID など、新しいプロパティ値を持つアプリケーションを頻繁に更新する必要があるときには便利です。パラメータストアについては、「[Systems Manager Parameter Store](https://docs.aws.amazon.com/systems-manager/latest/userguide/systems-manager-parameter-store.html)」を参照してください。

`Parameters` セクションで定義したら、`Ref` 関数を使用して CloudFormation テンプレート全体のパラメータ値を参照することができます。

## 例
<a name="cloudformation-supplied-parameter-types-example"></a>

次の例では、次のパラメータタイプを使用するテンプレートが示されています。
+ `AWS::EC2::VPC::Id`
+ `AWS::EC2::Subnet::Id`
+ `AWS::EC2::KeyPair::KeyName`
+ `AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>`

このテンプレートでスタックを作成するには、アカウントから既存の VPC ID、サブネット ID、キーペア名を指定する必要があります。目的の AMI ID を参照する既存の Parameter Store キーを指定するか、`/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2` のデフォルト値を維持することもできます。このパブリックパラメータは、最新の Amazon Linux 2 AMI のリージョン AMI ID 用エイリアスです。パブリックパラメータの詳細については、「AWS Systems Manager ユーザーガイド」の「[Parameter Store でパブリックパラメータの検索](https://docs.aws.amazon.com/systems-manager/latest/userguide/parameter-store-finding-public-parameters.html)」を参照してください。

### JSON
<a name="cloudformation-supplied-parameter-types-example.json"></a>

```
{
    "Parameters": {
        "VpcId": {
            "Description": "ID of an existing Virtual Private Cloud (VPC).",
            "Type": "AWS::EC2::VPC::Id"
        },
        "PublicSubnetId": {
            "Description": "ID of an existing public subnet within the specified VPC.",
            "Type": "AWS::EC2::Subnet::Id"
        },
        "KeyName": {
            "Description": "Name of an existing EC2 key pair to enable SSH access to the instance.",
            "Type": "AWS::EC2::KeyPair::KeyName"
        },
        "AMIId": {
            "Description": "Name of a Parameter Store parameter that stores the ID of the Amazon Machine Image (AMI).",
            "Type": "AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>",
            "Default": "/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2"
        }
    },
    "Resources": {
        "InstanceSecurityGroup": {
            "Type": "AWS::EC2::SecurityGroup",
            "Properties": {
                "GroupDescription": "Enable SSH access via port 22",
                "VpcId": { "Ref": "VpcId" },
                "SecurityGroupIngress": [
                    {
                        "IpProtocol": "tcp",
                        "FromPort": 22,
                        "ToPort": 22,
                        "CidrIp": "0.0.0.0/0"
                    }
                ]
            }
        },
        "Ec2Instance": {
            "Type": "AWS::EC2::Instance",
            "Properties": {
                "KeyName": { "Ref": "KeyName" },
                "ImageId": { "Ref": "AMIId" },
                "NetworkInterfaces": [
                    {
                        "AssociatePublicIpAddress": "true",
                        "DeviceIndex": "0",
                        "SubnetId": { "Ref": "PublicSubnetId" },
                        "GroupSet": [{ "Ref": "InstanceSecurityGroup" }]
                    }
                ]
            }
        }
    },
    "Outputs": {
        "InstanceId": {
            "Value": { "Ref": "Ec2Instance" }
        }
    }
}
```

### YAML
<a name="cloudformation-supplied-parameter-types-example.yaml"></a>

```
Parameters:
  VpcId:
    Description: ID of an existing Virtual Private Cloud (VPC).
    Type: AWS::EC2::VPC::Id
  PublicSubnetId:
    Description: ID of an existing public subnet within the specified VPC.
    Type: AWS::EC2::Subnet::Id
  KeyName:
    Description: Name of an existing EC2 KeyPair to enable SSH access to the instance.
    Type: AWS::EC2::KeyPair::KeyName
  AMIId:
    Description: Name of a Parameter Store parameter that stores the ID of the Amazon Machine Image (AMI).
    Type: AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>
    Default: /aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2
Resources:
  InstanceSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: Enable SSH access via port 22
      VpcId: !Ref VpcId
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 22
          ToPort: 22
          CidrIp: 0.0.0.0/0
  Ec2Instance:
    Type: AWS::EC2::Instance
    Properties:
      KeyName: !Ref KeyName
      ImageId: !Ref AMIId
      NetworkInterfaces:
        - AssociatePublicIpAddress: "true"
          DeviceIndex: "0"
          SubnetId: !Ref PublicSubnetId
          GroupSet:
            - !Ref InstanceSecurityGroup
Outputs:
  InstanceId:
    Value: !Ref Ec2Instance
```

### スタックを作成する AWS CLI コマンド
<a name="cloudformation-supplied-parameter-types-cli-command"></a>

次の「[https://docs.aws.amazon.com/cli/latest/reference/cloudformation/create-stack.html](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/create-stack.html)」コマンドは、テンプレート例に基づいてスタックを作成します。

```
aws cloudformation create-stack --stack-name MyStack \
  --template-body file://sampletemplate.json \
  --parameters \
ParameterKey="VpcId",ParameterValue="vpc-a123baa3" \
ParameterKey="PublicSubnetId",ParameterValue="subnet-123a351e" \
ParameterKey="KeyName",ParameterValue="MyKeyName" \
ParameterKey="AMIId",ParameterValue="MyParameterKey"
```

`List<AWS::EC2::Subnet::Id>` などの文字列のリストを受け入れるパラメータタイプを使用するには、次の例で示されるように、`ParameterValue` 内のカンマを二重バックスラッシュでエスケープする必要があります。

```
--parameters ParameterKey="SubnetIDs",ParameterValue="subnet-5ea0c127\\,subnet-6194ea3b\\,subnet-c87f2be0"
```

## 考慮事項
<a name="cloudformation-supplied-parameter-types-considerations"></a>

動的参照を使用して、サードパーティーの認証情報などの機密性の高い設定定義へのアクセスを制限することを強くお勧めします。詳細については、「[動的参照を使用して他のサービスに格納されている値を取得する](dynamic-references.md)」を参照してください。

テンプレートユーザーに異なる AWS アカウント から値を指定できるようにする場合、AWS 固有のパラメータタイプを使用しないでください。代わりに、`String` または `CommaDelimitedList` タイプのパラメータを定義します。

Systems Manager パラメータタイプには、いくつかの点に注意する必要があります。
+ パラメータの解決された値はコンソールでスタックの **[パラメータ]** タブで確認するか、「[https://docs.aws.amazon.com/cli/latest/reference/cloudformation/describe-stacks.html](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/describe-stacks.html)」または「[https://docs.aws.amazon.com/cli/latest/reference/cloudformation/describe-change-set.html](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/describe-change-set.html)」を実行することによって確認できます。これらの値はスタックが作成または更新される時に設定されるため、Parameter Store の最新の値とは異なる場合があることに注意してください。
+ スタックの更新には、**[既存の値の使用]** オプション (または `UsePreviousValue` を true に設定) を使用すると、同じ Parameter Store キーを使用し続けること (値ではなく) を意味します。CloudFormation は常に最新の値を取得します。
+ 許可された値やその他の制約を指定する場合、CloudFormation は指定したパラメータキーに対して検証しますが、その値に対しては検証しません。値の検証は Parameter Store 自体で行う必要があります。
+ スタックを作成または更新して変更セットを作成すると、CloudFormation はオペレーションの実行時点で Parameter Store に存在する値を使用します。指定されたパラメータが、呼び出し元の AWS アカウントの下のパラメータストアに存在しない場合、CloudFormation は検証エラーを返します。
+ 変更セットを実行すると、CloudFormation は変更セットで指定されている値を使用します。これらの値は、変更セットの作成時と実行時の間にパラメータストアで変化する可能性があるため、変更セットを実行する前に確認してください。
+ パラメータストアのパラメータが同じ AWS アカウントに保存されている場合は、そのパラメータ名を指定する必要があります。パラメータストアのパラメータが別の AWS アカウントによって共有されている場合は、完全パラメータ ARN を指定する必要があります。

## サポートされている AWS 固有のパラメータタイプ
<a name="aws-specific-parameter-types-supported"></a>

CloudFormation では次の AWS 固有のタイプをサポートしています。

`AWS::EC2::AvailabilityZone::Name`  
アベイラビリティーゾーン (`us-west-2a` など)。

`AWS::EC2::Image::Id`  
Amazon EC2 イメージ ID (`ami-0ff8a91507f77f867` など)。CloudFormation コンソールには、このパラメータタイプの値のドロップダウンリストが表示されないことに注意してください。

`AWS::EC2::Instance::Id`  
Amazon EC2 インスタンス ID (`i-1e731a32` など)。

`AWS::EC2::KeyPair::KeyName`  
Amazon EC2 のキーペア名。

`AWS::EC2::SecurityGroup::GroupName`  
デフォルトの VPC セキュリティグループ名 (`my-sg-abc` など)。

`AWS::EC2::SecurityGroup::Id`  
セキュリティグループ ID (`sg-a123fd85` など)。

`AWS::EC2::Subnet::Id`  
サブネット ID (`subnet-123a351e` など)。

`AWS::EC2::Volume::Id`  
Amazon EBS ボリューム ID (`vol-3cdd3f56` など)。

`AWS::EC2::VPC::Id`  
VPC ID (`vpc-a123baa3` など)。

`AWS::Route53::HostedZone::Id`  
Amazon Route 53 ホストゾーン ID (`Z23YXV4OVPL04A` など)。

`List<AWS::EC2::AvailabilityZone::Name>`  
リージョンのアベイラビリティーゾーンの配列 (`us-west-2a, us-west-2b` など)。

`List<AWS::EC2::Image::Id>`  
Amazon EC2 イメージ ID の配列 (`ami-0ff8a91507f77f867, ami-0a584ac55a7631c0c` など)。CloudFormation コンソールには、このパラメータタイプの値のドロップダウンリストが表示されないことに注意してください。

`List<AWS::EC2::Instance::Id>`  
Amazon EC2 インスタンス ID の配列 (`i-1e731a32, i-1e731a34` など)。

`List<AWS::EC2::SecurityGroup::GroupName>`  
デフォルトの VPC セキュリティグループ名の配列 (`my-sg-abc, my-sg-def` など)。

`List<AWS::EC2::SecurityGroup::Id>`  
セキュリティグループ ID の配列 (`sg-a123fd85, sg-b456fd85` など)。

`List<AWS::EC2::Subnet::Id>`  
サブネット ID の配列 (`subnet-123a351e, subnet-456b351e` など)。

`List<AWS::EC2::Volume::Id>`  
Amazon EBS ボリューム ID の配列 (`vol-3cdd3f56, vol-4cdd3f56` など)。

`List<AWS::EC2::VPC::Id>`  
VPC ID の配列 (`vpc-a123baa3, vpc-b456baa3` など)。

`List<AWS::Route53::HostedZone::Id>`  
Amazon Route 53 ホストゾーン ID の配列 (`Z23YXV4OVPL04A, Z23YXV4OVPL04B` など)。

## サポートされている Systems Manager パラメータタイプ
<a name="systems-manager-parameter-types-supported"></a>

CloudFormation では、次の Systems Manager パラメータタイプをサポートしています。

`AWS::SSM::Parameter::Name`  
Systems Manager パラメーターキーの名前。このパラメータタイプは、必要なパラメータが存在することを確認する場合にのみ使用します。CloudFormation は、パラメータに関連付けられている実際の値を取得しません。

`AWS::SSM::Parameter::Value<String>`  
値が文字列の Systems Manager パラメーター。これは、パラメーターストア内の `String` パラメータータイプに対応します。

`AWS::SSM::Parameter::Value<List<String>>`、または `AWS::SSM::Parameter::Value<CommaDelimitedList>`  
値が文字列のリストである Systems Manager パラメーター。これは、パラメーターストア内の `StringList` パラメータータイプに対応します。

`AWS::SSM::Parameter::Value<AWS-specific parameter type>`  
値が AWS 固有のパラメータタイプである Systems Manager パラメータ。  
たとえば、次の例は `AWS::EC2::KeyPair::KeyName` タイプを指定します。  
+ `AWS::SSM::Parameter::Value<AWS::EC2::KeyPair::KeyName>`

`AWS::SSM::Parameter::Value<List<AWS-specific parameter type>>`  
値が AWS 固有のパラメータタイプのリストである Systems Manager パラメータ。  
たとえば、次の例は `AWS::EC2::KeyPair::KeyName` タイプのリストを指定します。  
+ `AWS::SSM::Parameter::Value<List<AWS::EC2::KeyPair::KeyName>>`

## サポートされていない Systems Manager パラメータタイプ
<a name="systems-manager-parameter-types-unsupported"></a>

CloudFormation では、次の Systems Manager パラメータタイプをサポートしていません。
+ Systems Manager パラメータタイプのリストの例: `List<AWS::SSM::Parameter::Value<String>>`

また、CloudFormation では、テンプレートパラメータを `SecureString` Systems Manager パラメータタイプとして定義できません。ただし、リソースによってはパラメータ*値*として Secure String を指定できます。詳細については、「[動的参照を使用して他のサービスに格納されている値を取得する](dynamic-references.md)」を参照してください。