翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
モジュールを使用したリソース構成のカプセル化と再利用
モジュールは、スタックテンプレート全体に含めるリソース構成をパッケージ化する、透過的で管理しやすく、繰り返し可能な方法です。モジュールは、共通のサービス構成とベストプラクティスを、スタックテンプレートに含めるためのモジュール式のカスタマイズ可能なビルディングブロックとしてカプセル化できます。モジュールを使用すると、リソース実装の複雑さを深く理解することなく、ベストプラクティス、専門分野の知識、承認されたガイドライン (セキュリティ、コンプライアンス、ガバナンス、業界規制などの領域について) をテンプレートに含めることができます。
たとえば、ネットワークのドメイン専門家は、組み込みのセキュリティグループと、セキュリティガイドラインに準拠した入力/出力ルールを含むモジュールを作成できます。その後、そのモジュールをテンプレートに含めることで、VPC、サブネット、セキュリティグループ、ゲートウェイがどのように機能するかを考えるのに時間を費やすことなく、セキュアなネットワーキングインフラストラクチャをスタックにプロビジョニングできます。また、モジュールはバージョン管理されているため、セキュリティガイドラインが時間の経過とともに変更された場合、モジュールの作成者はそれらの変更を組み込んだ新しいバージョンのモジュールを作成できます。
テンプレートでモジュールを使用することの特徴は次のとおりです。
予測可能性: モジュールは CloudFormation レジストリに登録されているスキーマに準拠する必要があります。そのため、テンプレートにモジュールを含めると解決できるリソースがわかります。
再利用性: 複数のテンプレートとアカウントで同じモジュールを使用できます。
トレーサビリティ: CloudFormation では、スタック内のどのリソースがモジュールからプロビジョニングされたかを把握できるため、リソース変更のソースを簡単に把握できます。
管理機能: モジュールを登録すると、バージョニング、アカウント、リージョンの可用性など、CloudFormation レジストリを使用してモジュールを管理できます。
モジュールには次のものを含めることができます。
モジュールからプロビジョニングされる 1 つ以上のリソース、および出力や条件などの関連データ。
任意のモジュールパラメータ。モジュールが使用されるたびにカスタム値を指定できます。
モジュールタイプの開発については、CloudFormationコマンドラインガイドの「モジュールタイプの開発」をご参照ください。
テンプレートでのモジュールの使用
モジュールを使用するには、モジュールを使用するアカウントとリージョンに登録されていることを確認してください。CloudFormation レジストリのモジュールをプライベート拡張として登録します。次に、個々のリソースと同じように扱います。
それをテンプレートの
Resources
セクションに含めます。モジュールに必要なプロパティを指定します。
スタックオペレーションを開始すると、CloudFormation は、含まれているモジュールを適切なリソースに解決する処理済みテンプレートを生成します。変更セットを使用して 、スタック操作を実際に実行する前に、追加または更新するリソースをプレビューします。
次の例を考えてみましょう。リソースとモジュールの両方を含むテンプレートがあります。テンプレートには、1 つの個別のリソース、ResourceC とモジュールが含まれます。ModuleParentこのモジュールには、ResourceC の 2 つのリソース、およびネストされたモジュールが含まれています。ModuleChildModuleChildには ResourceD という 1 つのリソースが含まれます。このテンプレートからスタックを作成すると、CloudFormation はテンプレートを処理し、モジュールを適切なリソースに解決します。結果のスタックには、ResourceA、ResourceB、ResourceC、および ResourceD の 4 つのリソースがあります。

CloudFormation は、スタック内のどのリソースがモジュールから作成されたかを追跡します。この情報は、特定のスタックの [Events] (イベント)、[Resources] (リソース)、および [Drifts] (ドリフト) タブに表示できます。また、変更セットのプレビューにも表示されます。
モジュールはテンプレート内のリソースと区別できます。これは、リソースで使用される一般的な 3 つのパート規則とは対照的に、次の 4 つの部分からなる命名規則に従っているためです。
organization
::service
::usecase
::MODULE
パラメータを使用してモジュール値を指定する
モジュールには、モジュールパラメータを含めることができます。テンプレートパラメーターと同様に、モジュールパラメーターを使用すると、モジュールを含むテンプレート (またはモジュール) からモジュールにカスタム値を入力できます。モジュールはこれらの値を使用して、そのモジュールに含まれるリソースのプロパティを設定できます。
また、モジュールプロパティを設定するテンプレートパラメータを定義して、スタック操作時にモジュールに渡される値をユーザーが入力できるようにすることもできます。テンプレートパラメータの定義の詳細については、「パラメータ」を参照してください。
同様に、モジュールパラメータを含むネストされたモジュールがモジュールに含まれている場合、次のことができます。
ネストされたモジュールのパラメータの値を親モジュールで直接指定します。
親モジュール内の対応するモジュールパラメータを定義して、ネストされたモジュールのパラメータを、親モジュールが含まれているテンプレート (またはモジュール) で設定できるようにします。
テンプレートパラメータを使用したモジュールパラメータ値の指定
次の例は、モジュールに値を渡すテンプレートパラメータを定義する方法を示しています。
ここで、BucketName
を含むテンプレートは、スタック操作中にユーザーが S3 バケット名を指定できるようにするテンプレートパラメータ My::S3::SampleBucket::MODULE
を定義します。
// Template containing My::S3::SampleBucket::MODULE { "Parameters": { "BucketName": { "Description": "Name for your sample bucket", "Type": "String" } }, "Resources": { "MyBucket": { "Type": "My::S3::SampleBucket::MODULE", "Properties": { "BucketName": { "Ref": "BucketName" } } } } }
親モジュールから子モジュール内のリソースのプロパティを指定する
次の例は、別のモジュール内にネストされているモジュールでパラメータ値を指定する方法を示しています。
この最初のモジュール My::S3::SampleBucketPrivate::MODULE
は、子モジュールになります。これは、BucketName
と AccessControl
の 2 つのパラメータを定義します。これらのパラメータに指定された値は、モジュールに含まれる AWS::S3::Bucket
リソースの BucketName
およびAccessControl
プロパティを指定するために使用されます。以下は My::S3::SampleBucketPrivate::MODULE
のテンプレートフラグメントです。
// My::S3::SampleBucketPrivate::MODULE { "AWSTemplateFormatVersion": "2010-09-09", "Description": "A sample S3 Bucket with Versioning and DeletionPolicy.", "Parameters": { "BucketName": { "Description": "Name for the bucket", "Type": "String" }, "AccessControl": { "Description": "AccessControl for the bucket", "Type": "String" } }, "Resources": { "S3Bucket": { "Type": "AWS::S3::Bucket", "Properties": { "BucketName": { "Ref": "BucketName" }, "AccessControl": { "Ref": "AccessControl" }, "DeletionPolicy": "Retain", "VersioningConfiguration": { "Status": "Enabled" } } } } }
次に、前のモジュールは親モジュール My::S3::SampleBucket::MODULE
内にネストされます。親モジュール My::S3::SampleBucket::MODULE
は、次の方法で子モジュールのパラメータを設定します。
AccessControl
My::S3::SampleBucketPrivate::MODULE
パラメータをに設定しますPrivate
。BucketName
では 、モジュールパラメータを定義します。これにより、My::S3::SampleBucket::MODULE
を含むテンプレート (またはモジュール) でバケット名を指定できます 。
// My::S3::SampleBucket::MODULE { "AWSTemplateFormatVersion": "2010-09-09", "Description": "A sample S3 Bucket. With Private AccessControl.", "Parameters": { "BucketName": { "Description": "Name for your sample bucket", "Type": "String" } }, "Resources": { "MyBucket": { "Type": "My::S3::SampleBucketPrivate::MODULE", "Properties": { "BucketName": { "Ref": "BucketName" }, "AccessControl" : "Private" } } } }
モジュールパラメータの制約の指定
モジュールパラメータは、制約の強制をサポートしていません。モジュールパラメータに対して制約チェックを実行するには、必要な制約を持つテンプレートパラメータを作成し、モジュールパラメータでそのテンプレートパラメータを参照します。
モジュール内のリソースの参照
モジュール内のリソースは、論理名で参照できます。モジュールに含まれるリソースの完全修飾論理名は、次の組み合わせによって構築できます。
包含テンプレート (または包含モジュール)) 内のモジュールに指定された論理名。
モジュールで指定された、リソースの論理名。
リソースの完全修飾論理名は、区切り文字としてピリオドを使用する場合であっても、使用しない場合であっても、指定することができます。例えば、以下の論理名は両方とも有効で、機能的には同等です。
ModuleLogicalName
.ResourceLogicalName
ModuleLogicalNameResourceLogicalName
このようにして、GetAtt
Ref
および組み込み関数を使用して、モジュールリソースのプロパティ値にアクセスできます。
次の例では、テンプレートはモジュール内のプロパティを参照して、テンプレート自体のリソースに対応するプロパティを設定します。
My::S3::SampleBucket::MODULE
モジュールに、S3Bucket
の論理名を持つ AWS::S3::Bucket
リソースが含まれているとします。Ref
組み込み関数を使用してこのリソースのバケット名を参照するには、テンプレート MyBucket
内のモジュールで指定された論理名とモジュール S3Bucket
内のリソースの論理名を組み合わせて、リソース MyBucket.S3Bucket
または MyBucketS3Bucket
の完全修飾論理名を取得します。
モジュールに含まれるリソースの論理名は、モジュールのスキーマで指定されます。このスキーマには、次の方法でアクセスできます。
CloudFormation レジストリ内のモジュールを見つけます。[Schema] タブにモジュールスキーマが表示されます。
DescribeTypeオペレーションを使用して、スキーマを含むモジュールの詳細を返します。
// Template that uses My::S3::SampleBucket::MODULE { "Parameters": { "BucketName": { "Description": "Name for your sample bucket", "Type": "String" } }, "Resources": { "MyBucket": { "Type": "My::S3::SampleBucket::MODULE", "Properties": { "BucketName": { "Ref": "BucketName" } } }, "exampleQueue": { "Type": "AWS::SQS::Queue", "Properties": { "QueueName": { "Ref": "MyBucket.S3Bucket" } } } }, "Outputs": { "BucketArn": { "Value": { "Fn::GetAtt": [ "MyBucket", "S3Bucket.Arn" ] } } } }
Parameters: BucketName: Description: Name for your sample bucket Type: String Resources: MyBucket: Type: My::S3::SampleBucket::MODULE Properties: BucketName: !Ref BucketName exampleQueue: Type: AWS::SQS::Queue Properties: QueueName: !Ref MyBucket.S3Bucket Outputs: BucketArn: Value: !GetAtt MyBucket.S3Bucket.Arn
モジュールを使用するときの考慮事項
モジュールは追加料金なしで使用できます。スタック内でそれらのモジュールが解決したリソースに対してのみお支払いいただきます。
CloudFormation クォータ (スタックで許可されるリソースの最大数、テンプレート本文の最大サイズなど) は、テンプレートに含まれるリソースがモジュールから取得されているかどうかにかかわらず、処理されたテンプレートに適用されます。詳細については、「Canta」AWSCloudFormationを参照してください。
スタックレベルで指定するタグは、モジュールから派生した個々のリソースに割り当てられます。
モジュールレベルで指定されたヘルパースクリプトは、CloudFormation がテンプレートを処理するときに、モジュールに含まれる個々のリソースには伝達されません。
モジュールで指定された出力は、テンプレートレベルで出力に伝播されます。
各出力には、モジュールで定義されたモジュールの論理名と出力名を連結した論理 ID が割り当てられます。出力の詳細については、出力を参照してください。
モジュールで指定されたパラメータは、テンプレートレベルのパラメータには伝達されません。
ただし、モジュールレベルのパラメータを参照するテンプレートレベルのパラメータを作成できます。詳細については、「 パラメータを使用してモジュール値を指定する 」をご参照ください。
モジュールの登録とバージョン管理
CloudFormation レジストリを使用して、アカウントとリージョンのモジュールを登録および管理します。詳細については、「AWSCloudFormationレジストリの使用」を参照してください。
特定のアカウントとリージョンに、同じモジュールの複数のバージョンを登録できます。次の考慮事項に注意が必要です。
モジュールを使用するアカウントとリージョンに、モジュールを登録する必要があります。
スタックオペレーション中、CloudFormation は、スタックオペレーションが実行されているアカウントおよびリージョンで、デフォルトバージョンとして現在登録されているモジュールの任意のバージョンを使用します。これには、他のモジュールにネストされているモジュールも含まれます。
したがって、異なるアカウントまたはリージョンで、同じモジュールの異なるバージョンをデフォルトバージョンとして登録している場合、同じテンプレートを使用すると、異なる結果になる可能性があることに注意してください。
詳細については、「 使用する拡張のバージョンを指定する 」を参照してください。
スタックオペレーション中、CloudFormation は、スタックオペレーションが実行されているアカウントおよびリージョンで、デフォルトバージョンとして現在登録されているリソースの任意のバージョンを使用します。これには、モジュールを含めることによって生成されたリソースが含まれます。
モジュールのデフォルトバージョンを変更しても、スタックの更新オペレーションは開始されません。ただし、次にそのモジュールを含むテンプレート (スタックの更新など) でスタックオペレーションを実行すると、CloudFormation は新しいデフォルトバージョンをオペレーションで使用します。
これに関する例外の 1 つは、以下で説明するように、[use previous template] オプションを指定してスタックの更新を実行することです。
スタックの更新オペレーションで、[use previous template] (以前のテンプレートを使用) オプションを指定すると、CloudFormation はスタック更新のために以前に処理されたテンプレートを使用し、モジュールに加えた変更については再処理しません。
一貫した結果を保証するために、スタックセットで使用するためにスタックテンプレートにモジュールを含める場合は、スタックインスタンスをデプロイする予定のすべてのアカウントとリージョンで、同じバージョンのモジュールがデフォルトバージョンとして設定されていることを確認する必要があります。これは、他のモジュールにネストされているモジュールの場合を含みます。スタックセットの詳細については、「スタックセットの操作」を参照してください。
モジュールの新しいバージョンの登録、またはモジュールのデフォルトバージョンの変更の詳細については、「AWSCloudFormationレジストリの使用」をご参照ください。
アカウントで使用するためにパブリックモジュールをアクティベートする
アカウントとリージョンでパブリックモジュールを正常にアクティブ化するには、モジュールに含まれる各サードパーティのパブリック拡張 (リソースまたはモジュール) に対して以下が当てはまる必要があります。
アカウントとリージョンで拡張がすでにアクティブ化されている必要があります。
モジュール内のエクステンションがタイプ名のエイリアスを使用する場合、エクステンションは同じタイプ名エイリアスを使用してアカウントとリージョンに登録する必要があります。詳細については、「Specifying aliases to refer to extensions」(拡張を参照するエイリアスを指定する) を参照してください。
現在アクティブ化されているエクステンションのバージョンは、モジュールで指定されているエクステンションのサポートされているメジャーバージョンのいずれかである必要があります。詳細については、CloudFormationCLIユーザーガイドの「パブリックモジュールを公開するためのモジュール要件」を参照してください。
適切なサードパーティのパブリック拡張と拡張のバージョンがアクティブ化されていない場合、CloudFormationモジュールを正常にアクティブ化する前にアクティブ化する必要がある拡張やバージョンをリストするエラーが表示されます。