From 24600b36db302773ce861582c9524a351d6b465a Mon Sep 17 00:00:00 2001 From: Rico Huijbers Date: Wed, 30 Nov 2022 11:01:37 +0100 Subject: [PATCH 1/2] feat(lambda-go): allow configuration of GOPROXY MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit We used to require direct Go package access, because Go proxies may be blocked by corporate network policies (and wouldn't you know it, it actually is at our particular workplace 🙃). This produces a good bit of instability in our CI builds though, as `gopkg.in` website which is used to reference some of our transitive dependencies is regularly experiencing downtime. Make Go proxies configurable and switch them back on in CI builds. --- packages/@aws-cdk/aws-lambda-go/README.md | 13 +++++++++++ .../@aws-cdk/aws-lambda-go/lib/bundling.ts | 6 ++++- .../@aws-cdk/aws-lambda-go/lib/function.ts | 5 +++++ packages/@aws-cdk/aws-lambda-go/lib/types.ts | 22 +++++++++++++++++++ .../cli/sam_cdk_integ_app/lib/test-stack.js | 4 ++++ 5 files changed, 49 insertions(+), 1 deletion(-) diff --git a/packages/@aws-cdk/aws-lambda-go/README.md b/packages/@aws-cdk/aws-lambda-go/README.md index aa805e336b7e0..ff62879aef053 100644 --- a/packages/@aws-cdk/aws-lambda-go/README.md +++ b/packages/@aws-cdk/aws-lambda-go/README.md @@ -170,6 +170,19 @@ new go.GoFunction(this, 'handler', { }); ``` +By default this construct doesn't use any Go module proxies. This is contrary to +a standard Go installation, which would use the Google proxy by default. To +recreate that behavior, do the following: + +```ts +new go.GoFunction(this, 'GoFunction', { + entry: 'app/cmd/api', + bundling: { + goProxies: [go.GoFunction.GOOGLE_GOPROXY, 'direct'], + }, +}); +``` + ## Command hooks It is possible to run additional commands by specifying the `commandHooks` prop: diff --git a/packages/@aws-cdk/aws-lambda-go/lib/bundling.ts b/packages/@aws-cdk/aws-lambda-go/lib/bundling.ts index afc233479ef3b..d30c753df7839 100644 --- a/packages/@aws-cdk/aws-lambda-go/lib/bundling.ts +++ b/packages/@aws-cdk/aws-lambda-go/lib/bundling.ts @@ -106,7 +106,7 @@ export class Bundling implements cdk.BundlingOptions { const cgoEnabled = props.cgoEnabled ? '1' : '0'; - const environment = { + const environment: Record = { CGO_ENABLED: cgoEnabled, GO111MODULE: 'on', GOARCH: props.architecture.dockerPlatform.split('/')[1], @@ -114,6 +114,10 @@ export class Bundling implements cdk.BundlingOptions { ...props.environment, }; + if (props.goProxies) { + environment.GOPROXY = props.goProxies.join(','); + } + // Docker bundling const shouldBuildImage = props.forcedDockerBundling || !Bundling.runsLocally; this.image = shouldBuildImage diff --git a/packages/@aws-cdk/aws-lambda-go/lib/function.ts b/packages/@aws-cdk/aws-lambda-go/lib/function.ts index ec249d6d6790f..130cd3951b7c2 100644 --- a/packages/@aws-cdk/aws-lambda-go/lib/function.ts +++ b/packages/@aws-cdk/aws-lambda-go/lib/function.ts @@ -71,6 +71,11 @@ export interface GoFunctionProps extends lambda.FunctionOptions { * A Golang Lambda function */ export class GoFunction extends lambda.Function { + /** + * The address of the Google Go proxy + */ + public static GOOGLE_GOPROXY = 'https://proxy.golang.org'; + constructor(scope: Construct, id: string, props: GoFunctionProps) { if (props.runtime && (props.runtime.family !== lambda.RuntimeFamily.GO && props.runtime.family != lambda.RuntimeFamily.OTHER)) { throw new Error('Only `go` and `provided` runtimes are supported.'); diff --git a/packages/@aws-cdk/aws-lambda-go/lib/types.ts b/packages/@aws-cdk/aws-lambda-go/lib/types.ts index 28e058e1a685e..c754cbdbcf664 100644 --- a/packages/@aws-cdk/aws-lambda-go/lib/types.ts +++ b/packages/@aws-cdk/aws-lambda-go/lib/types.ts @@ -96,6 +96,28 @@ export interface BundlingOptions { * @default - false */ readonly cgoEnabled?: boolean; + + /** + * What Go proxies to use to fetch the packages involved in the build + * + * Pass a list of proxy addresses in order, and/or the string `'direct'` to + * attempt direct access. + * + * By default this construct uses no proxies, but a standard Go install would + * use the Google proxy by default. To recreate that behavior, do the following: + * + * ```ts + * new go.GoFunction(this, 'GoFunction', { + * entry: 'app/cmd/api', + * bundling: { + * goProxies: [go.GoFunction.GOOGLE_GOPROXY, 'direct'], + * }, + * }); + * ``` + * + * @default - Direct access + */ + readonly goProxies?: string[]; } /** diff --git a/packages/aws-cdk/test/integ/cli/sam_cdk_integ_app/lib/test-stack.js b/packages/aws-cdk/test/integ/cli/sam_cdk_integ_app/lib/test-stack.js index 5294bc0e2b5f8..9df6588f83bd3 100644 --- a/packages/aws-cdk/test/integ/cli/sam_cdk_integ_app/lib/test-stack.js +++ b/packages/aws-cdk/test/integ/cli/sam_cdk_integ_app/lib/test-stack.js @@ -20,6 +20,8 @@ if (process.env.PACKAGE_LAYOUT_VERSION === '1') { var { RetentionDays } = require('aws-cdk-lib/aws-logs'); } +const isRunningOnCodeBuild = !!process.env.CODEBUILD_BUILD_ID; + class CDKSupportDemoRootStack extends Stack{ constructor(scope, id, props) { super(scope, id, props); @@ -99,6 +101,8 @@ class CDKSupportDemoRootStack extends Stack{ entry: './src/go/GoFunctionConstruct', bundling: { forcedDockerBundling: true, + // Only use Google proxy in the CI tests, as it is blocked on workstations + goProxies: isRunningOnCodeBuild ? [GoFunction.GOOGLE_GOPROXY, 'direct'] : undefined, }, }); From ae926215e4fdc943e4ceb884b7f8de8fa28f667f Mon Sep 17 00:00:00 2001 From: Rico Huijbers Date: Wed, 30 Nov 2022 12:41:31 +0100 Subject: [PATCH 2/2] Update function.ts --- packages/@aws-cdk/aws-lambda-go/lib/function.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/@aws-cdk/aws-lambda-go/lib/function.ts b/packages/@aws-cdk/aws-lambda-go/lib/function.ts index 130cd3951b7c2..8a6fc7ece0aa6 100644 --- a/packages/@aws-cdk/aws-lambda-go/lib/function.ts +++ b/packages/@aws-cdk/aws-lambda-go/lib/function.ts @@ -74,7 +74,7 @@ export class GoFunction extends lambda.Function { /** * The address of the Google Go proxy */ - public static GOOGLE_GOPROXY = 'https://proxy.golang.org'; + public static readonly GOOGLE_GOPROXY = 'https://proxy.golang.org'; constructor(scope: Construct, id: string, props: GoFunctionProps) { if (props.runtime && (props.runtime.family !== lambda.RuntimeFamily.GO && props.runtime.family != lambda.RuntimeFamily.OTHER)) {