識別子と AWS CDK - AWS Cloud Development Kit (AWS CDK) v2

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

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

識別子と AWS CDK

AWS Cloud Development Kit (AWS CDK) アプリケーションを構築するときは、さまざまなタイプの識別子と名前を使用します。 AWS CDK を効果的に使用し、エラーを回避するには、識別子のタイプを理解することが重要です。

識別子は、作成された範囲内で一意である必要があります。 AWS CDK アプリケーションでグローバルに一意である必要はありません。

同じスコープ内で同じ値を持つ識別子を作成しようとすると、 は例外を AWS CDK スローします。

構築 IDs

最も一般的な識別子 はid、コンストラクトオブジェクトをインスタンス化するときに 2 番目の引数として渡される識別子です。この識別子は、すべての識別子と同様に、作成先の範囲内でのみ一意である必要があります。これは、コンストラクトオブジェクトをインスタンス化する最初の引数です。

注記

スタックidの は、 で参照するために使用する識別子でもありますAWS CDK CLI リファレンス

アプリケーションamzn-s3-demo-bucketに識別子を持つ 2 つのコンストラクトがある例を見てみましょう。最初の は、 識別子 を使用してスタックのスコープで定義されますStack1。2 番目の は、識別子 を持つスタックのスコープで定義されますStack2。これらは異なるスコープで定義されているため、競合を引き起こすことはなく、問題なく同じアプリケーションに共存できます。

TypeScript
import { App, Stack, StackProps } from 'aws-cdk-lib'; import { Construct } from 'constructs'; import * as s3 from 'aws-cdk-lib/aws-s3'; class MyStack extends Stack { constructor(scope: Construct, id: string, props: StackProps = {}) { super(scope, id, props); new s3.Bucket(this, 'amzn-s3-demo-bucket'); } } const app = new App(); new MyStack(app, 'Stack1'); new MyStack(app, 'Stack2');
JavaScript
const { App , Stack } = require('aws-cdk-lib'); const s3 = require('aws-cdk-lib/aws-s3'); class MyStack extends Stack { constructor(scope, id, props = {}) { super(scope, id, props); new s3.Bucket(this, 'amzn-s3-demo-bucket'); } } const app = new App(); new MyStack(app, 'Stack1'); new MyStack(app, 'Stack2');
Python
from aws_cdk import App, Construct, Stack, StackProps from constructs import Construct from aws_cdk import aws_s3 as s3 class MyStack(Stack): def __init__(self, scope: Construct, id: str, **kwargs): super().__init__(scope, id, **kwargs) s3.Bucket(self, "amzn-s3-demo-bucket") app = App() MyStack(app, 'Stack1') MyStack(app, 'Stack2')
Java
// MyStack.java package com.myorg; import software.amazon.awscdk.App; import software.amazon.awscdk.Stack; import software.amazon.awscdk.StackProps; import software.constructs.Construct; import software.amazon.awscdk.services.s3.Bucket; 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); new Bucket(this, "amzn-s3-demo-bucket"); } } // Main.java package com.myorg; import software.amazon.awscdk.App; public class Main { public static void main(String[] args) { App app = new App(); new MyStack(app, "Stack1"); new MyStack(app, "Stack2"); } }
C#
using Amazon.CDK; using constructs; using Amazon.CDK.AWS.S3; public class MyStack : Stack { public MyStack(Construct scope, string id, IStackProps props) : base(scope, id, props) { new Bucket(this, "amzn-s3-demo-bucket"); } } class Program { static void Main(string[] args) { var app = new App(); new MyStack(app, "Stack1"); new MyStack(app, "Stack2"); } }

パス

AWS CDK アプリケーションの コンストラクトは、Appクラスにルートされた階層を形成します。特定のコンストラクトIDs、その親コンストラクト、その祖父母などの のコレクションを、パス としてコンストラクトツリーのルートに参照します。

AWS CDK は通常、テンプレート内のパスを文字列として表示します。レベルIDsからの は、通常はスタックであるルートAppインスタンスのすぐ下のノードから始まるスラッシュで区切られます。例えば、前のコード例の 2 つの Amazon S3 バケットリソースのパスは Stack1/amzn-s3-demo-bucketと ですStack2/amzn-s3-demo-bucket

次の例に示すように、任意のコンストラクトのパスにプログラムでアクセスできます。これにより、 myConstruct のパス (または my_constructPython デベロッパーが記述する ) を取得します。は、作成する範囲内で一意であるIDs必要があるため、パスは常に AWS CDK アプリケーション内で一意です。

TypeScript
const path: string = myConstruct.node.path;
JavaScript
const path = myConstruct.node.path;
Python
path = my_construct.node.path
Java
String path = myConstruct.getNode().getPath();
C#
string path = myConstruct.Node.Path;

一意 IDs

AWS CloudFormation では、テンプレート内のすべての論理IDsが一意である必要があります。このため、 はアプリケーション内の各コンストラクトに対して一意の識別子を生成できる AWS CDK 必要があります。リソースには、グローバルに一意のパス (スタックから特定のリソースへのすべてのスコープの名前) があります。したがって、 はパスの要素を連結し、8 桁のハッシュを追加することで、必要な一意の識別子 AWS CDK を生成します。(ハッシュは、同じ AWS CloudFormation 識別子になる A/B/Cや などの異なるパスを区別するために必要です。 AWS CloudFormation 識別子は英数字でありA/BC、スラッシュやその他の区切り文字を含めることはできません)。は、この文字列を コンストラクトの一意の ID と AWS CDK 呼び出します。

一般的に、 AWS CDK アプリは一意の について知る必要はありませんIDs。ただし、次の例に示すように、任意のコンストラクトの一意の ID にプログラムでアクセスできます。

TypeScript
const uid: string = Names.uniqueId(myConstruct);
JavaScript
const uid = Names.uniqueId(myConstruct);
Python
uid = Names.unique_id(my_construct)
Java
String uid = Names.uniqueId(myConstruct);
C#
string uid = Names.Uniqueid(myConstruct);

アドレスは、CDKリソースを一意に区別する別の種類の一意の識別子です。パスの SHA-1 ハッシュから派生し、人間が読み取れません。ただし、その定数、比較的短い長さ (常に 42 の 16 進数文字) は、「従来の」一意の ID が長すぎる可能性がある状況に役立ちます。一部のコンストラクトは、一意の ID の代わりに合成された AWS CloudFormation テンプレートのアドレスを使用する場合があります。繰り返しになりますが、アプリケーションは通常、コンストラクトのアドレスを知る必要はありませんが、次のようにコンストラクトのアドレスを取得できます。

TypeScript
const addr: string = myConstruct.node.addr;
JavaScript
const addr = myConstruct.node.addr;
Python
addr = my_construct.node.addr
Java
String addr = myConstruct.getNode().getAddr();
C#
string addr = myConstruct.Node.Addr;

論理的 IDs

Unique IDsは、リソースを表すコンストラクトの生成された AWS CloudFormation テンプレート内の AWS リソースの論理識別子 (または論理名 ) として機能します。

例えば、 内で作成された前の例の Amazon S3 バケットは、 AWS::S3::BucketリソースStack2になります。リソースの論理 ID は、結果の AWS CloudFormation テンプレートStack2amzn-s3-demo-bucket4DD88B4Fにあります。(この識別子の生成方法の詳細については、「」を参照してください一意 IDs。)

論理 ID の安定性

リソースの作成後に論理 ID を変更しないでください。 は、リソースを論理 ID で AWS CloudFormation 識別します。したがって、リソースの論理 ID を変更すると、 は新しい論理 ID を使用して新しいリソース AWS CloudFormation を作成し、 は既存のリソースを削除します。リソースのタイプによっては、サービスの中断、データ損失、またはその両方が発生する可能性があります。