CloudFormation が提供するパラメータタイプを使用する、既存のリソースと Systems Manager パラメータの参照
テンプレートを作成するとき、CloudFormation が提供する特殊なパラメータタイプを使用して、既存の AWS リソースまたは Systems Manager パラメータの識別子の入力をユーザーに求めるパラメータを作成できます。
トピック
概要
CloudFormation では、スタックの作成または更新中に入力値を指定して、パラメータを使用してスタックをカスタマイズできます。この機能は、テンプレートをさまざまなシナリオで再利用する柔軟性を実現します。
パラメータは、CloudFormation テンプレートの Parameters
セクションで定義されます。各パラメータには名前とタイプがあり、デフォルト値や許可された値などの追加設定を持つことができます。詳細については、「CloudFormation テンプレートの Parameters セクション構文リファレンス」を参照してください。
パラメータタイプは、パラメータが受け入れることができる入力値のタイプを決定します。例えば、Number
は数値のみを受け入れ、String
はテキスト入力を受け入れます。
CloudFormation には、テンプレートで既存の AWS リソースおよび Systems Manager パラメータを参照するために使用できる追加のパラメータタイプがいくつか用意されています。
これらのパラメータタイプは、次の 2 つのカテゴリに分類されます。
-
AWS 固有のパラメータタイプ – CloudFormation は、スタックを作成または更新するときに無効な値をキャッチできるようにする一連のパラメータタイプを提供します。これらのパラメータタイプを使用すると、テンプレートを使用するすべてのユーザーは、スタックを作成する AWS アカウント およびリージョンから有効な値を指定する必要があります。
AWS Management Console を使用する場合、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」を参照してください。
Parameters
セクションで定義したら、Ref
関数を使用して CloudFormation テンプレート全体のパラメータ値を参照することができます。
例
次の例では、次のパラメータタイプを使用するテンプレートが示されています。
-
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 キーを指定するか、
のデフォルト値を維持することもできます。このパブリックパラメータは、最新の Amazon Linux 2 AMI のリージョン AMI ID 用エイリアスです。パブリックパラメータの詳細については、「AWS Systems Manager ユーザーガイド」の「Parameter Store でパブリックパラメータの検索」を参照してください。/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2
JSON
{ "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
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 コマンド
次の「create-stack」コマンドは、テンプレート例に基づいてスタックを作成します。
aws cloudformation create-stack --stack-name
MyStack
\ --template-bodyfile://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
"
考慮事項
動的参照を使用して、サードパーティーの認証情報などの機密性の高い設定定義へのアクセスを制限することを強くお勧めします。詳細については、「動的参照を使用して他のサービスに格納されている値を取得する」を参照してください。
テンプレートユーザーに異なる AWS アカウント から値を指定できるようにする場合、AWS 固有のパラメータタイプを使用しないでください。代わりに、String
または CommaDelimitedList
タイプのパラメータを定義します。
Systems Manager パラメータタイプには、いくつかの点に注意する必要があります。
-
パラメータの解決された値はコンソールでスタックの [パラメータ] タブで確認するか、「describe-stacks」または「describe-change-set」を実行することによって確認できます。これらの値はスタックが作成または更新される時に設定されるため、Parameter Store の最新の値とは異なる場合があることに注意してください。
-
スタックの更新には、[既存の値の使用] オプション (または
UsePreviousValue
を true に設定) を使用すると、同じ Parameter Store キーを使用し続けること (値ではなく) を意味します。CloudFormation は常に最新の値を取得します。 -
許可された値やその他の制約を指定する場合、CloudFormation は指定したパラメータキーに対して検証しますが、その値に対しては検証しません。値の検証は Parameter Store 自体で行う必要があります。
-
スタックを作成または更新して変更セットを作成すると、CloudFormation はオペレーションの実行時点で Parameter Store に存在する値を使用します。指定されたパラメータが、呼び出し元の AWS アカウントの下のパラメータストアに存在しない場合、CloudFormation は検証エラーを返します。
-
変更セットを実行すると、CloudFormation は変更セットで指定されている値を使用します。これらの値は、変更セットの作成時と実行時の間にパラメータストアで変化する可能性があるため、変更セットを実行する前に確認してください。
-
パラメータストアのパラメータが同じ AWS アカウントに保存されている場合は、そのパラメータ名を指定する必要があります。パラメータストアのパラメータが別の AWS アカウントによって共有されている場合は、完全パラメータ ARN を指定する必要があります。
サポートされている AWS 固有のパラメータタイプ
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 パラメータタイプ
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 パラメータタイプ
CloudFormation では、次の Systems Manager パラメータタイプをサポートしていません。
-
Systems Manager パラメータタイプのリストの例:
List<AWS::SSM::Parameter::Value<String>>
また、CloudFormation では、テンプレートパラメータを SecureString
Systems Manager パラメータタイプとして定義できません。ただし、リソースによってはパラメータ値として Secure String を指定できます。詳細については、「動的参照を使用して他のサービスに格納されている値を取得する」を参照してください。