diff --git a/packages/@aws-cdk/aws-lambda-go/README.md b/packages/@aws-cdk/aws-lambda-go/README.md index 68c83da46775b..f79d8c8a862ec 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..8a6fc7ece0aa6 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 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)) { 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, }, });