これはAWS CDK v2 開発者ガイドです。古いCDK v1は2022年6月1日にメンテナンスを開始し、今後は重大なバグ修正とセキュリティパッチのみが提供されます。新機能はCDK v2専用に開発されます。CDK v1 Support は、2023 年 6 月 1 日に完全に終了します。
翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
リソース
で説明したようにコンストラクト、には、AWS CDKAWSAWSすべてのリソースを表すコンストラクトと呼ばれるコンストラクトの豊富なクラスライブラリが用意されています。
対応する構成を使用してリソースのインスタンスを作成するには、最初の引数としてスコープ、構成の論理 ID、および構成プロパティ (prop) のセットを渡します。たとえば、構築ライブラリの SQS.QueueAWS KMS コンストラクトを使用して暗号化された Amazon SQS キューを作成する方法は次のとおりです。AWS
- TypeScript
-
import * as sqs from '@aws-cdk/aws-sqs';
new sqs.Queue(this, 'MyQueue', {
encryption: sqs.QueueEncryption.KMS_MANAGED
});
- JavaScript
-
const sqs = require('@aws-cdk/aws-sqs');
new sqs.Queue(this, 'MyQueue', {
encryption: sqs.QueueEncryption.KMS_MANAGED
});
- Python
-
import aws_cdk.aws_sqs as sqs
sqs.Queue(self, "MyQueue", encryption=sqs.QueueEncryption.KMS_MANAGED)
- Java
-
import software.amazon.awscdk.services.sqs.*;
Queue.Builder.create(this, "MyQueue").encryption(
QueueEncryption.KMS_MANAGED).build();
- C#
-
using Amazon.CDK.AWS.SQS;
new Queue(this, "MyQueue", new QueueProps
{
Encryption = QueueEncryption.KMS_MANAGED
});
一部の構成プロップはオプションで、多くの場合デフォルト値があります。場合によっては、すべてのプロパティがオプションであり、最後の引数は完全に省略できます。
リソース属性
AWSConstruct Library のほとんどのリソースは属性を公開しますが、その属性はデプロイ時にによって解決されますAWS CloudFormation。属性は、タイプ名をプレフィックスとするリソースクラスのプロパティの形式で公開されます。次の例は、queueUrl
(Python:queue_url
) プロパティを使用して Amazon SQS キューの URL を取得する方法を示しています。
- TypeScript
-
import * as sqs from '@aws-cdk/aws-sqs';
const queue = new sqs.Queue(this, 'MyQueue');
const url = queue.queueUrl; // => A string representing a deploy-time value
- JavaScript
-
const sqs = require('@aws-cdk/aws-sqs');
const queue = new sqs.Queue(this, 'MyQueue');
const url = queue.queueUrl; // => A string representing a deploy-time value
- Python
-
import aws_cdk.aws_sqs as sqs
queue = sqs.Queue(self, "MyQueue")
url = queue.queue_url # => A string representing a deploy-time value
- Java
-
Queue queue = new Queue(this, "MyQueue");
String url = queue.getQueueUrl(); // => A string representing a deploy-time value
- C#
-
var queue = new Queue(this, "MyQueue");
var url = queue.QueueUrl; // => A string representing a deploy-time value
AWS CDKがデプロイ時の属性を文字列としてエンコードする方法については、を参照してくださいトークン。
参照リソース
AWS CDK多くのクラスには、AWS CDKリソースオブジェクト (リソース) であるプロパティが必要です。たとえば、Amazon ECS リソースには、そのリソースが実行されているクラスターへの参照が必要です。Amazon CloudFront ディストリビューションには、ソースコードを含むバケットへの参照が必要です。これらの要件を満たすには、次の 2 つの方法があります。
AWS構成プロパティが別の構成を表す場合、その型はその構成のインタフェースタイプの型になります。たとえば、Amazon ECS サービスはタイプのプロパティを受け取り、cluster
ecs.ICluster
CloudFront ディストリビューションはタイプのプロパティsourceBucket
(Python:source_bucket
) を取りますs3.IBucket
。
AWS CDK同じアプリで定義されている適切なタイプのリソースオブジェクトを直接渡すことができます。次の例では、Amazon ECS クラスターを定義し、それを使用して Amazon ECS サービスを定義します。
- TypeScript
-
const cluster = new ecs.Cluster(this, 'Cluster', { /*...*/ });
const service = new ecs.Ec2Service(this, 'Service', { cluster: cluster });
- JavaScript
-
const cluster = new ecs.Cluster(this, 'Cluster', { /*...*/ });
const service = new ecs.Ec2Service(this, 'Service', { cluster: cluster });
- Python
-
cluster = ecs.Cluster(self, "Cluster")
service = ecs.Ec2Service(self, "Service", cluster=cluster)
- Java
-
Cluster cluster = new Cluster(this, "Cluster");
Ec2Service service = new Ec2Service(this, "Service",
new Ec2ServiceProps.Builder().cluster(cluster).build());
- C#
-
var cluster = new Cluster(this, "Cluster");
var service = new Ec2Service(this, "Service", new Ec2ServiceProps { Cluster = cluster });
別のスタックのリソースを参照する
同じアプリケーションで定義され、AWS同じアカウントとリージョンにある限り、別のスタックのリソースを参照できます。一般的に次のパターンが使用されます。
次の例では、スタックを定義しますstack1
。このスタックは Amazon S3 バケットを定義し、バケット構造への参照をスタックの属性として保存します。次に、アプリは 2 つ目のスタックを定義します。このスタックはstack2
、インスタンス化時にバケットを受け入れます。 stack2
たとえば、AWS Glueデータストレージにバケットを使用するテーブルを定義できます。
- TypeScript
-
const prod = { account: '123456789012', region: 'us-east-1' };
const stack1 = new StackThatProvidesABucket(app, 'Stack1', { env: prod });
// stack2 will take a property { bucket: IBucket }
const stack2 = new StackThatExpectsABucket(app, 'Stack2', {
bucket: stack1.bucket,
env: prod
});
- JavaScript
-
const prod = { account: '123456789012', region: 'us-east-1' };
const stack1 = new StackThatProvidesABucket(app, 'Stack1', { env: prod });
// stack2 will take a property { bucket: IBucket }
const stack2 = new StackThatExpectsABucket(app, 'Stack2', {
bucket: stack1.bucket,
env: prod
});
- Python
-
prod = core.Environment(account="123456789012", region="us-east-1")
stack1 = StackThatProvidesABucket(app, "Stack1", env=prod)
# stack2 will take a property "bucket"
stack2 = StackThatExpectsABucket(app, "Stack2", bucket=stack1.bucket, env=prod)
- Java
-
// Helper method to build an environment
static Environment makeEnv(String account, String region) {
return Environment.builder().account(account).region(region)
.build();
}
App app = new App();
Environment prod = makeEnv("123456789012", "us-east-1");
StackThatProvidesABucket stack1 = new StackThatProvidesABucket(app, "Stack1",
StackProps.builder().env(prod).build());
// stack2 will take an argument "bucket"
StackThatExpectsABucket stack2 = new StackThatExpectsABucket(app, "Stack,",
StackProps.builder().env(prod).build(), stack1.bucket);
- C#
-
Amazon.CDK.Environment makeEnv(string account, string region)
{
return new Amazon.CDK.Environment { Account = account, Region = region };
}
var prod = makeEnv(account: "123456789012", region: "us-east-1");
var stack1 = new StackThatProvidesABucket(app, "Stack1", new StackProps { Env = prod });
// stack2 will take a property "bucket"
var stack2 = new StackThatExpectsABucket(app, "Stack2", new StackProps { Env = prod,
bucket = stack1.Bucket});
は、リソースが同じアカウントとリージョンにあるが、AWS CDKスタックが異なると判断した場合、AWS CloudFormation生成スタックのエクスポートと消費スタックの Fn::ImportValue を自動的に統合して、その情報をあるスタックから別のスタックに転送します。
依存関係のデッドロックの解決
あるスタックのリソースを別のスタックで参照すると、2 つのスタック間に依存関係が生じます。これにより、正しい順序でデプロイされていることを確認できます。スタックがデプロイされると、この依存関係は明確になります。その後、使用中のスタックから共有リソースの使用を削除すると、予期しないデプロイが失敗する可能性があります。これは、2 つのスタックの間に別の依存関係があり、それらを同じ順序でデプロイする必要がある場合に発生します。また、CDK Toolkit が生成スタックを最初にデプロイするように選択しただけであれば、依存関係がない場合もあります。AWS CloudFormationエクスポートは不要になったため生成スタックから削除されますが、エクスポートされたリソースは更新がまだデプロイされていないため、使用スタックではまだ使用されています。そのため、プロデューサースタックのデプロイは失敗します。
このデッドロックを解消するには、使用しているスタックから共有リソースの使用を削除してください。(これにより、生成スタックから自動エクスポートが削除されます)。次に、自動生成されたエクスポートとまったく同じ論理 ID を使用して、同じエクスポートを生成スタックに手動で追加します。消費スタックの共有リソースの使用を削除し、両方のスタックをデプロイします。次に、手動エクスポート (および不要になった場合は共有リソース) を削除し、両方のスタックを再デプロイします。exportValue()
スタックのメソッドは、この目的で手動エクスポートを作成する場合に便利な方法です。(リンク先のメソッドリファレンスの例を参照してください。)
AWSアカウント内のリソースの参照
AWSAWS CDKアカウントですでに使用可能なリソースをアプリで使用したいとします。これは、コンソール、AWS SDK、直接AWS CloudFormation、AWS CDKまたは別のアプリケーションで定義されたリソースである可能性があります。リソースの ARN (または別の識別属性または属性のグループ) をプロキシオブジェクトに変換できます。プロキシオブジェクトは、リソースのクラスで静的ファクトリメソッドを呼び出すことにより、リソースへの参照として機能します。
このようなプロキシを作成しても、AWS CDK外部リソースはアプリの一部にはなりません。したがって、AWS CDKアプリ内のプロキシを変更しても、デプロイされたリソースには影響しません。ただし、プロキシは、AWS CDKそのタイプのリソースを必要とする任意のメソッドに渡すことができます。
次の例は、ARN: aws: s3::: を使用して既存のバケットに基づいてバケットを参照する方法と、特定の ID を持つ既存の VPC に基づく Amazon Virtual Private Cloud を参照する方法を示しています。my-bucket-name
- TypeScript
-
// Construct a proxy for a bucket by its name (must be same account)
s3.Bucket.fromBucketName(this, 'MyBucket', 'my-bucket-name');
// Construct a proxy for a bucket by its full ARN (can be another account)
s3.Bucket.fromBucketArn(this, 'MyBucket', 'arn:aws:s3:::my-bucket-name');
// Construct a proxy for an existing VPC from its attribute(s)
ec2.Vpc.fromVpcAttributes(this, 'MyVpc', {
vpcId: 'vpc-1234567890abcde',
});
- JavaScript
-
// Construct a proxy for a bucket by its name (must be same account)
s3.Bucket.fromBucketName(this, 'MyBucket', 'my-bucket-name');
// Construct a proxy for a bucket by its full ARN (can be another account)
s3.Bucket.fromBucketArn(this, 'MyBucket', 'arn:aws:s3:::my-bucket-name');
// Construct a proxy for an existing VPC from its attribute(s)
ec2.Vpc.fromVpcAttributes(this, 'MyVpc', {
vpcId: 'vpc-1234567890abcde'
});
- Python
-
# Construct a proxy for a bucket by its name (must be same account)
s3.Bucket.from_bucket_name(self, "MyBucket", "my-bucket-name")
# Construct a proxy for a bucket by its full ARN (can be another account)
s3.Bucket.from_bucket_arn(self, "MyBucket", "arn:aws:s3:::my-bucket-name")
# Construct a proxy for an existing VPC from its attribute(s)
ec2.Vpc.from_vpc_attributes(self, "MyVpc", vpc_id="vpc-1234567890abcdef")
- Java
-
// Construct a proxy for a bucket by its name (must be same account)
Bucket.fromBucketName(this, "MyBucket", "my-bucket-name");
// Construct a proxy for a bucket by its full ARN (can be another account)
Bucket.fromBucketArn(this, "MyBucket",
"arn:aws:s3:::my-bucket-name");
// Construct a proxy for an existing VPC from its attribute(s)
Vpc.fromVpcAttributes(this, "MyVpc", VpcAttributes.builder()
.vpcId("vpc-1234567890abcdef").build());
- C#
-
// Construct a proxy for a bucket by its name (must be same account)
Bucket.FromBucketName(this, "MyBucket", "my-bucket-name");
// Construct a proxy for a bucket by its full ARN (can be another account)
Bucket.FromBucketArn(this, "MyBucket", "arn:aws:s3:::my-bucket-name");
// Construct a proxy for an existing VPC from its attribute(s)
Vpc.FromVpcAttributes(this, "MyVpc", new VpcAttributes
{
VpcId = "vpc-1234567890abcdef"
});
Vpc.fromLookup()
この方法を詳しく見ていきます。ec2.Vpc
構成は複雑なので、CDK アプリで使用する VPC を選択する方法はたくさんあります。これに対処するため、VPCfromLookup
コンストラクトには静的メソッド (Python:from_lookup
) があり、AWS合成時にアカウントにクエリを実行して目的の Amazon VPC を検索できます。
使用するにはVpc.fromLookup()
、スタックを合成するシステムが Amazon VPC を所有するアカウントにアクセスできる必要があります。これは、CDK ツールキットが合成時にアカウントにクエリを実行して適切な Amazon VPC を見つけるためです。
さらに、Vpc.fromLookup()
明示的なアカウントとリージョンで定義されたスタックでのみ機能します (を参照環境)。が環境に依存しないスタックから Amazon VPCAWS CDK を検索しようとしても、CDK Toolkit は VPC を見つけるためにどの環境をクエリすればよいかを判断できません。
AWSアカウント内の VPCVpc.fromLookup()
を一意に識別するのに十分な属性を指定する必要があります。たとえば、デフォルト VPC は 1 つしか設定できないため、VPC をデフォルトとして指定すれば十分です。
- TypeScript
-
ec2.Vpc.fromLookup(this, 'DefaultVpc', {
isDefault: true
});
- JavaScript
-
ec2.Vpc.fromLookup(this, 'DefaultVpc', {
isDefault: true
});
- Python
-
ec2.Vpc.from_lookup(self, "DefaultVpc", is_default=True)
- Java
-
Vpc.fromLookup(this, "DefaultVpc", VpcLookupOptions.builder()
.isDefault(true).build());
- C#
-
Vpc.FromLookup(this, id = "DefaultVpc", new VpcLookupOptions { IsDefault = true });
tags
プロパティを使用して VPC をタグでクエリすることもできます。Amazon VPC の作成時に、AWS CloudFormationまたはを使用してタグを追加できますAWS CDK。タグは、、AWS Management Console、またはAWS SDK を使用して作成後いつでも編集できます。AWS CLIは、自分で追加したタグに加えて、作成するすべての VPCAWS CDK に次のタグを自動的に追加します。
- TypeScript
-
ec2.Vpc.fromLookup(this, 'PublicVpc',
{tags: {'aws-cdk:subnet-type': "Public"}});
- JavaScript
-
ec2.Vpc.fromLookup(this, 'PublicVpc',
{tags: {'aws-cdk:subnet-type': "Public"}});
- Python
-
ec2.Vpc.from_lookup(self, "PublicVpc",
tags={"aws-cdk:subnet-type": "Public"})
- Java
-
Vpc.fromLookup(this, "PublicVpc", VpcLookupOptions.builder()
.tags(java.util.Map.of("aws-cdk:subnet-type", "Public")) // Java 9 or later
.build());
- C#
-
Vpc.FromLookup(this, id = "PublicVpc", new VpcLookupOptions
{ Tags = new Dictionary<string, string> { ["aws-cdk:subnet-type"] = "Public" });
Vpc.fromLookup()
cdk.context.json
の結果はプロジェクトのファイルにキャッシュされます。(「ランタイムコンテキスト」を参照してください。) このファイルをバージョン管理にコミットして、アプリケーションが引き続き同じ Amazon VPC を参照するようにします。これは、後で VPC の属性を変更して別の VPC が選択されるような場合でも機能します。これは、CDK Pipelines などの VPCAWS を定義するアカウントにアクセスできない環境にスタックをデプロイする場合に特に重要です。
外部リソースは、AWS CDKアプリで定義されている同様のリソースを使用する場所であればどこでも使用できますが、変更することはできません。たとえば、外部でaddToResourcePolicy
(Python:add_to_resource_policy
)s3.Bucket
を呼び出しても何も起こりません。
[Physical name
AWS CloudFormationのリソースの論理名は、AWS Management Consoleによってデプロイされた後に表示されるリソースの名前とは異なりますAWS CloudFormation。は、AWS CDKこれらの最終的な名前を物理名と呼んでいます。
AWS CloudFormationたとえば、前の例の論理 ID Stack2MyBucket 4DD88B4F で Amazon S3 バケットを作成し、物理名は stack2mybucket4dd88b4f-iuv1rbv9z3to とします。
リソースを表す構成を作成するときに、プロパティ Name <resourceType>を使用して物理名を指定できます。次の例では、物理的な名前を持つ Amazon S3 バケットを作成しますmy-bucket-name。
- TypeScript
-
const bucket = new s3.Bucket(this, 'MyBucket', {
bucketName: 'my-bucket-name',
});
- JavaScript
-
const bucket = new s3.Bucket(this, 'MyBucket', {
bucketName: 'my-bucket-name'
});
- Python
-
bucket = s3.Bucket(self, "MyBucket", bucket_name="my-bucket-name")
- Java
-
Bucket bucket = Bucket.Builder.create(this, "MyBucket")
.bucketName("my-bucket-name").build();
- C#
-
var bucket = new Bucket(this, "MyBucket", new BucketProps { BucketName = "my-bucket-name" });
リソースに物理名を割り当てることには、いくつかの欠点がありますAWS CloudFormation。最も重要なのは、リソースに物理名が割り当てられていると、作成後に変更できないリソースのプロパティの変更など、リソースの交換が必要なデプロイ済みリソースへの変更が失敗することです。最終的にその状態になった場合、AWS CloudFormationAWS CDK唯一の解決策はスタックを削除してからアプリケーションを再デプロイすることです。詳細については、AWS CloudFormationドキュメントを参照してください。
AWS CDK環境間の参照を含むアプリを作成するときなど、AWS CDKが正しく機能するためには物理名が必要な場合があります。そのような場合は、わざわざ自分で物理的な名前を思いつきたくない場合は、AWS CDKその名前を付けることができます。これを行うには、PhysicalName.GENERATE_IF_NEEDED
以下のように特別な値を使用します。
- TypeScript
-
const bucket = new s3.Bucket(this, 'MyBucket', {
bucketName: core.PhysicalName.GENERATE_IF_NEEDED,
});
- JavaScript
-
const bucket = new s3.Bucket(this, 'MyBucket', {
bucketName: core.PhysicalName.GENERATE_IF_NEEDED
});
- Python
-
bucket = s3.Bucket(self, "MyBucket",
bucket_name=core.PhysicalName.GENERATE_IF_NEEDED)
- Java
-
Bucket bucket = Bucket.Builder.create(this, "MyBucket")
.bucketName(PhysicalName.GENERATE_IF_NEEDED).build();
- C#
-
var bucket = new Bucket(this, "MyBucket", new BucketProps
{ BucketName = PhysicalName.GENERATE_IF_NEEDED });
一意の識別子を渡す
前のセクションで説明したように、可能な限り、リソースを参照渡してください。ただし、リソースをその属性の 1 つで参照する以外に選択肢がない場合もあります。ユースケースの例には以下が含まれます。
これらの識別子は、次のようなリソースの属性として使用できます。
- TypeScript
-
bucket.bucketName
lambdaFunc.functionArn
securityGroup.groupArn
- JavaScript
-
bucket.bucketName
lambdaFunc.functionArn
securityGroup.groupArn
- Python
-
bucket.bucket_name
lambda_func.function_arn
security_group_arn
- Java
-
JavaAWS CDK バインディングでは、属性に getter メソッドを使用します。
bucket.getBucketName()
lambdaFunc.getFunctionArn()
securityGroup.getGroupArn()
- C#
-
bucket.BucketName
lambdaFunc.FunctionArn
securityGroup.GroupArn
次の例は、AWS Lambda生成されたバケット名を関数に渡す方法を示しています。
- TypeScript
-
const bucket = new s3.Bucket(this, 'Bucket');
new lambda.Function(this, 'MyLambda', {
// ...
environment: {
BUCKET_NAME: bucket.bucketName,
},
});
- JavaScript
-
const bucket = new s3.Bucket(this, 'Bucket');
new lambda.Function(this, 'MyLambda', {
// ...
environment: {
BUCKET_NAME: bucket.bucketName
}
});
- Python
-
bucket = s3.Bucket(self, "Bucket")
lambda.Function(self, "MyLambda", environment=dict(BUCKET_NAME=bucket.bucket_name))
- Java
-
final Bucket bucket = new Bucket(this, "Bucket");
Function.Builder.create(this, "MyLambda")
.environment(java.util.Map.of( // Java 9 or later
"BUCKET_NAME", bucket.getBucketName()))
.build();
- C#
-
var bucket = new Bucket(this, "Bucket");
new Function(this, "MyLambda", new FunctionProps
{
Environment = new Dictionary<string, string>
{
["BUCKET_NAME"] = bucket.BucketName
}
});
アクセス許可の付与
AWSコンストラクトは、権限要件を表現するためのシンプルなインテントベースの API を提供することで、最小権限の権限を実現できるようにします。AWS多くのコンストラクトには、IAM 権限ステートメントを手動で作成しなくても、リソースを操作する権限をエンティティ (IAM ロールやユーザーなど) に付与できる付与方法が用意されています。
次の例では、Lambda 関数の実行ロールが特定の Amazon S3 バケットに対してオブジェクトを読み書きできるようにするアクセス権限を作成します。Amazon S3AWS KMS バケットがキーで暗号化されている場合、このメソッドはキーを使用して復号化するアクセス権限を Lambda 関数の実行ロールにも付与します。
- TypeScript
-
if (bucket.grantReadWrite(func).success) {
// ...
}
- JavaScript
-
if ( bucket.grantReadWrite(func).success) {
// ...
}
- Python
-
if bucket.grant_read_write(func).success:
# ...
- Java
-
if (bucket.grantReadWrite(func).getSuccess()) {
// ...
}
- C#
-
if (bucket.GrantReadWrite(func).Success)
{
// ...
}
iam.Grant
グラントメソッドはオブジェクトを返します。success
Grant
オブジェクトの属性を使用して、権限が効果的に適用されたかどうかを判断します (たとえば、外部リソースには適用されていない可能性があります)。Grant
オブジェクトのassertSuccess
(Python:assert_success
) メソッドを使用して、権限が正常に適用されたことを強制することもできます。
特定のユースケースで特定の付与方法が使用できない場合は、汎用的な付与方法を使用して、指定されたアクションリストを使用して新しい権限を定義できます。
次の例は、Lambda 関数に Amazon DynamoDBCreateBackup
アクションへのアクセスを許可する方法を示しています。
- TypeScript
-
table.grant(func, 'dynamodb:CreateBackup');
- JavaScript
-
table.grant(func, 'dynamodb:CreateBackup');
- Python
-
table.grant(func, "dynamodb:CreateBackup")
- Java
-
table.grant(func, "dynamodb:CreateBackup");
- C#
-
table.Grant(func, "dynamodb:CreateBackup");
Lambda 関数などの多くのリソースでは、コードを実行するときにロールを引き受ける必要があります。構成プロパティを使用すると、を指定できますiam.IRole
。ロールが指定されていない場合、関数はこの用途専用のロールを自動的に作成します。その後、リソースの付与メソッドを使用してロールにステートメントを追加できます。
グラントメソッドは、IAM ポリシーを処理するための下位レベルの API を使用して構築されています。PolicyDocumentポリシーはオブジェクトとしてモデル化されます。addToRolePolicy
メソッド (Python:) を使用してロール (またはコンストラクトにアタッチされたロールadd_to_role_policy
) にステートメントを直接追加するか、(Python:)Bucket
メソッドを使用してリソースのポリシーaddToResourcePolicy
(ポリシーなどadd_to_resource_policy
) にステートメントを追加します。
メトリクスおよびアラーム
多くのリソースでは、 CloudWatch モニタリングダッシュボードとアラームの設定に使用できるメトリクスが出力されます。 AWSコンストラクトには、使用する正しい名前を調べなくてもメトリックにアクセスできるメトリックメソッドがあります。
次の例は、Amazon SQS キューのApproximateNumberOfMessagesNotVisible
- TypeScript
-
import * as cw from '@aws-cdk/aws-cloudwatch';
import * as sqs from '@aws-cdk/aws-sqs';
import { Duration } from '@aws-cdk/core';
const queue = new sqs.Queue(this, 'MyQueue');
const metric = queue.metricApproximateNumberOfMessagesNotVisible({
label: 'Messages Visible (Approx)',
period: Duration.minutes(5),
// ...
});
metric.createAlarm(this, 'TooManyMessagesAlarm', {
comparisonOperator: cw.ComparisonOperator.GREATER_THAN_THRESHOLD,
threshold: 100,
// ...
});
- JavaScript
-
const cw = require('@aws-cdk/aws-cloudwatch');
const sqs = require('@aws-cdk/aws-sqs');
const { Duration } = require('@aws-cdk/core');
const queue = new sqs.Queue(this, 'MyQueue');
const metric = queue.metricApproximateNumberOfMessagesNotVisible({
label: 'Messages Visible (Approx)',
period: Duration.minutes(5)
// ...
});
metric.createAlarm(this, 'TooManyMessagesAlarm', {
comparisonOperator: cw.ComparisonOperator.GREATER_THAN_THRESHOLD,
threshold: 100
// ...
});
- Python
-
import aws_cdk.aws_cloudwatch as cw
import aws_cdk.aws_sqs as sqs
from aws_cdk.core import Duration
queue = sqs.Queue(self, "MyQueue")
metric = queue.metric_approximate_number_of_messages_not_visible(
label="Messages Visible (Approx)",
period=Duration.minutes(5),
# ...
)
metric.create_alarm(self, "TooManyMessagesAlarm",
comparison_operator=cw.ComparisonOperator.GREATER_THAN_THRESHOLD,
threshold=100,
# ...
)
- Java
-
import software.amazon.awscdk.core.Duration;
import software.amazon.awscdk.services.sqs.Queue;
import software.amazon.awscdk.services.cloudwatch.Metric;
import software.amazon.awscdk.services.cloudwatch.MetricOptions;
import software.amazon.awscdk.services.cloudwatch.CreateAlarmOptions;
import software.amazon.awscdk.services.cloudwatch.ComparisonOperator;
Queue queue = new Queue(this, "MyQueue");
Metric metric = queue
.metricApproximateNumberOfMessagesNotVisible(MetricOptions.builder()
.label("Messages Visible (Approx)")
.period(Duration.minutes(5)).build());
metric.createAlarm(this, "TooManyMessagesAlarm", CreateAlarmOptions.builder()
.comparisonOperator(ComparisonOperator.GREATER_THAN_THRESHOLD)
.threshold(100)
// ...
.build());
- C#
-
using cdk = Amazon.CDK;
using cw = Amazon.CDK.AWS.CloudWatch;
using sqs = Amazon.CDK.AWS.SQS;
var queue = new sqs.Queue(this, "MyQueue");
var metric = queue.MetricApproximateNumberOfMessagesNotVisible(new cw.MetricOptions
{
Label = "Messages Visible (Approx)",
Period = cdk.Duration.Minutes(5),
// ...
});
metric.CreateAlarm(this, "TooManyMessagesAlarm", new cw.CreateAlarmOptions
{
ComparisonOperator = cw.ComparisonOperator.GREATER_THAN_THRESHOLD,
Threshold = 100,
// ..
});
特定のメトリックのメソッドがない場合は、一般的なメトリックメソッドを使用してメトリック名を手動で指定できます。
CloudWatch 指標をダッシュボードに追加することもできます。「CloudWatch」を参照してください。
ネットワークトラフィック
多くの場合、コンピューティングインフラストラクチャがパーシスタンスレイヤーにアクセスする必要がある場合など、アプリケーションを機能させるにはネットワーク上で権限を有効にする必要があります。接続を確立またはリッスンするリソースは、セキュリティグループのルールやネットワーク ACL の設定など、トラフィックフローを可能にするメソッドを公開します。
iConnectable リソースには、connections
ネットワークトラフィックルール設定のゲートウェイとなるプロパティがあります。
allow
メソッドを使用して、特定のネットワークパスにデータを送信できるようにします。次の例では、ウェブへの HTTPS 接続と Amazon EC2 Auto Scaling グループからの受信接続を有効にしますfleet2
。
- TypeScript
-
import * as asg from '@aws-cdk/aws-autoscaling';
import * as ec2 from '@aws-cdk/aws-ec2';
const fleet1: asg.AutoScalingGroup = asg.AutoScalingGroup(/*...*/);
// Allow surfing the (secure) web
fleet1.connections.allowTo(new ec2.Peer.anyIpv4(), new ec2.Port({ fromPort: 443, toPort: 443 }));
const fleet2: asg.AutoScalingGroup = asg.AutoScalingGroup(/*...*/);
fleet1.connections.allowFrom(fleet2, ec2.Port.AllTraffic());
- JavaScript
-
const asg = require('@aws-cdk/aws-autoscaling');
const ec2 = require('@aws-cdk/aws-ec2');
const fleet1 = asg.AutoScalingGroup();
// Allow surfing the (secure) web
fleet1.connections.allowTo(new ec2.Peer.anyIpv4(), new ec2.Port({ fromPort: 443, toPort: 443 }));
const fleet2 = asg.AutoScalingGroup();
fleet1.connections.allowFrom(fleet2, ec2.Port.AllTraffic());
- Python
-
import aws_cdk.aws_autoscaling as asg
import aws_cdk.aws_ec2 as ec2
fleet1 = asg.AutoScalingGroup( ... )
# Allow surfing the (secure) web
fleet1.connections.allow_to(ec2.Peer.any_ipv4(),
ec2.Port(PortProps(from_port=443, to_port=443)))
fleet2 = asg.AutoScalingGroup( ... )
fleet1.connections.allow_from(fleet2, ec2.Port.all_traffic())
- Java
-
import software.amazon.awscdk.services.autoscaling.AutoScalingGroup;
import software.amazon.awscdk.services.ec2.Peer;
import software.amazon.awscdk.services.ec2.Port;
AutoScalingGroup fleet1 = AutoScalingGroup.Builder.create(this, "MyFleet")
/* ... */.build();
// Allow surfing the (secure) Web
fleet1.getConnections().allowTo(Peer.anyIpv4(),
Port.Builder.create().fromPort(443).toPort(443).build());
AutoScalingGroup fleet2 = AutoScalingGroup.Builder.create(this, "MyFleet2")
/* ... */.build();
fleet1.getConnections().allowFrom(fleet2, Port.allTraffic());
- C#
-
using cdk = Amazon.CDK;
using asg = Amazon.CDK.AWS.AutoScaling;
using ec2 = Amazon.CDK.AWS.EC2;
// Allow surfing the (secure) Web
var fleet1 = new asg.AutoScalingGroup(this, "MyFleet", new asg.AutoScalingGroupProps { /* ... */ });
fleet1.Connections.AllowTo(ec2.Peer.AnyIpv4(), new ec2.Port(new ec2.PortProps
{ FromPort = 443, ToPort = 443 });
var fleet2 = new asg.AutoScalingGroup(this, "MyFleet2", new asg.AutoScalingGroupProps { /* ... */ });
fleet1.Connections.AllowFrom(fleet2, ec2.Port.AllTraffic());
特定のリソースには、関連するデフォルトポートがあります。例としては、パブリックポート上のロードバランサーのリスナーや、データベースエンジンが Amazon RDS データベースのインスタンスへの接続を受け入れるポートなどがあります。このような場合は、ポートを手動で指定しなくても、ネットワークを厳密に制御できます。そのためには、allowDefaultPortFrom
allowToDefaultPort
およびメソッド (Python:allow_default_port_from
,allow_to_default_port
) を使用してください。
次の例は、任意の IPV4 アドレスからの接続と Auto Scaling グループからの接続を有効にしてデータベースにアクセスする方法を示しています。
- TypeScript
-
listener.connections.allowDefaultPortFromAnyIpv4('Allow public access');
fleet.connections.allowToDefaultPort(rdsDatabase, 'Fleet can access database');
- JavaScript
-
listener.connections.allowDefaultPortFromAnyIpv4('Allow public access');
fleet.connections.allowToDefaultPort(rdsDatabase, 'Fleet can access database');
- Python
-
listener.connections.allow_default_port_from_any_ipv4("Allow public access")
fleet.connections.allow_to_default_port(rds_database, "Fleet can access database")
- Java
-
listener.getConnections().allowDefaultPortFromAnyIpv4("Allow public access");
fleet.getConnections().AllowToDefaultPort(rdsDatabase, "Fleet can access database");
- C#
-
listener.Connections.AllowDefaultPortFromAnyIpv4("Allow public access");
fleet.Connections.AllowToDefaultPort(rdsDatabase, "Fleet can access database");
イベントハンドリング
一部のリソースはイベントソースとして機能します。addEventNotification
メソッド (Python:add_event_notification
) を使用して、リソースから発生する特定のイベントタイプにイベントターゲットを登録します。これに加えて、addXxxNotification
メソッドには一般的なイベントタイプのハンドラーを簡単に登録する方法があります。
次の例は、Amazon S3 バケットにオブジェクトが追加されたときに Lambda 関数をトリガーする方法を示しています。
- TypeScript
-
import * as s3nots from '@aws-cdk/aws-s3-notifications';
const handler = new lambda.Function(this, 'Handler', { /*…*/ });
const bucket = new s3.Bucket(this, 'Bucket');
bucket.addObjectCreatedNotification(new s3nots.LambdaDestination(handler));
- JavaScript
-
const s3nots = require('@aws-cdk/aws-s3-notifications');
const handler = new lambda.Function(this, 'Handler', { /*…*/ });
const bucket = new s3.Bucket(this, 'Bucket');
bucket.addObjectCreatedNotification(new s3nots.LambdaDestination(handler));
- Python
-
import aws_cdk.aws_s3_notifications as s3_nots
handler = lambda_.Function(self, "Handler", ...)
bucket = s3.Bucket(self, "Bucket")
bucket.add_object_created_notification(s3_nots.LambdaDestination(handler))
- Java
-
import software.amazon.awscdk.services.s3.Bucket;
import software.amazon.awscdk.services.lambda.Function;
import software.amazon.awscdk.services.s3.notifications.LambdaDestination;
Function handler = Function.Builder.create(this, "Handler")/* ... */.build();
Bucket bucket = new Bucket(this, "Bucket");
bucket.addObjectCreatedNotification(new LambdaDestination(handler));
- C#
-
using lambda = Amazon.CDK.AWS.Lambda;
using s3 = Amazon.CDK.AWS.S3;
using s3Nots = Amazon.CDK.AWS.S3.Notifications;
var handler = new lambda.Function(this, "Handler", new lambda.FunctionProps { .. });
var bucket = new s3.Bucket(this, "Bucket");
bucket.AddObjectCreatedNotification(new s3Nots.LambdaDestination(handler));
削除ポリシー
データベース、Amazon S3 バケット、Amazon ECR レジストリなどの永続データを維持するリソースには削除ポリシーがあります。削除ポリシーは、AWS CDK永続オブジェクトを含むスタックが破棄されたときに永続オブジェクトを削除するかどうかを示します。削除ポリシーを指定する値は、RemovalPolicy
AWS CDKcore
モジュール内の列挙から取得できます。
データを永続的に保存するリソース以外のリソースにも、removalPolicy
別の目的で使用されるリソースがある場合があります。たとえば、Lambda 関数バージョンでは、removalPolicy
属性を使用して、新しいバージョンがデプロイされたときに特定のバージョンが保持されるかどうかを判断します。Amazon S3 バケットまたは DynamoDB テーブルの削除ポリシーと比較して、意味やデフォルトが異なります。
値 |
意味 |
RemovalPolicy. 保持 |
Keep the contents of the resource when destroying the stack (default). The resource is
orphaned from the stack and must be deleted manually. If you attempt to re-deploy the
stack while the resource still exists, you will receive an error message due to a name
conflict. |
RemovalPolicy. 破壊 |
The resource will be destroyed along with the stack. |
AWS CloudFormation削除ポリシーがに設定されていても、ファイルを含む Amazon S3 バケットは削除されませんDESTROY
。それらの操作を試みると、AWS CloudFormationエラーが発生します。AWS CDKバケットを破棄する前にバケットからすべてのファイルを削除するには、autoDeleteObjects
バケットのプロパティをに設定しますtrue
。
以下は、RemovalPolicy
autoDeleteOjbects
を使用してに設定された Amazon S3 バケットを作成する例ですtrue
。DESTROY
- TypeScript
-
import * as cdk from '@aws-cdk/core';
import * as s3 from '@aws-cdk/aws-s3';
export class CdkTestStack extends cdk.Stack {
constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
super(scope, id, props);
const bucket = new s3.Bucket(this, 'Bucket', {
removalPolicy: cdk.RemovalPolicy.DESTROY,
autoDeleteObjects: true
});
}
}
- JavaScript
-
const cdk = require('@aws-cdk/core');
const s3 = require('@aws-cdk/aws-s3');
class CdkTestStack extends cdk.Stack {
constructor(scope, id, props) {
super(scope, id, props);
const bucket = new s3.Bucket(this, 'Bucket', {
removalPolicy: cdk.RemovalPolicy.DESTROY,
autoDeleteObjects: true
});
}
}
module.exports = { CdkTestStack }
- Python
-
import aws_cdk.core as cdk
import aws_cdk.aws_s3 as s3
class CdkTestStack(cdk.stack):
def __init__(self, scope: cdk.Construct, id: str, **kwargs):
super().__init__(scope, id, **kwargs)
bucket = s3.Bucket(self, "Bucket",
removal_policy=cdk.RemovalPolicy.DESTROY,
auto_delete_objects=True)
- Java
-
software.amazon.awscdk.core.*;
import software.amazon.awscdk.services.s3.*;
public class CdkTestStack extends Stack {
public CdkTestStack(final Construct scope, final String id) {
this(scope, id, null);
}
public CdkTestStack(final Construct scope, final String id, final StackProps props) {
super(scope, id, props);
Bucket.Builder.create(this, "Bucket")
.removalPolicy(RemovalPolicy.DESTROY)
.autoDeleteObjects(true).build();
}
}
- C#
-
using Amazon.CDK;
using Amazon.CDK.AWS.S3;
public CdkTestStack(Construct scope, string id, IStackProps props) : base(scope, id, props)
{
new Bucket(this, "Bucket", new BucketProps {
RemovalPolicy = RemovalPolicy.DESTROY,
AutoDeleteObjects = true
});
}
applyRemovalPolicy()
メソッドを使用して、AWS CloudFormation削除ポリシーを基になるリソースに直接適用することもできます。このメソッドは、L2 リソースの propremovalPolicy
にプロパティを持たない一部のステートフルリソースで使用できます。次に例を示します。
- TypeScript
-
const resource = bucket.node.findChild('Resource') as cdk.CfnResource;
resource.applyRemovalPolicy(cdk.RemovalPolicy.DESTROY);
- JavaScript
-
const resource = bucket.node.findChild('Resource');
resource.applyRemovalPolicy(cdk.RemovalPolicy.DESTROY);
- Python
-
resource = bucket.node.find_child('Resource')
resource.apply_removal_policy(cdk.RemovalPolicy.DESTROY);
- Java
-
CfnResource resource = (CfnResource)bucket.node.findChild("Resource");
resource.applyRemovalPolicy(cdk.RemovalPolicy.DESTROY);
- C#
-
var resource = (CfnResource)bucket.node.findChild('Resource');
resource.ApplyRemovalPolicy(cdk.RemovalPolicy.DESTROY);
「AWS CDK's」は「sAWS CloudFormation」RemovalPolicy
DeletionPolicy
に変換されます。ただし、AWS CDKデフォルトではデータが保持されます。AWS CloudFormationこれはデフォルトとは逆です。