-
Notifications
You must be signed in to change notification settings - Fork 249
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
23 changed files
with
3,016 additions
and
8 deletions.
There are no files selected for viewing
5 changes: 5 additions & 0 deletions
5
source/patterns/@aws-solutions-constructs/aws-lambda-elasticachememcached/.eslintignore
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
lib/*.js | ||
test/*.js | ||
*.d.ts | ||
coverage | ||
test/lambda/index.js |
15 changes: 15 additions & 0 deletions
15
source/patterns/@aws-solutions-constructs/aws-lambda-elasticachememcached/.gitignore
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,15 @@ | ||
lib/*.js | ||
test/*.js | ||
*.js.map | ||
*.d.ts | ||
node_modules | ||
*.generated.ts | ||
dist | ||
.jsii | ||
|
||
.LAST_BUILD | ||
.nyc_output | ||
coverage | ||
.nycrc | ||
.LAST_PACKAGE | ||
*.snk |
21 changes: 21 additions & 0 deletions
21
source/patterns/@aws-solutions-constructs/aws-lambda-elasticachememcached/.npmignore
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
# Exclude typescript source and config | ||
*.ts | ||
tsconfig.json | ||
coverage | ||
.nyc_output | ||
*.tgz | ||
*.snk | ||
*.tsbuildinfo | ||
|
||
# Include javascript files and typescript declarations | ||
!*.js | ||
!*.d.ts | ||
|
||
# Exclude jsii outdir | ||
dist | ||
|
||
# Include .jsii | ||
!.jsii | ||
|
||
# Include .jsii | ||
!.jsii |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
174 changes: 174 additions & 0 deletions
174
source/patterns/@aws-solutions-constructs/aws-lambda-elasticachememcached/lib/index.ts
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,174 @@ | ||
/** | ||
* Copyright 2022 Amazon.com, Inc. or its affiliates. All Rights Reserved. | ||
* | ||
* Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance | ||
* with the License. A copy of the License is located at | ||
* | ||
* http://www.apache.org/licenses/LICENSE-2.0 | ||
* | ||
* or in the 'license' file accompanying this file. This file is distributed on an 'AS IS' BASIS, WITHOUT WARRANTIES | ||
* OR CONDITIONS OF ANY KIND, express or implied. See the License for the specific language governing permissions | ||
* and limitations under the License. | ||
*/ | ||
|
||
// Imports | ||
import * as lambda from "@aws-cdk/aws-lambda"; | ||
import * as ec2 from "@aws-cdk/aws-ec2"; | ||
import * as cache from "@aws-cdk/aws-elasticache"; | ||
import * as defaults from "../../core"; | ||
import { Construct } from "@aws-cdk/core"; | ||
import { obtainMemcachedCluster, GetCachePort } from "../../core"; | ||
|
||
const defaultEnvironmentVariableName = "CACHE_ENDPOINT"; | ||
|
||
/** | ||
* @summary The properties for the LambdaToElasticachememcached class. | ||
*/ | ||
export interface LambdaToElasticachememcachedProps { | ||
/** | ||
* Existing instance of Lambda Function object, providing both this and `lambdaFunctionProps` will cause an error. | ||
* | ||
* @default - None | ||
*/ | ||
readonly existingLambdaObj?: lambda.Function; | ||
/** | ||
* User provided props to override the default props for the Lambda function. | ||
* | ||
* @default - Default properties are used. | ||
*/ | ||
readonly lambdaFunctionProps?: lambda.FunctionProps; | ||
/** | ||
* An existing VPC for the construct to use (construct will NOT create a new VPC in this case) | ||
*/ | ||
readonly existingVpc?: ec2.IVpc; | ||
/** | ||
* Properties to override default properties if deployVpc is true | ||
*/ | ||
readonly vpcProps?: ec2.VpcProps; | ||
/** | ||
* Optional Name for the Elasticache Endpoint environment variable | ||
* | ||
* @default - None | ||
*/ | ||
readonly cacheEndpointEnvironmentVariableName?: string; | ||
|
||
readonly cacheProps?: cache.CfnCacheClusterProps | any; | ||
|
||
readonly existingCache?: cache.CfnCacheCluster; | ||
} | ||
|
||
/** | ||
* @summary The LambdaToElasticachememcached class. | ||
*/ | ||
export class LambdaToElasticachememcached extends Construct { | ||
public readonly lambdaFunction: lambda.Function; | ||
public readonly vpc: ec2.IVpc; | ||
public readonly cache: cache.CfnCacheCluster; | ||
|
||
/** | ||
* @summary Constructs a new instance of the LambdaToSns class. | ||
* @param {cdk.App} scope - represents the scope for all the resources. | ||
* @param {string} id - this is a a scope-unique id. | ||
* @param {LambdaToElasticachememcachedProps} props - user provided props for the construct. | ||
* @access public | ||
*/ | ||
constructor( | ||
scope: Construct, | ||
id: string, | ||
props: LambdaToElasticachememcachedProps | ||
) { | ||
super(scope, id); | ||
defaults.CheckProps(props); | ||
|
||
if ((props.existingCache || props.existingLambdaObj) && (!props.existingVpc)) { | ||
throw Error('If providing an existing Cache or Lambda Function, you must also supply the associated existingVpc'); | ||
} | ||
|
||
if ( | ||
props.cacheProps && | ||
props.cacheProps.engine && | ||
props.cacheProps.engine !== "memcached" | ||
) { | ||
throw Error("This construct can only launch memcached clusters"); | ||
} | ||
if (props.cacheProps && props.existingCache) { | ||
throw Error("Cannot specify existingCache and cacheProps"); | ||
} | ||
|
||
const cachePort = GetCachePort(props.cacheProps, props.existingCache); | ||
|
||
this.vpc = defaults.buildVpc(scope, { | ||
defaultVpcProps: defaults.DefaultIsolatedVpcProps(), | ||
existingVpc: props.existingVpc, | ||
userVpcProps: props.vpcProps, | ||
}); | ||
|
||
const lambdaToCacheSecurityGroup = CreateSelfReferencingSecurityGroup(this, id, this.vpc, cachePort); | ||
|
||
this.cache = obtainMemcachedCluster(this, id, { | ||
cacheSecurityGroupId : lambdaToCacheSecurityGroup.securityGroupId, | ||
cacheProps: props.cacheProps, | ||
existingCache: props.existingCache, | ||
vpc: this.vpc, | ||
cachePort, | ||
}); | ||
|
||
const lambdaFunctionProps: lambda.FunctionProps = defaults.consolidateProps( | ||
{}, | ||
props.lambdaFunctionProps, | ||
{ securityGroups: [lambdaToCacheSecurityGroup] }, | ||
true | ||
); | ||
|
||
// Setup the Lambda function | ||
this.lambdaFunction = defaults.buildLambdaFunction(this, { | ||
existingLambdaObj: props.existingLambdaObj, | ||
lambdaFunctionProps, | ||
vpc: this.vpc, | ||
}); | ||
|
||
AddLambdaEnvironmentVariable( | ||
this.lambdaFunction, | ||
`${this.cache.attrConfigurationEndpointAddress}:${this.cache.attrConfigurationEndpointPort}`, | ||
defaultEnvironmentVariableName, | ||
props.cacheEndpointEnvironmentVariableName | ||
); | ||
} | ||
} | ||
|
||
function AddLambdaEnvironmentVariable(targetFunction: lambda.Function, value: string, defaultName: string, clientName?: string) { | ||
const variableName = clientName || defaultName; | ||
targetFunction.addEnvironment(variableName, value); | ||
} | ||
|
||
function CreateSelfReferencingSecurityGroup(scope: Construct, id: string, vpc: ec2.IVpc, cachePort: any) { | ||
const newCacheSG = new ec2.SecurityGroup(scope, `${id}-cachesg`, { | ||
vpc, | ||
allowAllOutbound: true, | ||
}); | ||
const selfReferenceRule = new ec2.CfnSecurityGroupIngress( | ||
scope, | ||
`${id}-ingress`, | ||
{ | ||
groupId: newCacheSG.securityGroupId, | ||
sourceSecurityGroupId: newCacheSG.securityGroupId, | ||
ipProtocol: "TCP", | ||
fromPort: cachePort, | ||
toPort: cachePort, | ||
} | ||
); | ||
selfReferenceRule.node.addDependency(newCacheSG); | ||
|
||
defaults.addCfnSuppressRules(newCacheSG, [ | ||
{ | ||
id: "W5", | ||
reason: "Egress of 0.0.0.0/0 is default and generally considered OK", | ||
}, | ||
{ | ||
id: "W40", | ||
reason: | ||
"Egress IPProtocol of -1 is default and generally considered OK", | ||
}, | ||
]); | ||
return newCacheSG; | ||
} |
97 changes: 97 additions & 0 deletions
97
source/patterns/@aws-solutions-constructs/aws-lambda-elasticachememcached/package.json
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,97 @@ | ||
{ | ||
"name": "@aws-solutions-constructs/aws-lambda-elasticachememcached", | ||
"version": "0.0.0", | ||
"description": "CDK constructs for defining an interaction between an AWS Lambda function and an Amazon Elasticache memcached cache.", | ||
"main": "lib/index.js", | ||
"types": "lib/index.d.ts", | ||
"repository": { | ||
"type": "git", | ||
"url": "https://github.com/awslabs/aws-solutions-constructs.git", | ||
"directory": "source/patterns/@aws-solutions-constructs/aws-lambda-elasticachememcached" | ||
}, | ||
"author": { | ||
"name": "Amazon Web Services", | ||
"url": "https://aws.amazon.com", | ||
"organization": true | ||
}, | ||
"license": "Apache-2.0", | ||
"scripts": { | ||
"build": "tsc -b .", | ||
"lint": "eslint -c ../eslintrc.yml --ext=.js,.ts . && tslint --project .", | ||
"lint-fix": "eslint -c ../eslintrc.yml --ext=.js,.ts --fix .", | ||
"test": "jest --coverage", | ||
"clean": "tsc -b --clean", | ||
"watch": "tsc -b -w", | ||
"integ": "cdk-integ", | ||
"integ-assert": "cdk-integ-assert", | ||
"jsii": "jsii", | ||
"jsii-pacmak": "jsii-pacmak", | ||
"build+lint+test": "npm run jsii && npm run lint && npm test && npm run integ-assert", | ||
"integ-no-clean": "cdk-integ --no-clean", | ||
"snapshot-update": "npm run jsii && npm test -- -u && npm run integ-assert" | ||
}, | ||
"jsii": { | ||
"outdir": "dist", | ||
"targets": { | ||
"java": { | ||
"package": "software.amazon.awsconstructs.services.lambdaelasticachememcached", | ||
"maven": { | ||
"groupId": "software.amazon.awsconstructs", | ||
"artifactId": "lambdas3" | ||
} | ||
}, | ||
"dotnet": { | ||
"namespace": "Amazon.SolutionsConstructs.AWS.LambdaElasticachememcached", | ||
"packageId": "Amazon.SolutionsConstructs.AWS.LambdaElasticachememcached", | ||
"signAssembly": true, | ||
"iconUrl": "https://raw.githubusercontent.com/aws/aws-cdk/master/logo/default-256-dark.png" | ||
}, | ||
"python": { | ||
"distName": "aws-solutions-constructs.aws-lambda-elasticachememcached", | ||
"module": "aws_solutions_constructs.aws_lambda_elasticachememcached" | ||
} | ||
} | ||
}, | ||
"dependencies": { | ||
"@aws-cdk/aws-lambda": "0.0.0", | ||
"@aws-cdk/aws-elasticache": "0.0.0", | ||
"@aws-cdk/aws-ec2": "0.0.0", | ||
"@aws-cdk/core": "0.0.0", | ||
"@aws-solutions-constructs/core": "0.0.0", | ||
"constructs": "^3.2.0" | ||
}, | ||
"devDependencies": { | ||
"@aws-cdk/assert": "0.0.0", | ||
"@types/jest": "^27.4.0", | ||
"@types/node": "^10.3.0" | ||
}, | ||
"jest": { | ||
"moduleFileExtensions": [ | ||
"js" | ||
], | ||
"coverageReporters": [ | ||
"text", | ||
[ | ||
"lcov", | ||
{ | ||
"projectRoot": "../../../../" | ||
} | ||
] | ||
] | ||
}, | ||
"peerDependencies": { | ||
"@aws-cdk/aws-lambda": "0.0.0", | ||
"@aws-cdk/core": "0.0.0", | ||
"@aws-solutions-constructs/core": "0.0.0", | ||
"constructs": "^3.2.0", | ||
"@aws-cdk/aws-ec2": "0.0.0" | ||
}, | ||
"keywords": [ | ||
"aws", | ||
"cdk", | ||
"awscdk", | ||
"AWS Solutions Constructs", | ||
"Amazon Elasticache", | ||
"AWS Lambda" | ||
] | ||
} |
Oops, something went wrong.