Cookie の設定を選択する

当社は、当社のサイトおよびサービスを提供するために必要な必須 Cookie および類似のツールを使用しています。当社は、パフォーマンス Cookie を使用して匿名の統計情報を収集することで、お客様が当社のサイトをどのように利用しているかを把握し、改善に役立てています。必須 Cookie は無効化できませんが、[カスタマイズ] または [拒否] をクリックしてパフォーマンス Cookie を拒否することはできます。

お客様が同意した場合、AWS および承認された第三者は、Cookie を使用して便利なサイト機能を提供したり、お客様の選択を記憶したり、関連する広告を含む関連コンテンツを表示したりします。すべての必須ではない Cookie を受け入れるか拒否するには、[受け入れる] または [拒否] をクリックしてください。より詳細な選択を行うには、[カスタマイズ] をクリックしてください。

コンストラクトライブラリから AWS コンストラクトをカスタマイズする

フォーカスモード
コンストラクトライブラリから AWS コンストラクトをカスタマイズする - AWS Cloud Development Kit (AWS CDK) v2

これは v2 AWS CDK デベロッパーガイドです。旧版の CDK v1 は 2022 年 6 月 1 日にメンテナンスを開始し、2023 年 6 月 1 日にサポートを終了しました。

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

これは v2 AWS CDK デベロッパーガイドです。旧版の CDK v1 は 2022 年 6 月 1 日にメンテナンスを開始し、2023 年 6 月 1 日にサポートを終了しました。

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

エスケープハッチ、raw オーバーライド、カスタムリソースを使用して、 AWS コンストラクトライブラリからコンストラクトをカスタマイズします。

エスケープハッチを使用する

AWS コンストラクトライブラリは、さまざまなレベルの抽象化のコンストラクトを提供します。

最も高いレベルでは、 AWS CDK アプリケーションとその中のスタックは、それ自体がクラウドインフラストラクチャ全体の抽象化、またはそのかなりのチャンクです。これらは、さまざまな環境やニーズに合わせてデプロイできるようにパラメータ化できます。

抽象化は、クラウドアプリケーションを設計および実装するための強力なツールです。 AWS CDK は、抽象化を使用して構築するだけでなく、新しい抽象化を作成する権限も提供します。既存のオープンソースの L2 および L3 コンストラクトをガイダンスとしながら、組織のベストプラクティスや意見を反映させた独自の L2 および L3 コンストラクトを構築することができます。

完璧な抽象化というものは存在せず、優れた抽象化であってもあらゆるユースケースを網羅できるわけではありません。開発中に、ニーズにほぼ適合するコンストラクトが見つかる場合もありますが、大なり小なりカスタマイズが必要になります。

このため、 AWS CDK にはコンストラクトモデルから抜け出す方法が用意されています。これには、下位レベルの抽象化への移行や、まったく異なるモデルへの移行が含まれます。エスケープハッチを使用すると、 AWS CDK パラダイムをエスケープし、ニーズに合わせてカスタマイズできます。その後、変更を新しいコンストラクトでラップすることで、基盤となる複雑さを抽象化し、他の開発者にクリーンな API を提供できます。

以下は、エスケープハッチを使用できる状況の例です。

  • AWS サービス機能は を通じて利用できますが AWS CloudFormation、L2 コンストラクトはありません。

  • AWS サービス機能は を通じて利用でき AWS CloudFormation、サービスの L2 コンストラクトがありますが、これらはまだ機能を公開していません。L2 コンストラクトは CDK チームによってキュレーションされるため、新機能をすぐに利用できない場合があります。

  • この機能は、 AWS CloudFormation を通じてはまだ利用できません。

    機能が利用可能かどうかを判断するには AWS CloudFormation、AWS 「リソースタイプとプロパティタイプのリファレンス」を参照してください。

L1 コンストラクトのエスケープハッチを開発する

L2 コンストラクトがサービスで利用できない場合は、自動的に生成された L1 コンストラクトを使用できます。これらのリソースは、CfnBucketCfnRole など、Cfn で始まる名前で識別できます。同等の AWS CloudFormation リソースを使用するのとまったく同じようにインスタンス化します。

たとえば、分析を有効にして低レベルの Amazon S3 バケット L1 をインスタンス化するには、以下のようなものを記述します。

TypeScript
new s3.CfnBucket(this, 'amzn-s3-demo-bucket', { analyticsConfigurations: [ { id: 'Config', // ... } ] });
JavaScript
new s3.CfnBucket(this, 'amzn-s3-demo-bucket', { analyticsConfigurations: [ { id: 'Config' // ... } ] });
Python
s3.CfnBucket(self, "amzn-s3-demo-bucket", analytics_configurations: [ dict(id="Config", # ... ) ] )
Java
CfnBucket.Builder.create(this, "amzn-s3-demo-bucket") .analyticsConfigurations(Arrays.asList(java.util.Map.of( // Java 9 or later "id", "Config", // ... ))).build();
C#
new CfnBucket(this, 'amzn-s3-demo-bucket', new CfnBucketProps { AnalyticsConfigurations = new Dictionary<string, string> { ["id"] = "Config", // ... } });
new s3.CfnBucket(this, 'amzn-s3-demo-bucket', { analyticsConfigurations: [ { id: 'Config', // ... } ] });

対応する CfnXxx クラスを持たないリソースを定義したい場合がまれにあるかもしれません。これは、リソース仕様でまだ公開されていない新しい AWS CloudFormation リソースタイプである可能性があります。このような場合は、cdk.CfnResource を直接インスタンス化し、リソースタイプとプロパティを指定します。以下の例ではこれを示しています。

TypeScript
new cdk.CfnResource(this, 'amzn-s3-demo-bucket', { type: 'AWS::S3::Bucket', properties: { // Note the PascalCase here! These are CloudFormation identifiers. AnalyticsConfigurations: [ { Id: 'Config', // ... } ] } });
JavaScript
new cdk.CfnResource(this, 'amzn-s3-demo-bucket', { type: 'AWS::S3::Bucket', properties: { // Note the PascalCase here! These are CloudFormation identifiers. AnalyticsConfigurations: [ { Id: 'Config' // ... } ] } });
Python
cdk.CfnResource(self, 'amzn-s3-demo-bucket', type="AWS::S3::Bucket", properties=dict( # Note the PascalCase here! These are CloudFormation identifiers. "AnalyticsConfigurations": [ { "Id": "Config", # ... } ] } )
Java
CfnResource.Builder.create(this, "amzn-s3-demo-bucket") .type("AWS::S3::Bucket") .properties(java.util.Map.of( // Map.of requires Java 9 or later // Note the PascalCase here! These are CloudFormation identifiers "AnalyticsConfigurations", Arrays.asList( java.util.Map.of("Id", "Config", // ... )))) .build();
C#
new CfnResource(this, "amzn-s3-demo-bucket", new CfnResourceProps { Type = "AWS::S3::Bucket", Properties = new Dictionary<string, object> { // Note the PascalCase here! These are CloudFormation identifiers ["AnalyticsConfigurations"] = new Dictionary<string, string>[] { new Dictionary<string, string> { ["Id"] = "Config" } } } });
new cdk.CfnResource(this, 'amzn-s3-demo-bucket', { type: 'AWS::S3::Bucket', properties: { // Note the PascalCase here! These are CloudFormation identifiers. AnalyticsConfigurations: [ { Id: 'Config', // ... } ] } });

L2 コンストラクトのエスケープハッチを開発する

L2 コンストラクトに機能がない場合や、問題を回避しようとしている場合は、L2 コンストラクト内にカプセル化されている L1 コンストラクトを変更できます。

すべての L2 コンストラクトは、対応する L1 コンストラクトを内包しています。たとえば、高レベルの Bucket コンストラクトは、低レベルの CfnBucket コンストラクトをラップしています。は AWS CloudFormation リソースに直接CfnBucket対応するため、 で利用できるすべての機能が公開されます AWS CloudFormation。

L1 コンストラクトにアクセスするための基本的なアプローチは、construct.node.defaultChild (Python: default_child) を使用し、(必要に応じて) 適切な型にそれをキャストし、そのプロパティを変更することです。ここでも、Bucket の例を見てみましょう。

TypeScript
// Get the CloudFormation resource const cfnBucket = bucket.node.defaultChild as s3.CfnBucket; // Change its properties cfnBucket.analyticsConfiguration = [ { id: 'Config', // ... } ];
JavaScript
// Get the CloudFormation resource const cfnBucket = bucket.node.defaultChild; // Change its properties cfnBucket.analyticsConfiguration = [ { id: 'Config' // ... } ];
Python
# Get the CloudFormation resource cfn_bucket = bucket.node.default_child # Change its properties cfn_bucket.analytics_configuration = [ { "id": "Config", # ... } ]
Java
// Get the CloudFormation resource CfnBucket cfnBucket = (CfnBucket)bucket.getNode().getDefaultChild(); cfnBucket.setAnalyticsConfigurations( Arrays.asList(java.util.Map.of( // Java 9 or later "Id", "Config", // ... ));
C#
// Get the CloudFormation resource var cfnBucket = (CfnBucket)bucket.Node.DefaultChild; cfnBucket.AnalyticsConfigurations = new List<object> { new Dictionary<string, string> { ["Id"] = "Config", // ... } };
// Get the CloudFormation resource const cfnBucket = bucket.node.defaultChild as s3.CfnBucket; // Change its properties cfnBucket.analyticsConfiguration = [ { id: 'Config', // ... } ];

このオブジェクトを使用して、 Metadataや などの AWS CloudFormation オプションを変更することもできますUpdatePolicy

TypeScript
cfnBucket.cfnOptions.metadata = { MetadataKey: 'MetadataValue' };
JavaScript
cfnBucket.cfnOptions.metadata = { MetadataKey: 'MetadataValue' };
Python
cfn_bucket.cfn_options.metadata = { "MetadataKey": "MetadataValue" }
Java
cfnBucket.getCfnOptions().setMetadata(java.util.Map.of( // Java 9+ "MetadataKey", "Metadatavalue"));
C#
cfnBucket.CfnOptions.Metadata = new Dictionary<string, object> { ["MetadataKey"] = "Metadatavalue" };
cfnBucket.cfnOptions.metadata = { MetadataKey: 'MetadataValue' };

アンエスケープハッチを使用する

には、抽象化レベルを上げる機能 AWS CDK も用意されています。抽象化レベルは「エスケープ解除」ハッチと呼びます。CfnBucket などの L1 コンストラクトがある場合は、新しい L2 コンストラクト (この場合は Bucket) を作成して、L1 コンストラクトをラップできます。

これは、L1 リソースを作成しつつ、L2 リソースを必要とするコンストラクトで使用する場合に便利です。また、L1 コンストラクトでは利用できない .grantXxxxx() のような便利なメソッドを使用したい場合にも役立ちます。

より抽象度の高いレベルへの移行は、.fromCfnXxxxx() と呼ばれる L2 クラスの静的メソッドを使用します。たとえば Amazon S3 バケットの場合は、Bucket.fromCfnBucket() を使用します。L1 リソースが唯一のパラメータです。

TypeScript
b1 = new s3.CfnBucket(this, "buck09", { ... }); b2 = s3.Bucket.fromCfnBucket(b1);
JavaScript
b1 = new s3.CfnBucket(this, "buck09", { ...} ); b2 = s3.Bucket.fromCfnBucket(b1);
Python
b1 = s3.CfnBucket(self, "buck09", ...) b2 = s3.from_cfn_bucket(b1)
Java
CfnBucket b1 = CfnBucket.Builder.create(this, "buck09") // .... .build(); IBucket b2 = Bucket.fromCfnBucket(b1);
C#
var b1 = new CfnBucket(this, "buck09", new CfnBucketProps { ... }); var v2 = Bucket.FromCfnBucket(b1);
b1 = new s3.CfnBucket(this, "buck09", { ... }); b2 = s3.Bucket.fromCfnBucket(b1);

L1 コンストラクトから作成された L2 コンストラクトは、リソース名、ARNs、またはルックアップから作成されたものと同様に、L1 リソースを参照するプロキシオブジェクトです。これらのコンストラクトを変更しても、最終的に合成される AWS CloudFormation テンプレートには影響しません (ただし、L1 リソースがあるため、代わりにそれを変更することはできます)。プロキシオブジェクトの詳細については、「AWS アカウントのリソースの参照」を参照してください。

混乱を避けるため、同じ L1 コンストラクトを参照する複数の L2 コンストラクトを作成しないでください。たとえば、前のセクションの手法を使用して Bucket から CfnBucket を抽出する場合、その CfnBucketBucket.fromCfnBucket() を呼び出すことで 2 番目の Bucket インスタンスを作成することは避けてください。実際には期待どおりに機能しますが (合成される AWS::S3::Bucket は 1 つだけです)、コードの保守が難しくなります。

raw オーバーライドを使用する

L1 コンストラクトに欠落しているプロパティがある場合は、raw オーバーライドを使用してすべてのタイピングをバイパスできます。これにより、合成されたプロパティを削除することもできます。

以下の例に示すように、いずれかの addOverride メソッド (Python: add_override) を使用します。

TypeScript
// Get the CloudFormation resource const cfnBucket = bucket.node.defaultChild as s3.CfnBucket; // Use dot notation to address inside the resource template fragment cfnBucket.addOverride('Properties.VersioningConfiguration.Status', 'NewStatus'); cfnBucket.addDeletionOverride('Properties.VersioningConfiguration.Status'); // use index (0 here) to address an element of a list cfnBucket.addOverride('Properties.Tags.0.Value', 'NewValue'); cfnBucket.addDeletionOverride('Properties.Tags.0'); // addPropertyOverride is a convenience function for paths starting with "Properties." cfnBucket.addPropertyOverride('VersioningConfiguration.Status', 'NewStatus'); cfnBucket.addPropertyDeletionOverride('VersioningConfiguration.Status'); cfnBucket.addPropertyOverride('Tags.0.Value', 'NewValue'); cfnBucket.addPropertyDeletionOverride('Tags.0');
JavaScript
// Get the CloudFormation resource const cfnBucket = bucket.node.defaultChild ; // Use dot notation to address inside the resource template fragment cfnBucket.addOverride('Properties.VersioningConfiguration.Status', 'NewStatus'); cfnBucket.addDeletionOverride('Properties.VersioningConfiguration.Status'); // use index (0 here) to address an element of a list cfnBucket.addOverride('Properties.Tags.0.Value', 'NewValue'); cfnBucket.addDeletionOverride('Properties.Tags.0'); // addPropertyOverride is a convenience function for paths starting with "Properties." cfnBucket.addPropertyOverride('VersioningConfiguration.Status', 'NewStatus'); cfnBucket.addPropertyDeletionOverride('VersioningConfiguration.Status'); cfnBucket.addPropertyOverride('Tags.0.Value', 'NewValue'); cfnBucket.addPropertyDeletionOverride('Tags.0');
Python
# Get the CloudFormation resource cfn_bucket = bucket.node.default_child # Use dot notation to address inside the resource template fragment cfn_bucket.add_override("Properties.VersioningConfiguration.Status", "NewStatus") cfn_bucket.add_deletion_override("Properties.VersioningConfiguration.Status") # use index (0 here) to address an element of a list cfn_bucket.add_override("Properties.Tags.0.Value", "NewValue") cfn_bucket.add_deletion_override("Properties.Tags.0") # addPropertyOverride is a convenience function for paths starting with "Properties." cfn_bucket.add_property_override("VersioningConfiguration.Status", "NewStatus") cfn_bucket.add_property_deletion_override("VersioningConfiguration.Status") cfn_bucket.add_property_override("Tags.0.Value", "NewValue") cfn_bucket.add_property_deletion_override("Tags.0")
Java
// Get the CloudFormation resource CfnBucket cfnBucket = (CfnBucket)bucket.getNode().getDefaultChild(); // Use dot notation to address inside the resource template fragment cfnBucket.addOverride("Properties.VersioningConfiguration.Status", "NewStatus"); cfnBucket.addDeletionOverride("Properties.VersioningConfiguration.Status"); // use index (0 here) to address an element of a list cfnBucket.addOverride("Properties.Tags.0.Value", "NewValue"); cfnBucket.addDeletionOverride("Properties.Tags.0"); // addPropertyOverride is a convenience function for paths starting with "Properties." cfnBucket.addPropertyOverride("VersioningConfiguration.Status", "NewStatus"); cfnBucket.addPropertyDeletionOverride("VersioningConfiguration.Status"); cfnBucket.addPropertyOverride("Tags.0.Value", "NewValue"); cfnBucket.addPropertyDeletionOverride("Tags.0");
C#
// Get the CloudFormation resource var cfnBucket = (CfnBucket)bucket.node.defaultChild; // Use dot notation to address inside the resource template fragment cfnBucket.AddOverride("Properties.VersioningConfiguration.Status", "NewStatus"); cfnBucket.AddDeletionOverride("Properties.VersioningConfiguration.Status"); // use index (0 here) to address an element of a list cfnBucket.AddOverride("Properties.Tags.0.Value", "NewValue"); cfnBucket.AddDeletionOverride("Properties.Tags.0"); // addPropertyOverride is a convenience function for paths starting with "Properties." cfnBucket.AddPropertyOverride("VersioningConfiguration.Status", "NewStatus"); cfnBucket.AddPropertyDeletionOverride("VersioningConfiguration.Status"); cfnBucket.AddPropertyOverride("Tags.0.Value", "NewValue"); cfnBucket.AddPropertyDeletionOverride("Tags.0");
// Get the CloudFormation resource const cfnBucket = bucket.node.defaultChild as s3.CfnBucket; // Use dot notation to address inside the resource template fragment cfnBucket.addOverride('Properties.VersioningConfiguration.Status', 'NewStatus'); cfnBucket.addDeletionOverride('Properties.VersioningConfiguration.Status'); // use index (0 here) to address an element of a list cfnBucket.addOverride('Properties.Tags.0.Value', 'NewValue'); cfnBucket.addDeletionOverride('Properties.Tags.0'); // addPropertyOverride is a convenience function for paths starting with "Properties." cfnBucket.addPropertyOverride('VersioningConfiguration.Status', 'NewStatus'); cfnBucket.addPropertyDeletionOverride('VersioningConfiguration.Status'); cfnBucket.addPropertyOverride('Tags.0.Value', 'NewValue'); cfnBucket.addPropertyDeletionOverride('Tags.0');

カスタムリソースを使用する

この機能を使用できない場合 AWS CloudFormation、直接 API コールを通じてのみ、必要な API コールを行うために AWS CloudFormation カスタムリソースを記述する必要があります。を使用してカスタムリソース AWS CDK を記述し、通常のコンストラクトインターフェイスにラップできます。コンストラクトの利用者の観点から見ると、エクスペリエンスはネイティブに感じられます。

カスタムリソースを構築するには、リソースの CREATEUPDATEDELETE ライフサイクルイベントに応答する Lambda 関数を書き込む必要があります。カスタムリソースが API を呼び出せるのが 1 回だけである場合には、AwsCustomResource の使用を検討してください。これにより、 AWS CloudFormation デプロイ中に任意の SDK 呼び出しを実行できます。それ以外の場合は、必要な作業を実行するための独自の Lambda 関数を作成する必要があります。

テーマが広すぎてここで完全にカバーすることはできませんが、以下のリンクから初めてみてください。

プライバシーサイト規約Cookie の設定
© 2025, Amazon Web Services, Inc. or its affiliates.All rights reserved.