caccl-deploy
Version:
A cli tool for managing ECS/Fargate app deployments
90 lines (73 loc) • 2.42 kB
text/typescript
import {
aws_cloudwatch as cloudwatch,
aws_ec2 as ec2,
aws_elasticache as elasticache,
Stack,
CfnOutput,
} from 'aws-cdk-lib';
import { Construct } from 'constructs';
import { CacclAppEnvironment } from './appEnvironment';
export interface CacclCacheOptions {
engine: string;
numCacheNodes?: number;
cacheNodeType?: string;
}
export interface CacclCacheProps {
vpc: ec2.Vpc;
options: CacclCacheOptions;
appEnv: CacclAppEnvironment;
}
export class CacclCache extends Construct {
cache: elasticache.CfnCacheCluster;
cacheSg: ec2.SecurityGroup;
metrics: { [key: string]: cloudwatch.Metric };
alarms: cloudwatch.Alarm[];
constructor(scope: Construct, id: string, props: CacclCacheProps) {
super(scope, id);
const { vpc, appEnv } = props;
const {
engine = 'redis',
numCacheNodes = 1,
cacheNodeType = 'cache.t3.medium',
} = props.options;
const subnetGroup = new elasticache.CfnSubnetGroup(
this,
'CacheSubnetGroup',
{
description: `List of subnets for ${Stack.of(this).stackName}`,
subnetIds: vpc.privateSubnets.map((subnet) => {
return subnet.subnetId;
}),
},
);
this.cacheSg = new ec2.SecurityGroup(this, 'CacheSecurityGroup', {
vpc,
description: 'security group for the elasticache cluster',
allowAllOutbound: false,
});
this.cacheSg.addIngressRule(
ec2.Peer.ipv4(vpc.vpcCidrBlock),
ec2.Port.tcp(6379),
'allow from internal network',
);
/**
* why do we `allowAllOutbound: false` just above and then undo it here?
* because CDK complains if we don't. something about allowAllOutbound
* not allowing IPv6 traffic so they had to add a warning?
*/
this.cacheSg.addEgressRule(ec2.Peer.anyIpv4(), ec2.Port.allTcp());
this.cache = new elasticache.CfnCacheCluster(this, 'CacheCluster', {
engine,
numCacheNodes,
cacheNodeType,
cacheSubnetGroupName: subnetGroup.ref,
vpcSecurityGroupIds: [this.cacheSg.securityGroupId],
});
appEnv.addEnvironmentVar('REDIS_HOST', this.cache.attrRedisEndpointAddress);
appEnv.addEnvironmentVar('REDIS_PORT', this.cache.attrRedisEndpointPort);
new CfnOutput(this, 'CacheClusterEndpoint', {
exportName: `${Stack.of(this).stackName}-cache-endpoint`,
value: `${this.cache.attrRedisEndpointAddress}:6379`,
});
}
}