-
Notifications
You must be signed in to change notification settings - Fork 126
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
VPC Naming and Egress Setting #250
Changes from all commits
63b2076
3bdd9c0
18c2cc8
cb3181f
5cb8661
6e18943
938c1cd
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
@@ -24,6 +24,7 @@ module.exports = { | |||||||||||||||||||||||||||||||||||||||||||||||||||||||
validateHandlerProperty(funcObject, functionName); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
validateEventsProperty(funcObject, functionName); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
validateVpcConnectorProperty(funcObject, functionName); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
validateVpcConnectorEgressProperty(funcObject, functionName); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const funcTemplate = getFunctionTemplate( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
funcObject, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -62,6 +63,19 @@ module.exports = { | |||||||||||||||||||||||||||||||||||||||||||||||||||||||
}); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (funcObject.vpcEgress) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
let egress = | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
_.get(funcObject, 'vpcEgress') || _.get(this, 'serverless.service.provider.vpcEgress'); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (egress) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. isn't that check redundant? The whole if will be executed only if |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
egress = egress.toUpperCase(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (egress === 'ALL') egress = 'ALL_TRAFFIC'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (egress === 'PRIVATE') egress = 'PRIVATE_RANGES_ONLY'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
_.assign(funcTemplate.properties, { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
vpcConnectorEgressSettings: egress, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (funcObject.maxInstances) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
funcTemplate.properties.maxInstances = funcObject.maxInstances; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -145,12 +159,39 @@ const validateEventsProperty = (funcObject, functionName) => { | |||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const validateVpcConnectorProperty = (funcObject, functionName) => { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (funcObject.vpc && typeof funcObject.vpc === 'string') { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const vpcNamePattern = /projects\/[\s\S]*\/locations\/[\s\S]*\/connectors\/[\s\S]*/i; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (!vpcNamePattern.test(funcObject.vpc)) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// vpcConnector argument can be one of two possible formats as described here: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// https://cloud.google.com/functions/docs/reference/rest/v1/projects.locations.functions#resource:-cloudfunction | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (funcObject.vpc.indexOf('/') > -1) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const vpcNamePattern = /projects\/[\s\S]*\/locations\/[\s\S]*\/connectors\/[\s\S]*/i; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (!vpcNamePattern.test(funcObject.vpc)) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const errorMessage = [ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
`The function "${functionName}" has invalid vpc connection name`, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
' VPC Connector name should follow projects/{project_id}/locations/{region}/connectors/{connector_name}', | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
' or just {connector_name} if within the same project.', | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
' Please check the docs for more info at ', | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
' https://cloud.google.com/functions/docs/reference/rest/v1/projects.locations.functions#resource:-cloudfunction', | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
].join(''); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
throw new Error(errorMessage); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const validateVpcConnectorEgressProperty = (funcObject, functionName) => { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (funcObject.vpcEgress && typeof funcObject.vpcEgress === 'string') { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This new property should be added to configuration schema in There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. hey! how are you? sorry, I was trying to make these changes since these would be of great help to me. Thank you! There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Hello 👋 The schema for provider and function properties is here: serverless-google-cloudfunctions/provider/googleProvider.js Lines 103 to 129 in e6e0799
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const egress = funcObject.vpcEgress.toUpperCase(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if ( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This check can be achieved by proper schema definition in for |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
egress !== 'ALL' && | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
egress !== 'ALL_TRAFFIC' && | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
egress !== 'PRIVATE' && | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
egress !== 'PRIVATE_RANGES_ONLY' | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const errorMessage = [ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
`The function "${functionName}" has invalid vpc connection name`, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
' VPC Connector name should follow projects/{project_id}/locations/{region}/connectors/{connector_name}', | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
' Please check the docs for more info.', | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
' VPC Connector Egress Setting be either ALL_TRAFFIC or PRIVATE_RANGES_ONLY. ', | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
' You may shorten these to ALL or PRIVATE optionally.', | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
' Please check the docs for more info at', | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
' https://cloud.google.com/functions/docs/reference/rest/v1/projects.locations.functions#resource:-cloudfunction', | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
].join(''); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
throw new Error(errorMessage); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I believe I might be missing something here - if we're only checking for setting on
funcObject
, does that mean that setting on provider level will always be ineffective?