使用 AWS CDK 和 TypeScript 部署 Amazon ElastiCache for
使用 AWS CDK 和 TypeScript 部署 Amazon ElastiCache for Redis 集群
作者:Eduardo Patrocinio,发布于 2024 年 4 月 5 日在 Amazon ElastiCache 文章中,探讨如何通过 AWS CDK 和 TypeScript 部署 Amazon ElastiCache for Redis 集群。
主要内容提示
在本篇文章中,我们将介绍如何使用 AWS Cloud Development Kit (AWS CDK) 和 TypeScript 部署 Amazon ElastiCache。您将学习必要的前置条件和步骤,包括创建 VPC、子网组及安全组,从而在 AWS 上设置一个 ElastiCache for Redis 集群。此外,我们还会说明如何使用 ElastiCache for Redis Serverless 部署资源。
文章概要
AWS Cloud Development Kit (AWS CDK) 允许您用一行代码创建 AWS 资源。需要注意的是,某些 AWS 资源需要使用多行代码进行支持性资源的创建,例如在创建 Amazon ElastiCache for Redis CfnReplicationGroup 前,必须先创建 CfnSubnetGroup 和 SecurityGroup。
解决方案概述
ElastiCache 是一个全受管的 Redis 和 Memcached 兼容的服务,提供实时、成本优化的性能,并对现代应用程序实现高达 9999 的服务水平协议 (SLA)。ElastiCache 显著提升了数据库和应用程序性能,能够以微秒响应时间达到每秒数亿次操作。与开源替代方案相比,ElastiCache 提供了增强的安全性、可靠性、可扩展性和性能。
ElastiCache Serverless 是一个全新的无伺服器选项,允许您在不到一分钟的时间内创建缓存,并根据应用程序流量模式即时扩展容量。
接下来的部分,我们将演示如何部署所需的前置资源,然后部署 ElastiCache 和 ElastiCache Serverless 资源。
前置条件
在开始之前,您的本地计算机上需要具备以下内容:
内容连结AWS 帐号前往 AWS 控制台AWS CLI 安装安装指南AWS CDK 安装CDK 安装Nodejs 16140 或更高版本Nodejs 下载页面本文假设您熟悉 AWS 网络和安全机制。如需进一步了解,请参考 网络基本知识指南 和 AWS 云安全。
创建前置资源
在创建 ElastiCache 集群之前,您需要在本地计算机上安装 AWS CDK,然后创建 AWS CDK 目录结构,安装 NPM 包,并创建 VPC 和子网组。
安装 AWS CDK
首先,请在终端中执行以下命令以安装 AWS CDK:
bashnpm install g awscdk
然后,验证安装是否成功:
bashcdk version
您应该看到类似如下的输出:
bash cdk version21260 (build fb74c41)
创建 AWS CDK 目录结构
来创建 AWS CDK 目录结构,请执行以下命令:
bashmkdir work ampamp cd workcdk init language typescript
您应该看到类似如下的输出:
bash cdk init language typescriptApplying project template app for typescript
欢迎使用您的 CDK TypeScript 项目
安装 NPM 包
接下来,执行以下命令以安装 NPM 包:
bashnpm install
您应该会看到类似下面的输出:
bash npm installadded 321 packages and audited 356 packages in 15s
创建 VPC
现在您准备使用 AWS CDK 创建首个 AWS 资源:VPC。完成以下步骤:
使用您喜欢的编辑器,打开 lib/workstackts 文件,清空其内容,然后输入以下代码:typescriptimport as cdk from awscdklibimport { Construct } from constructsimport as EC2 from awscdklib/awsec2
export class WorkStack extends cdkStack { private vpc EC2Vpc
constructor(scope Construct id string props cdkStackProps) { super(scope id props) thisvpc = new EC2Vpc(this cachevpc)}}
这样就能轻松创建一个 VPC。
准备 AWS 环境,执行以下命令:bashcdk bootstrap

您应该会看到类似的输出:
bash cdk bootstrap Bootstrapping environment aws//XXXXXXXXXXXX/uswest2
飞兔云加速器官网生成 AWS CloudFormation 模板,执行以下命令:bashcdk synth
您将看到展示生成的 CloudFormation 模板的长输出。
通过执行以下命令创建 VPC。requireapproval never 选项可以跳过补充审批提示:bashcdk deploy requireapproval never
这会部署一个 CloudFormation 堆栈,您可以在 AWS CloudFormation 控制台查看事件标签和信息。
创建子网组
现在您已经创建了 VPC,接下来可以创建 ElastiCache 的子网组,它决定了可以部署节点的可用区。请完成以下步骤:
更新 lib/workstackts 文件以添加 subnetGroup 的创建代码:typescriptimport as cdk from awscdklibimport { Construct } from constructsimport as EC2 from awscdklib/awsec2import { awselasticache as ElastiCache } from awscdklib
export class WorkStack extends cdkStack { private vpc EC2Vpc
constructor(scope Construct id string props cdkStackProps) { const groupName = ElastiCacheSubnetGroup super(scope id props) thisvpc = new EC2Vpc(this cachevpc) const subnetIds = [] for (const subnet of thisvpcprivateSubnets) { consolelog(createElastiCache subnet ID subnetsubnetId) subnetIdspush(subnetsubnetId) } const subnetGroup = new ElastiCacheCfnSubnetGroup(this ElastiCacheSubnetGroup { cacheSubnetGroupName groupName subnetIds subnetIds description ElastiCache Subnet Group })}}
执行以下命令合成并部署堆栈:bashcdk synth cdk deploy requireapproval never
创建 ElastiCache for Redis 复制组
接下来的步骤将创建一个具有集群模式禁用和单个主节点的 ElastiCache for Redis 复制组。
创建安全组
首先,创建将用于 ElastiCache 的安全组。该安全组允许任何 IP 地址连接到 Redis 的端口 (6379)。
更新 lib/workstackts 文件以添加安全组:typescriptimport as cdk from awscdklibimport { Construct } from constructsimport as EC2 from awscdklib/awsec2import { awselasticache as ElastiCache } from awscdklibimport { SecurityGroup Peer Port } from awscdklib/awsec2
export class WorkStack extends cdkStack { private vpc EC2Vpc
constructor(scope Construct id string props cdkStackProps) { const groupName = ElastiCacheSubnetGroup super(scope id props) thisvpc = new EC2Vpc(this cachevpc) const subnetIds = [] for (const subnet of thisvpcprivateSubnets) { consolelog(createElastiCache subnet ID subnetsubnetId) subnetIdspush(subnetsubnetId) } const subnetGroup = new ElastiCacheCfnSubnetGroup(this ElastiCacheSubnetGroup { cacheSubnetGroupName groupName subnetIds subnetIds description ElastiCache Subnet Group }) const securityGroup = new SecurityGroup(this ElastiCacheSecurityGroup { vpc thisvpc allowAllOutbound true description ElastiCache Security Group securityGroupName ElastiCacheSecurityGroup }) securityGroupaddIngressRule(PeeranyIpv4() Porttcp(6379) Redis port)}}
执行以下命令合成并部署堆栈:bashcdk synth cdk deploy requireapproval never
创建复制组
最后,部署一个复制组以创建 ElastiCache 实例:
更新 lib/workstackts 文件以添加 ReplicationGroup 配置。以下代码创建一个单节点集群,适合测试用途:typescriptimport as cdk from awscdklibimport { Construct } from constructsimport as EC2 from awscdklib/awsec2import { awselasticache as ElastiCache } from awscdklibimport { SecurityGroup Peer Port } from awscdklib/awsec2
export class WorkStack extends cdkStack { private vpc EC2Vpc
constructor(scope Construct id string props cdkStackProps) { const groupName = ElastiCacheSubnetGroup super(scope id props) thisvpc = new EC2Vpc(this cachevpc) const subnetIds = [] for (const subnet of thisvpcprivateSubnets) { consolelog(createElastiCache subnet ID subnetsubnetId) subnetIdspush(subnetsubnetId) } const subnetGroup = new ElastiCacheCfnSubnetGroup(this ElastiCacheSubnetGroup { cacheSubnetGroupName groupName subnetIds subnetIds description ElastiCache Subnet Group }) const securityGroup = new SecurityGroup(this ElastiCacheSecurityGroup { vpc thisvpc allowAllOutbound true description ElastiCache Security Group securityGroupName ElastiCacheSecurityGroup }) securityGroupaddIngressRule(PeeranyIpv4() Porttcp(6379) Redis port) const cache = new ElastiCacheCfnReplicationGroup(this ReplicationGroup { replicationGroupDescription Elastic Cache Replication Group numCacheClusters 1 automaticFailoverEnabled false engine redis cacheNodeType cachem7glarge cacheSubnetGroupName subnetGroupref securityGroupIds [securityGroupsecurityGroupId] }) // 建立 cache 和 subnetGroup 之间的依赖,以便它们能够按正确顺序删除 cacheaddDependency(subnetGroup)}}
执行以下命令来合成和部署堆栈:bashcdk synth cdk deploy requireapproval never
等待 57 分钟,ReplicationGroup 部署完成后,您应该会看到如下的输出:
bashWorkStack deploying [1/1]WorkStack creating CloudFormation changeset
验证资源
登录到您部署资源的地区的 ElastiCache 控制台,您应该会看到 Redis 集群。
部署 ElastiCache for Redis Serverless 资源
目前为止,您已经部署了基于节点的 ElastiCache for Redis,其中创建了子网组和安全组,并定义了节点类型和节点数。
要部署 ElastiCache for Redis 的 Serverless 版本,请在创建 VPC 和子网组后完成以下步骤。
创建安全组
完成以下步骤以创建将用于 ElastiCache 的安全组。该安全组允许任何 IP 地址连接到 Redis 端口 (6379) 和副本端口 (6380)。
更新 lib/workstackts 文件以创建安全组:typescriptimport as cdk from awscdklibimport { Construct } from constructsimport as EC2 from awscdklib/awsec2import { awselasticache as ElastiCache } from awscdklibimport { SecurityGroup Peer Port } from awscdklib/awsec2
export class WorkStack extends cdkStack { private vpc EC2Vpc
constructor(scope Construct id string props cdkStackProps) { const groupName = ElastiCacheSubnetGroup super(scope id props) thisvpc = new EC2Vpc(this cachevpc) const subnetIds = [] for (const subnet of thisvpcprivateSubnets) { consolelog(createElastiCache subnet ID subnetsubnetId) subnetIdspush(subnetsubnetId) } const subnetGroup = new ElastiCacheCfnSubnetGroup(this ElastiCacheSubnetGroup { cacheSubnetGroupName groupName subnetIds subnetIds description ElastiCache Subnet Group }) const securityGroup = new SecurityGroup(this ElastiCacheSecurityGroup { vpc thisvpc allowAllOutbound true description ElastiCache Security Group securityGroupName ElastiCacheSecurityGroup }) securityGroupaddIngressRule(PeeranyIpv4() Porttcp(6379) Redis port) securityGroupaddIngressRule(PeeranyIpv4() Porttcp(6380) Redis port)}}
执行以下命令以合成和部署堆栈:bashcdk synth cdk deploy requireapproval never
创建无伺服器缓存
要添加无伺服器缓存,请完成以下步骤:
更新 AWS CDK 代码至 lib/workstackts 文件:typescriptimport as cdk from awscdklibimport { Construct } from constructsimport as EC2 from awscdklib/awsec2import { awselasticache as ElastiCache } from awscdklibimport { SecurityGroup Peer Port } from awscdklib/awsec2
export class WorkStack extends cdkStack { private vpc EC2Vpc
constructor(scope Construct id string props cdkStackProps) { const groupName = ElastiCacheSubnetGroup super(scope id props) thisvpc = new EC2Vpc(this cachevpc) const subnetIds = [] for (const subnet of thisvpcprivateSubnets) { consolelog(createElastiCache subnet ID subnetsubnetId) subnetIdspush(subnetsubnetId) } const subnetGroup = new ElastiCacheCfnSubnetGroup(this ElastiCacheSubnetGroup { cacheSubnetGroupName groupName subnetIds subnetIds description ElastiCache Subnet Group }) const securityGroup = new SecurityGroup(this ElastiCacheSecurityGroup { vpc thisvpc allowAllOutbound true description ElastiCache Security Group securityGroupName ElastiCacheSecurityGroup }) securityGroupaddIngressRule(PeeranyIpv4() Porttcp(6379) Redis port) securityGroupaddIngressRule(PeeranyIpv4() Porttcp(6380) Redis port) new ElastiCacheCfnServerlessCache(this ServerlessCache { engine redis serverlessCacheName MyServerlessCache securityGroupIds [securityGroupsecurityGroupId] subnetIds subnetIds })}}
执行以下命令以合成和部署堆栈:bashcdk synth cdk deploy requireapproval never
验证资源
在 ElastiCache 控制台中,您应该会看到类似的 Redis 集