これは v2 AWS CDK デベロッパーガイドです。旧版の CDK v1 は 2022 年 6 月 1 日にメンテナンスを開始し、2023 年 6 月 1 日にサポートを終了しました。
翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
cloudformation-include.CfnInclude
コンストラクトを使用してリソースを L1 コンストラクトに変換することで、 AWS CloudFormation テンプレートから AWS Cloud Development Kit (AWS CDK) アプリケーションにリソースをインポートします。
インポート後、これらのリソースは AWS CDK 、コードで最初に定義されている場合と同じ方法でアプリで操作できます。これらの L1 コンストラクトは、高レベルの AWS CDK コンストラクト内でも使用できます。例えば、L2 許可の付与メソッドが定義するリソースと使用できます。
cloudformation-include.CfnInclude
コンストラクトは基本的に、 AWS CloudFormation テンプレート内の任意のリソースに AWS CDK API ラッパーを追加します。この機能を使用して、既存の AWS CloudFormation テンプレートを一度に 1 つの AWS CDK にインポートします。これにより、 AWS CDK コンストラクトを使用して既存のリソースを管理し、高レベルの抽象化の利点を活用できます。コンストラクト AWS CDK API を提供することで、この機能を使用して AWS CloudFormation テンプレートを AWS CDK デベロッパーに提供することもできます。
注記
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 スタックのコンテキスト内でインポートされます。
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',
});
}
}
デフォルトでは、リソースをインポートすると、リソースの元の論理 ID がテンプレートから保持されます。この動作は AWS CDK、論理 IDs を保持する必要がある AWS CloudFormation テンプレートを にインポートするのに適しています。 は、インポートされたリソースを AWS CloudFormation テンプレートから同じリソースとして認識するためにこの情報 AWS CloudFormation を必要とします。
テンプレートの AWS CDK コンストラクトラッパーを開発して他の AWS CDK デベロッパーが使用できるようにする場合は、代わりに に新しいリソース IDs AWS CDK を生成してもらいます。これにより、名前が競合ぜずにコンストラクトをスタックで複数回使用できます。これを行うには、テンプレートをインポートするときに preserveLogicalIds
プロパティを false
に設定します。以下に例を示します。
const template = new cfninc.CfnInclude(this, 'MyConstruct', {
templateFile: 'my-template.json',
preserveLogicalIds: false
});
インポートされたリソースを AWS CDK アプリの制御下に置くには、 スタックを に追加しますApp
。
import * as cdk from 'aws-cdk-lib';
import { MyStack } from '../lib/my-stack';
const app = new cdk.App();
new MyStack(app, 'MyStack');
スタック内の AWS リソースに意図しない変更がないことを確認するには、差分を実行します。cdk diff
コマンドを使用して、 AWS CDK特定のメタデータを省略します AWS CDK CLI。以下に例を示します。
cdk diff --no-version-reporting --no-path-metadata --no-asset-metadata
AWS CloudFormation テンプレートをインポートすると、 AWS CDK アプリケーションはインポートされたリソースの信頼できるソースになります。リソースを変更するには、 AWS CDK アプリで変更し、 cdk deploy コマンドを使用してデプロイします AWS CDK CLI。
インポートされたリソースへのアクセス
サンプルコードtemplate
の名前は、インポートされた AWS CloudFormation テンプレートを表します。リソースにアクセスするには、オブジェクトの getResource()
メソッドを使用します。返されたリソースに特定のリソースの種類としてアクセスするには、目的のタイプに結果をキャストします。この操作は Python または JavaScript では必要ありません。以下に例を示します。
const cfnBucket = template.getResource('amzn-s3-demo-bucket') as s3.CfnBucket;
この例では、cfnBucket
は aws-s3.CfnBucket
クラスのインスタンスになりました。これは、対応する AWS CloudFormation リソースを表す L1 コンストラクトです。そのタイプの他のリソースと同様に扱うことができます。例えば、bucket.attrArn
プロパティで ARN 値を取得できます。
代わりに L1 CfnBucket
リソースを L2 aws-s3.Bucket
インスタンスにラップするには、静的メソッドの fromBucketArn()
、fromBucketAttributes()
、fromBucketName()
を使用します。通常、fromBucketName()
メソッドが最も便利です。以下に例を示します。
const bucket = s3.Bucket.fromBucketName(this, 'Bucket', cfnBucket.ref);
他の L2 コンストラクトには、既存のリソースからコンストラクトを作成するために同様のメソッドがあります。
L1 コンストラクトを L2 コンストラクトにラップしても、新しいリソースは作成されません。この例では、2 番目の S3; バケットを作成していません。代わりに、新しい Bucket
インスタンスは既存の CfnBucket
をカプセル化します。
この例では、bucket
は他の L2 コンストラクトと同様に動作する L2 Bucket
コンストラクトになりました。例えば、バケットの便利な grantWrite()
メソッドを使用して、 AWS Lambda 関数にバケットへの書き込みアクセスを許可できます。必要な AWS Identity and Access Management (IAM) ポリシーを手動で定義する必要はありません。以下に例を示します。
bucket.grantWrite(lambdaFunc);
パラメータの置き換え
AWS CloudFormation テンプレートにパラメータが含まれている場合は、 parameters
プロパティを使用してインポート時にそれらをビルド時間値に置き換えることができます。次の例では、 UploadBucket
パラメータをコードの他の場所で定義されたバケットの ARN に置き換えます AWS CDK 。
const template = new cfninc.CfnInclude(this, 'Template', {
templateFile: 'my-template.json',
parameters: {
'UploadBucket': bucket.bucketArn,
},
});
他のテンプレート要素のインポート
リソースだけでなく、任意の AWS CloudFormation テンプレート要素をインポートできます。インポートされた要素は AWS CDK
スタックの一部になります。これらの要素をインポートするには、CfnInclude
オブジェクトの次の方法を使用します。
-
getCondition()
– AWS CloudFormation 条件。 -
getMapping()
– AWS CloudFormation マッピング。 -
getOutput()
- AWS CloudFormation 出力。 -
getParameter()
– AWS CloudFormation パラメータ。 -
getRule()
– テンプレートの AWS Service Catalog AWS CloudFormation ルール。
これらのメソッドはそれぞれ、特定のタイプの AWS CloudFormation 要素を表すクラスのインスタンスを返します。これらのオブジェクトは可変です。変更を加えると、 AWS CDK スタックから生成されるテンプレートに表示されます。次の内容は、テンプレートからパラメータをインポートし、デフォルト値を変更する例です。
const 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"
}
// 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',
});
複数のネストされたスタックは、どちらの方法でもインポートできます。メインテンプレートをインポートするとき、ネストされた各スタックのリソース名とそのテンプレートファイル間のマッピングを指定します。このマッピングには、任意の数のエントリを含めることができます。最初のインポート後に行うには、ネストされたスタックごとに loadNestedStack()
を 1 回呼び出します。
ネストされたスタックをインポートしたら、メインテンプレートの getNestedStack()
メソッドを使用してアクセスできます。
const nestedStack = mainTemplate.getNestedStack('NestedStack').stack;
getNestedStack()
メソッドは IncludedNestedStack
インスタンスを返します。このインスタンスから、例に示すように、 stack
プロパティを介してインスタンスにアクセスできます AWS CDK NestedStack
。経由で元の AWS CloudFormation テンプレートオブジェクトにアクセスすることもできます。includedTemplate
そこからリソースやその他の AWS CloudFormation 要素をロードできます。