既存の AWS CloudFormation テンプレートをインポートする - AWS Cloud Development Kit (AWS CDK) v2

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

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

既存の AWS CloudFormation テンプレートをインポートする

cloudformation-include.CfnInclude コンストラクトを使用してリソースを L1 コンストラクトに変換することで、 AWS CloudFormation テンプレートから AWS Cloud Development Kit (AWS CDK) アプリケーションにリソースをインポートします。

インポート後、これらのリソースは AWS CDK 、コードで最初に定義されている場合と同じ方法でアプリで操作できます。これらの L1 コンストラクトは、高レベルの AWS CDK コンストラクト内でも使用できます。例えば、これにより、L2 アクセス許可付与メソッドを、それらが定義するリソースで使用できます。

cloudformation-include.CfnInclude コンストラクトは基本的に、 AWS CDK API AWS CloudFormation テンプレート内の任意のリソースにラッパーを追加します。この機能を使用して、既存の AWS CloudFormation テンプレートを一度に AWS CDK 1 つのピースにインポートします。これにより、 AWS CDK コンストラクトを使用して既存のリソースを管理し、より高レベルの抽象化の利点を活用できます。この機能を使用して、 AWS CDK コンストラクト を指定することで、 AWS CDK 開発者に AWS CloudFormation テンプレートを公開することもできますAPI。

注記

AWS CDK v1 には も含まれていましたがaws-cdk-lib.CfnInclude、以前は同じ汎用目的に使用されていました。ただし、 の機能の多くは不足していますcloudformation-include.CfnInclude

AWS CloudFormation テンプレートをインポートする

以下は、このトピックで例を提供するために使用するサンプル AWS CloudFormation テンプレートです。テンプレートを my-template.jsonとしてコピーして保存します。これらの例を実行したら、既存のデプロイ済み AWS CloudFormation テンプレートのいずれかを使用してさらに詳しく調べることができます。コンソールから AWS CloudFormation 取得できます。

{ "Resources": { "amzn-s3-demo-bucket": { "Type": "AWS::S3::Bucket", "Properties": { "BucketName": "amzn-s3-demo-bucket", } } } }

JSON または YAML テンプレートを使用できます。YAML パーサーは受け入れる内容が若干異なる可能性があるため、JSON可能であればお勧めします。

を使用してサンプルテンプレートを AWS CDK アプリケーションにインポートする方法の例を次に示しますcloudformation-include。テンプレートはCDKスタックのコンテキスト内でインポートされます。

TypeScript
import * as cdk from 'aws-cdk-lib'; import * as cfninc from 'aws-cdk-lib/cloudformation-include'; import { Construct } from 'constructs'; export class MyStack extends cdk.Stack { constructor(scope: Construct, id: string, props?: cdk.StackProps) { super(scope, id, props); const template = new cfninc.CfnInclude(this, 'Template', { templateFile: 'my-template.json', }); } }
JavaScript
const cdk = require('aws-cdk-lib'); const cfninc = require('aws-cdk-lib/cloudformation-include'); class MyStack extends cdk.Stack { constructor(scope, id, props) { super(scope, id, props); const template = new cfninc.CfnInclude(this, 'Template', { templateFile: 'my-template.json', }); } } module.exports = { MyStack }
Python
import aws_cdk as cdk from aws_cdk import cloudformation_include as cfn_inc from constructs import Construct class MyStack(cdk.Stack): def __init__(self, scope: Construct, id: str, **kwargs) -> None: super().__init__(scope, id, **kwargs) template = cfn_inc.CfnInclude(self, "Template", template_file="my-template.json")
Java
import software.amazon.awscdk.Stack; import software.amazon.awscdk.StackProps; import software.amazon.awscdk.cloudformation.include.CfnInclude; import software.constructs.Construct; public class MyStack extends Stack { public MyStack(final Construct scope, final String id) { this(scope, id, null); } public MyStack(final Construct scope, final String id, final StackProps props) { super(scope, id, props); CfnInclude template = CfnInclude.Builder.create(this, "Template") .templateFile("my-template.json") .build(); } }
C#
using Amazon.CDK; using Constructs; using cfnInc = Amazon.CDK.CloudFormation.Include; namespace MyApp { public class MyStack : Stack { internal MyStack(Construct scope, string id, IStackProps props = null) : base(scope, id, props) { var template = new cfnInc.CfnInclude(this, "Template", new cfnInc.CfnIncludeProps { TemplateFile = "my-template.json" }); } } }

デフォルトでは、リソースをインポートすると、リソースの元の論理 ID がテンプレートから保持されます。この動作は AWS CDK、論理を保持IDsする必要がある に AWS CloudFormation テンプレートをインポートするのに適しています。これらのインポートされたリソースを AWS CloudFormation テンプレートから同じリソースとして認識するには、この情報 AWS CloudFormation が必要です。

他の AWS CDK デベロッパーが使用できるようにテンプレートの AWS CDK コンストラクトラッパーを開発している場合は、IDs代わりに に新しいリソース AWS CDK を生成させます。これにより、名前の競合なしで コンストラクトをスタックで複数回使用できます。これを行うには、テンプレートをインポートfalseするときに preserveLogicalIdsプロパティを に設定します。以下に例を示します。

TypeScript
const template = new cfninc.CfnInclude(this, 'MyConstruct', { templateFile: 'my-template.json', preserveLogicalIds: false });
JavaScript
const template = new cfninc.CfnInclude(this, 'MyConstruct', { templateFile: 'my-template.json', preserveLogicalIds: false });
Python
template = cfn_inc.CfnInclude(self, "Template", template_file="my-template.json", preserve_logical_ids=False)
Java
CfnInclude template = CfnInclude.Builder.create(this, "Template") .templateFile("my-template.json") .preserveLogicalIds(false) .build();
C#
var template = new cfnInc.CfnInclude(this, "Template", new cfn_inc.CfnIncludeProps { TemplateFile = "my-template.json", PreserveLogicalIds = false });

インポートしたリソースを AWS CDK アプリの制御下に置くには、スタックを に追加しますApp

TypeScript
import * as cdk from 'aws-cdk-lib'; import { MyStack } from '../lib/my-stack'; const app = new cdk.App(); new MyStack(app, 'MyStack');
JavaScript
const cdk = require('aws-cdk-lib'); const { MyStack } = require('../lib/my-stack'); const app = new cdk.App(); new MyStack(app, 'MyStack');
Python
import aws_cdk as cdk from mystack.my_stack import MyStack app = cdk.App() MyStack(app, "MyStack")
Java
import software.amazon.awscdk.App; public class MyApp { public static void main(final String[] args) { App app = new App(); new MyStack(app, "MyStack"); } }
C#
using Amazon.CDK; namespace CdkApp { sealed class Program { public static void Main(string[] args) { var app = new App(); new MyStack(app, "MyStack"); } } }

スタック内の AWS リソースに意図しない変更がないことを確認するには、差分を実行できます。を使用する AWS CDK CLI cdk diff コマンドを実行し、 AWS CDK特定のメタデータを省略します。以下に例を示します。

cdk diff --no-version-reporting --no-path-metadata --no-asset-metadata

AWS CloudFormation テンプレートをインポートした後、 AWS CDK アプリケーションはインポートされたリソースの真実のソースになるはずです。リソースを変更するには、 AWS CDK アプリケーションで変更し、 を使用してデプロイします。 AWS CDK CLI cdk deploy コマンド。

インポートされたリソースへのアクセス

サンプルコードtemplateの名前は、インポートされた AWS CloudFormation テンプレートを表します。リソースにアクセスするには、オブジェクトの getResource()メソッドを使用します。返されたリソースに特定のタイプのリソースとしてアクセスするには、結果を目的のタイプにキャストします。これは Python や では必要ありません JavaScript。以下に例を示します。

TypeScript
const cfnBucket = template.getResource('amzn-s3-demo-bucket') as s3.CfnBucket;
JavaScript
const cfnBucket = template.getResource('amzn-s3-demo-bucket');
Python
cfn_bucket = template.get_resource("amzn-s3-demo-bucket")
Java
CfnBucket cfnBucket = (CfnBucket)template.getResource("amzn-s3-demo-bucket");
C#
var cfnBucket = (CfnBucket)template.GetResource("amzn-s3-demo-bucket");

この例では、 cfnBucketaws-s3.CfnBucketクラスのインスタンスになりました。これは、対応する AWS CloudFormation リソースを表す L1 コンストラクトです。そのタイプの他のリソースと同様に扱うことができます。例えば、 bucket.attrArnプロパティでARN値を取得できます。

代わりに L1 CfnBucketリソースを L2 aws-s3.Bucketインスタンスにラップするには、静的メソッド fromBucketArn()fromBucketAttributes()、または を使用しますfromBucketName()。通常、このfromBucketName()方法は最も便利です。以下に例を示します。

TypeScript
const bucket = s3.Bucket.fromBucketName(this, 'Bucket', cfnBucket.ref);
JavaScript
const bucket = s3.Bucket.fromBucketName(this, 'Bucket', cfnBucket.ref);
Python
bucket = s3.Bucket.from_bucket_name(self, "Bucket", cfn_bucket.ref)
Java
Bucket bucket = (Bucket)Bucket.fromBucketName(this, "Bucket", cfnBucket.getRef());
C#
var bucket = (Bucket)Bucket.FromBucketName(this, "Bucket", cfnBucket.Ref);

他の L2 コンストラクトには、既存のリソースからコンストラクトを作成するための同様の方法があります。

L1 コンストラクトを L2 コンストラクトにラップしても、新しいリソースは作成されません。この例では、2 番目の S3; バケットを作成していません。代わりに、新しいBucketインスタンスは既存の をカプセル化しますCfnBucket

この例では、 bucketは他の L2 Bucketコンストラクトと同様に動作する L2 コンストラクトになりました。例えば、バケットの便利なgrantWrite()方法を使用して、バケットへの AWS Lambda 関数書き込みアクセスを許可できます。必要な AWS Identity and Access Management (IAM) ポリシーを手動で定義する必要はありません。以下に例を示します。

TypeScript
bucket.grantWrite(lambdaFunc);
JavaScript
bucket.grantWrite(lambdaFunc);
Python
bucket.grant_write(lambda_func)
Java
bucket.grantWrite(lambdaFunc);
C#
bucket.GrantWrite(lambdaFunc);

パラメータを置き換える

AWS CloudFormation テンプレートにパラメータが含まれている場合は、 parametersプロパティを使用して、インポート時のビルド時間値に置き換えることができます。次の例では、 UploadBucketパラメータを AWS CDK 、コードの他の場所で定義されたバケットARNの に置き換えます。

TypeScript
const template = new cfninc.CfnInclude(this, 'Template', { templateFile: 'my-template.json', parameters: { 'UploadBucket': bucket.bucketArn, }, });
JavaScript
const template = new cfninc.CfnInclude(this, 'Template', { templateFile: 'my-template.json', parameters: { 'UploadBucket': bucket.bucketArn, }, });
Python
template = cfn_inc.CfnInclude(self, "Template", template_file="my-template.json", parameters=dict(UploadBucket=bucket.bucket_arn) )
Java
CfnInclude template = CfnInclude.Builder.create(this, "Template") .templateFile("my-template.json") .parameters(java.util.Map.of( // Map.of requires Java 9+ "UploadBucket", bucket.getBucketArn())) .build();
C#
var template = new cfnInc.CfnInclude(this, "Template", new cfnInc.CfnIncludeProps { TemplateFile = "my-template.json", Parameters = new Dictionary<string, string> { { "UploadBucket", bucket.BucketArn } } });

他のテンプレート要素をインポートする

リソースだけでなく、任意の AWS CloudFormation テンプレート要素をインポートできます。インポートされた AWS CDK 要素はスタックの一部になります。これらの要素をインポートするには、 CfnInclude オブジェクトの次の方法を使用します。

これらのメソッドはそれぞれ、特定のタイプの AWS CloudFormation 要素を表すクラスのインスタンスを返します。これらのオブジェクトは可変です。変更を加えると、スタックから AWS CDK 生成されるテンプレートに表示されます。以下は、テンプレートからパラメータをインポートし、デフォルト値を変更する例です。

TypeScript
const param = template.getParameter('MyParameter'); param.default = "AWS CDK"
JavaScript
const param = template.getParameter('MyParameter'); param.default = "AWS CDK"
Python
param = template.get_parameter("MyParameter") param.default = "AWS CDK"
Java
CfnParameter param = template.getParameter("MyParameter"); param.setDefaultValue("AWS CDK")
C#
var cfnBucket = (CfnBucket)template.GetResource("amzn-s3-demo-bucket"); var param = template.GetParameter("MyParameter"); param.Default = "AWS CDK";

ネストされたスタックをインポートする

ネストされたスタックをインポートするには、メインテンプレートをインポートするとき、または後で指定します。ネストされたテンプレートはローカルファイルに保存する必要がありますが、メインテンプレートではNestedStackリソースとして参照されます。また、 AWS CDK コードで使用されるリソース名は、メインテンプレートのネストされたスタックに使用される名前と一致する必要があります。

メインテンプレートでこのリソース定義を考慮すると、次のコードは、参照されたネストされたスタックを双方向にインポートする方法を示しています。

"NestedStack": { "Type": "AWS::CloudFormation::Stack", "Properties": { "TemplateURL": "https://my-s3-template-source.s3.amazonaws.com/nested-stack.json" }
TypeScript
// include nested stack when importing main stack const mainTemplate = new cfninc.CfnInclude(this, 'MainStack', { templateFile: 'main-template.json', loadNestedStacks: { 'NestedStack': { templateFile: 'nested-template.json', }, }, }); // or add it some time after importing the main stack const nestedTemplate = mainTemplate.loadNestedStack('NestedTemplate', { templateFile: 'nested-template.json', });
JavaScript
// include nested stack when importing main stack const mainTemplate = new cfninc.CfnInclude(this, 'MainStack', { templateFile: 'main-template.json', loadNestedStacks: { 'NestedStack': { templateFile: 'nested-template.json', }, }, }); // or add it some time after importing the main stack const nestedTemplate = mainTemplate.loadNestedStack('NestedStack', { templateFile: 'my-nested-template.json', });
Python
# include nested stack when importing main stack main_template = cfn_inc.CfnInclude(self, "MainStack", template_file="main-template.json", load_nested_stacks=dict(NestedStack= cfn_inc.CfnIncludeProps(template_file="nested-template.json"))) # or add it some time after importing the main stack nested_template = main_template.load_nested_stack("NestedStack", template_file="nested-template.json")
Java
CfnInclude mainTemplate = CfnInclude.Builder.create(this, "MainStack") .templateFile("main-template.json") .loadNestedStacks(java.util.Map.of( // Map.of requires Java 9+ "NestedStack", CfnIncludeProps.builder() .templateFile("nested-template.json").build())) .build(); // or add it some time after importing the main stack IncludedNestedStack nestedTemplate = mainTemplate.loadNestedStack("NestedTemplate", CfnIncludeProps.builder() .templateFile("nested-template.json") .build());
C#
// include nested stack when importing main stack var mainTemplate = new cfnInc.CfnInclude(this, "MainStack", new cfnInc.CfnIncludeProps { TemplateFile = "main-template.json", LoadNestedStacks = new Dictionary<string, cfnInc.ICfnIncludeProps> { { "NestedStack", new cfnInc.CfnIncludeProps { TemplateFile = "nested-template.json" } } } }); // or add it some time after importing the main stack var nestedTemplate = mainTemplate.LoadNestedStack("NestedTemplate", new cfnInc.CfnIncludeProps { TemplateFile = 'nested-template.json' });

ネストされたスタックは、どちらの方法でもインポートできます。メインテンプレートをインポートするときは、ネストされた各スタックのリソース名とそのテンプレートファイルのマッピングを指定します。このマッピングには、任意の数のエントリを含めることができます。最初のインポート後にこれを行うには、ネストされたスタックごとに 1 loadNestedStack()回 を呼び出します。

ネストされたスタックをインポートしたら、メインテンプレートの getNestedStack()メソッドを使用してそれにアクセスできます。

TypeScript
const nestedStack = mainTemplate.getNestedStack('NestedStack').stack;
JavaScript
const nestedStack = mainTemplate.getNestedStack('NestedStack').stack;
Python
nested_stack = main_template.get_nested_stack("NestedStack").stack
Java
NestedStack nestedStack = mainTemplate.getNestedStack("NestedStack").getStack();
C#
var nestedStack = mainTemplate.GetNestedStack("NestedStack").Stack;

getNestedStack() メソッドはIncludedNestedStackインスタンスを返します。このインスタンスから、例に示すように、 stackプロパティを介してインスタンスにアクセスできます AWS CDK NestedStack。また、 経由で元の AWS CloudFormation テンプレートオブジェクトにアクセスすることもできます。includedTemplateそこからリソースやその他の AWS CloudFormation 要素をロードできます。