これは v2 AWS CDK デベロッパーガイドです。古い CDKv1 は 2022 年 6 月 1 日にメンテナンスを開始し、2023 年 6 月 1 日にサポートを終了しました。
翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
識別子と AWS CDK
AWS Cloud Development Kit (AWS CDK) アプリケーションを構築するときは、さまざまなタイプの識別子と名前を使用します。 AWS CDK を効果的に使用し、エラーを回避するには、識別子のタイプを理解することが重要です。
識別子は、作成された範囲内で一意である必要があります。 AWS CDK アプリケーションでグローバルに一意である必要はありません。
同じスコープ内で同じ値を持つ識別子を作成しようとすると、 は例外を AWS CDK スローします。
コンストラクト IDs
最も一般的な識別子の id
は、コンストラクトオブジェクトをインスタンス化するときに 2 番目の引数として渡される識別子です。この識別子は、すべての識別子と同様に、作成先の範囲内でのみ一意である必要があり、コンストラクトオブジェクトをインスタンス化するときの最初の引数です。
アプリで MyBucket
識別子を持つ 2 つのコンストラクトがある例を見てみましょう。1 つ目は、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, 'MyBucket');
}
}
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, 'MyBucket');
}
}
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, "MyBucket")
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, "MyBucket");
}
}
// 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, "MyBucket");
}
}
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/MyBucket
および Stack2/MyBucket
です。
次の例で示すように、プログラムですべてのコンストラクトのパスにアクセスできます。これは myConstruct
(Python デベロッパーは my_construct
と記述します) のパスを取得します。は、作成されるスコープ内で一意である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
一意の IDsは、リソースを表すコンストラクト用に生成された AWS CloudFormation テンプレート内の AWS リソースの論理識別子 (または論理名) として機能します。
例えば、Stack2
内で作成された前の例の Amazon S3 バケットは、AWS::S3::Bucket
リソースになります。リソースの論理 ID は、結果の AWS CloudFormation テンプレートStack2MyBucket4DD88B4F
にあります。(この識別子の生成方法の詳細については、「一意 IDs」を参照してください)
論理 ID の安定性
リソースの作成後に論理 ID を変更しないでください。 は、リソースを論理 ID で AWS CloudFormation 識別します。したがって、リソースの論理 ID を変更すると、 は新しい論理 ID を使用して新しいリソース AWS CloudFormation を作成し、既存のリソースを削除します。リソースのタイプによっては、サービスの中断、データ損失、その両方が発生する場合があります。