Package software.amazon.awscdk.services.elasticache.alpha
ElastiCache CDK Construct Library
---
The APIs of higher level constructs in this module are experimental and under active development. They are subject to non-backward compatible changes or removal in any future version. These are not subject to the Semantic Versioning model and breaking changes will be announced in the release notes. This means that while you may use them, you may need to update your source code when upgrading to a newer version of this package.
This module has constructs for Amazon ElastiCache.
- The
ServerlessCache
construct facilitates the creation and management of serverless cache. - The
User
andUserGroup
constructs facilitate the creation and management of users for the cache.
Serverless Cache
Amazon ElastiCache Serverless is a serverless option that automatically scales cache capacity based on application traffic patterns. You can create a serverless cache using the ServerlessCache
construct:
Vpc vpc = new Vpc(this, "VPC"); ServerlessCache cache = ServerlessCache.Builder.create(this, "ServerlessCache") .vpc(vpc) .build();
Connecting to serverless cache
To control who can access the serverless cache by the security groups, use the .connections
attribute.
The serverless cache has a default port 6379
.
This example allows an EC2 instance to connect to the serverless cache:
ServerlessCache serverlessCache; Instance instance; // allow the EC2 instance to connect to serverless cache on default port 6379 serverlessCache.connections.allowDefaultPortFrom(instance);
Cache usage limits
You can configure usage limits on both cache data storage and ECPU/second for your cache to control costs and ensure predictable performance.
Configuration options:
- Maximum limits: Ensure your cache usage never exceeds the configured maximum
- Minimum limits: Reserve a baseline level of resources for consistent performance
- Both: Define a range where your cache usage will operate
For more infomation, see Setting scaling limits to manage costs.
Vpc vpc; ServerlessCache serverlessCache = ServerlessCache.Builder.create(this, "ServerlessCache") .engine(CacheEngine.VALKEY_LATEST) .vpc(vpc) .cacheUsageLimits(CacheUsageLimitsProperty.builder() // cache data storage limits (GB) .dataStorageMinimumSize(Size.gibibytes(2)) // minimum: 1GB .dataStorageMaximumSize(Size.gibibytes(3)) // maximum: 5000GB // rate limits (ECPU/second) .requestRateLimitMinimum(1000) // minimum: 1000 .requestRateLimitMaximum(10000) .build()) .build();
Backups and restore
You can enable automatic backups for serverless cache. When automatic backups are enabled, ElastiCache creates a backup of the cache on a daily basis.
Also you can set the backup window for any time when it's most convenient. If you don't specify a backup window, ElastiCache assigns one automatically.
For more information, see Scheduling automatic backups.
To enable automatic backups, set the backupRetentionLimit
property. You can also specify the snapshot creation time by setting backupTime
property:
Vpc vpc; ServerlessCache serverlessCache = ServerlessCache.Builder.create(this, "ServerlessCache") .backup(BackupSettings.builder() // enable automatic backups and set the retention period to 6 days .backupRetentionLimit(6) // set the backup window to 9:00 AM UTC .backupTime(Schedule.cron(CronOptions.builder() .hour("9") .minute("0") .build())) .build()) .vpc(vpc) .build();
You can create a final backup by setting backupNameBeforeDeletion
property.
Vpc vpc; ServerlessCache serverlessCache = ServerlessCache.Builder.create(this, "ServerlessCache") .engine(CacheEngine.VALKEY_LATEST) .backup(BackupSettings.builder() // set a backup name before deleting a cache .backupNameBeforeDeletion("my-final-backup-name") .build()) .vpc(vpc) .build();
You can restore from backups by setting snapshot ARNs to backupArnsToRestore
property:
Vpc vpc; ServerlessCache serverlessCache = ServerlessCache.Builder.create(this, "ServerlessCache") .engine(CacheEngine.VALKEY_LATEST) .backup(BackupSettings.builder() // set the backup(s) to restore .backupArnsToRestore(List.of("arn:aws:elasticache:us-east-1:123456789012:serverlesscachesnapshot:my-final-backup-name")) .build()) .vpc(vpc) .build();
Encryption at rest
At-rest encryption is always enabled for Serverless Cache. There are two encryption options:
- Default: When no
kmsKey
is specified (left asundefined
), AWS owned KMS keys are used automatically - Customer Managed Key: Create a KMS key first, then pass it to the cache via the
kmsKey
property
Customer Managed Key for encryption at rest
ElastiCache supports symmetric Customer Managed key (CMK) for encryption at rest.
For more information, see Using customer managed keys from AWS KMS.
To use CMK, set your CMK to the kmsKey
property:
import software.amazon.awscdk.services.kms.Key; Key kmsKey; Vpc vpc; ServerlessCache serverlessCache = ServerlessCache.Builder.create(this, "ServerlessCache") .engine(CacheEngine.VALKEY_LATEST) .serverlessCacheName("my-serverless-cache") .vpc(vpc) // set Customer Managed Key .kmsKey(kmsKey) .build();
Metrics and monitoring
You can monitor your serverless cache using CloudWatch Metrics via the metric
method.
For more information about serverless cache metrics, see Serverless metrics and events for Valkey and Redis OSS and Serverless metrics and events for Memcached.
ServerlessCache serverlessCache; // The 5 minutes average of the total number of successful read-only key lookups in the cache. Metric cacheHits = serverlessCache.metricCacheHitCount(); // The 5 minutes average of the total number of bytes used by the data stored in the cache. Metric bytesUsedForCache = serverlessCache.metricDataStored(); // The 5 minutes average of the total number of ElastiCacheProcessingUnits (ECPUs) consumed by the requests executed on the cache. Metric elastiCacheProcessingUnits = serverlessCache.metricProcessingUnitsConsumed(); // Create an alarm for ECPUs. elastiCacheProcessingUnits.createAlarm(this, "ElastiCacheProcessingUnitsAlarm", CreateAlarmOptions.builder() .threshold(50) .evaluationPeriods(1) .build());
Import an existing serverless cache
To import an existing ServerlessCache, use the ServerlessCache.fromServerlessCacheAttributes
method:
SecurityGroup securityGroup; IServerlessCache importedServerlessCache = ServerlessCache.fromServerlessCacheAttributes(this, "ImportedServerlessCache", ServerlessCacheAttributes.builder() .serverlessCacheName("my-serverless-cache") .securityGroups(List.of(securityGroup)) .build());
User and User Group
Setup required properties and create:
NoPasswordUser newDefaultUser = NoPasswordUser.Builder.create(this, "NoPasswordUser") .userId("default") .accessControl(AccessControl.fromAccessString("on ~* +@all")) .build(); UserGroup userGroup = UserGroup.Builder.create(this, "UserGroup") .users(List.of(newDefaultUser)) .build();
RBAC
In Valkey 7.2 and onward and Redis OSS 6.0 onward you can use a feature called Role-Based Access Control (RBAC). RBAC is also the only way to control access to serverless caches.
RBAC enables you to control cache access through user groups. These user groups are designed as a way to organize access to caches.
For more information, see Role-Based Access Control (RBAC).
To enable RBAC for ElastiCache with Valkey or Redis OSS, you take the following steps:
- Create users.
- Create a user group and add users to the user group.
- Assign the user group to a cache.
Create users
First, you need to create users by using IamUser
, PasswordUser
or NoPasswordUser
construct.
With RBAC, you create users and assign them specific permissions by using accessString
property.
For more information, see Specifying Permissions Using an Access String.
You can create an IAM-enabled user by using IamUser
construct:
IamUser user = IamUser.Builder.create(this, "User") // set user engine .engine(UserEngine.REDIS) // set user id .userId("my-user") // set username .userName("my-user") // set access string .accessControl(AccessControl.fromAccessString("on ~* +@all")) .build();
NOTE: IAM-enabled users must have matching user id and username. For more information, see Limitations. The construct can set automatically the username to be the same as the user id.
If you want to create a password authenticated user, use PasswordUser
construct:
PasswordUser user = PasswordUser.Builder.create(this, "User") // set user engine .engine(UserEngine.VALKEY) // set user id .userId("my-user-id") // set access string .accessControl(AccessControl.fromAccessString("on ~* +@all")) // set username .userName("my-user-name") // set up to two passwords .passwords(List.of(SecretValue.secretsManager("SecretIdForPassword"), SecretValue.secretsManager("AnotherSecretIdForPassword"))) .build();
You can also create a no password required user by using NoPasswordUser
construct:
NoPasswordUser user = NoPasswordUser.Builder.create(this, "User") // set user engine .engine(UserEngine.REDIS) // set user id .userId("my-user-id") // set access string .accessControl(AccessControl.fromAccessString("on ~* +@all")) // set username .userName("my-user-name") .build();
Default user
ElastiCache automatically creates a default user with both a user ID and username set to default
. This default user cannot be modified or deleted. The user is created as a no password authentication user.
This user is intended for compatibility with the default behavior of previous Redis OSS versions and has an access string that permits it to call all commands and access all keys.
To use this automatically created default user in CDK, you can import it using NoPasswordUser.fromUserAttributes
method. For more information on import methods, see the Import an existing user and user group section.
To add proper access control to a cache, replace the default user with a new one that is either disabled by setting the accessString
to off -@all
or secured with a strong password.
To change the default user, create a new default user with the username set to default
. You can then swap it with the original default user.
For more information, see Applying RBAC to a Cache for ElastiCache with Valkey or Redis OSS.
If you want to create a new default user, userName
must be default
and userId
must not be default
by using NoPasswordUser
or PasswordUser
:
// use the original `default` user by using import method IUser defaultUser = NoPasswordUser.fromUserAttributes(this, "DefaultUser", UserBaseAttributes.builder() // userId and userName must be 'default' .userId("default") .build()); // create a new default user NoPasswordUser newDefaultUser = NoPasswordUser.Builder.create(this, "NewDefaultUser") // new default user id must not be 'default' .userId("new-default") // new default username must be 'default' .userName("default") // set access string .accessControl(AccessControl.fromAccessString("on ~* +@all")) .build();
NOTE: You can't create a new default user using
IamUser
because an IAM-enabled user's username and user ID cannot be different.
Add users to the user group
Next, use the UserGroup
construct to create a user group and add users to it.
Ensure that you include either the original default user or a new default user:
IUser newDefaultUser; IUser user; IUser anotherUser; UserGroup userGroup = UserGroup.Builder.create(this, "UserGroup") // add users including default user .users(List.of(newDefaultUser, user)) .build(); // you can also add a user by using addUser method userGroup.addUser(anotherUser);
Assign user group
Finally, assign a user group to cache:
Vpc vpc; UserGroup userGroup; ServerlessCache serverlessCache = ServerlessCache.Builder.create(this, "ServerlessCache") .engine(CacheEngine.VALKEY_LATEST) .serverlessCacheName("my-serverless-cache") .vpc(vpc) // assign User Group .userGroup(userGroup) .build();
Grant permissions to IAM-enabled users
If you create IAM-enabled users, "elasticache:Connect"
action must be allowed for the users and cache.
NOTE: You don't need grant permissions to no password required users or password authentication users.
For more information, see Authenticating with IAM.
To grant permissions, you can use the grantConnect
method in IamUser
and ServerlessCache
constructs:
IamUser user; ServerlessCache serverlessCache; Role role; // grant "elasticache:Connect" action permissions to role user.grantConnect(role); serverlessCache.grantConnect(role);
Import an existing user and user group
You can import an existing user and user group by using import methods:
Stack stack = new Stack(); IUser importedIamUser = IamUser.fromUserId(this, "ImportedIamUser", "my-iam-user-id"); IUser importedPasswordUser = PasswordUser.fromUserAttributes(stack, "ImportedPasswordUser", UserBaseAttributes.builder() .userId("my-password-user-id") .build()); IUser importedNoPasswordUser = NoPasswordUser.fromUserAttributes(stack, "ImportedNoPasswordUser", UserBaseAttributes.builder() .userId("my-no-password-user-id") .build()); IUserGroup importedUserGroup = UserGroup.fromUserGroupAttributes(this, "ImportedUserGroup", UserGroupAttributes.builder() .userGroupName("my-user-group-name") .build());
-
ClassDescription(experimental) Access control configuration for ElastiCache users.(experimental) Backup configuration for ServerlessCache.A builder for
BackupSettings
An implementation forBackupSettings
(experimental) Supported cache engines together with available versions.(experimental) Usage limits configuration for ServerlessCache.A builder forCacheUsageLimitsProperty
An implementation forCacheUsageLimitsProperty
(experimental) Define an ElastiCache user with IAM authentication.(experimental) A fluent builder forIamUser
.(experimental) Properties for defining an ElastiCache user with IAM authentication.A builder forIamUserProps
An implementation forIamUserProps
(experimental) Represents a Serverless ElastiCache cache.Internal default implementation forIServerlessCache
.A proxy class which represents a concrete javascript instance of this type.(experimental) Represents an ElastiCache base user.Internal default implementation forIUser
.A proxy class which represents a concrete javascript instance of this type.(experimental) Represents an ElastiCache UserGroup.Internal default implementation forIUserGroup
.A proxy class which represents a concrete javascript instance of this type.(experimental) Define an ElastiCache user with no password authentication.(experimental) A fluent builder forNoPasswordUser
.(experimental) Properties for defining an ElastiCache user with no password authentication.A builder forNoPasswordUserProps
An implementation forNoPasswordUserProps
(experimental) Define an ElastiCache user with password authentication.(experimental) A fluent builder forPasswordUser
.(experimental) Properties for defining an ElastiCache user with password authentication.A builder forPasswordUserProps
An implementation forPasswordUserProps
(experimental) A serverless ElastiCache cache.(experimental) A fluent builder forServerlessCache
.(experimental) Attributes that can be specified when importing a ServerlessCache.A builder forServerlessCacheAttributes
An implementation forServerlessCacheAttributes
(experimental) Base class for ServerlessCache constructs.(experimental) Properties for defining a ServerlessCache.A builder forServerlessCacheProps
An implementation forServerlessCacheProps
(experimental) Base class for ElastiCache users.(experimental) Attributes for importing an existing ElastiCache user.A builder forUserBaseAttributes
An implementation forUserBaseAttributes
(experimental) Properties for defining an ElastiCache base user.A builder forUserBaseProps
An implementation forUserBaseProps
(experimental) Engine type for ElastiCache users and user groups.(experimental) An ElastiCache UserGroup.(experimental) A fluent builder forUserGroup
.(experimental) Attributes that can be specified when importing a UserGroup.A builder forUserGroupAttributes
An implementation forUserGroupAttributes
(experimental) Base class for UserGroup constructs.(experimental) Properties for defining an ElastiCache UserGroup.A builder forUserGroupProps
An implementation forUserGroupProps