Borislav Hadzhiev
Last updated: Apr 14, 2022
Check out my new book
In order to import existing resources in CDK we have to use the static
fromResource*
methods on the resource's construct, for instance:
the S3 Bucket construct exposes the fromBucketArn, fromBucketName and fromBucketAttributes static methods
the Dynamodb Table construct exposes the fromTableArn, fromTableName and fromTableAttributes static methods
the Lambda Function construct exposes the fromFunctionArn, fromFunctionAttributes static methods
As a general rule of thumb, we use the fromResourceName
and fromResourceArn
methods unless we don't have access to the name
or ARN
of the resource, in
which case we use the fromResourceAttributes
method.
To import an existing bucket by name into a CDK stack, we can use the fromBucketName static method:
const existingBucketFromName = s3.Bucket.fromBucketName( this, 'bucket-from-name-id', 'YOUR_BUCKET_NAME', ); console.log('existingBucketFromName 👉 ', existingBucketFromName.bucketName);
If I now run the cdk synth
command, we can see that the value is resolved at
synthesis time:
To import an existing bucket by ARN we can use the fromBucketArn static method:
const existingBucketFromArn = s3.Bucket.fromBucketArn( this, 'bucket-from-arn-id', 'YOUR_BUCKET_ARN', );
And to import an existing bucket from Attributes, we use the fromBucketAttributes static method:
const existingBucketFromAttributes = s3.Bucket.fromBucketAttributes( this, 'bucket-from-attributes-id', { region: 'us-east-1', bucketArn: 'arn:aws:s3:::YOUR_BUCKET_NAME', }, );
All of the above methods resolve at synthesis time.
Most
Level 2 Constructs
implement at least 2 of the 3 fromResource*
methods.
For example, to import an existing Dynamodb table by name, we have to use the fromTableName static method:
const existingTableFromName = dynamodb.Table.fromTableName( this, 'table-from-name-id', 'YOUR_TABLE_NAME', ); console.log('existingTableFromName 👉 ', existingTableFromName.tableName);
The value again resolves at synthesis time:
To import an existing table from ARN we have to use the fromTableArn static method:
const existingTableFromArn = dynamodb.Table.fromTableArn('YOUR_TABLE_ARN');
And to import an existing table from attributes we have to use the fromTableAttributes static method:
const existingTableFromAttributes = dynamodb.Table.fromTableAttributes( this, 'table-from-attributes-id', { tableName: 'YOUR_TABLE_NAME', }, );
It's quite repetitive once we know what the naming convention of the methods is.
Most of the time we end up using the fromResourceName
and fromResourceArn
methods, and resort to using fromResourceAttributes
when we don't have the
name or the ARN of the resource.