diff --git a/packages/@aws-cdk/aws-lambda-go/README.md b/packages/@aws-cdk/aws-lambda-go/README.md index e4de2d1641113..b24e72268534c 100644 --- a/packages/@aws-cdk/aws-lambda-go/README.md +++ b/packages/@aws-cdk/aws-lambda-go/README.md @@ -170,6 +170,19 @@ new lambda.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 lambda.GoFunction(this, 'GoFunction', { + entry: 'app/cmd/api', + bundling: { + goProxies: [lambda.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 4c7220ee27dce..ada12836d0833 100644 --- a/packages/@aws-cdk/aws-lambda-go/lib/function.ts +++ b/packages/@aws-cdk/aws-lambda-go/lib/function.ts @@ -74,6 +74,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..9efa41b074ab7 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 lambda.GoFunction(this, 'GoFunction', { + * entry: 'app/cmd/api', + * bundling: { + * goProxies: [lambda.GoFunction.GOOGLE_GOPROXY, 'direct'], + * }, + * }); + * ``` + * + * @default - Direct access + */ + readonly goProxies?: string[]; } /** diff --git a/packages/@aws-cdk/integ-runner/lib/runner/snapshot-test-runner.ts b/packages/@aws-cdk/integ-runner/lib/runner/snapshot-test-runner.ts index 956d392cbea2a..b94c4dafe08c9 100644 --- a/packages/@aws-cdk/integ-runner/lib/runner/snapshot-test-runner.ts +++ b/packages/@aws-cdk/integ-runner/lib/runner/snapshot-test-runner.ts @@ -165,9 +165,11 @@ export class IntegSnapshotRunner extends IntegRunner { // if we are not verifying asset hashes then remove the specific // asset hashes from the templates so they are not part of the diff // comparison + let verifiedAssetHashes = true; if (!this.actualTestSuite.getOptionsForStack(templateId)?.diffAssets) { actualTemplate = canonicalizeTemplate(actualTemplate); expectedTemplate = canonicalizeTemplate(expectedTemplate); + verifiedAssetHashes = false; } const templateDiff = diffTemplate(expectedTemplate, actualTemplate); if (!templateDiff.isEmpty) { @@ -206,7 +208,10 @@ export class IntegSnapshotRunner extends IntegRunner { formatDifferences(writable, templateDiff); failures.push({ reason: DiagnosticReason.SNAPSHOT_FAILED, - message: writable.data, + message: [ + verifiedAssetHashes ? '(asset hashes were verified)' : '(asset hashes were ignored)', + writable.data, + ].join('\n'), testName: this.testName, }); } diff --git a/packages/@aws-cdk/integ-runner/lib/workers/common.ts b/packages/@aws-cdk/integ-runner/lib/workers/common.ts index 0ceb3bfa5786e..4b9841ee10f7f 100644 --- a/packages/@aws-cdk/integ-runner/lib/workers/common.ts +++ b/packages/@aws-cdk/integ-runner/lib/workers/common.ts @@ -300,4 +300,4 @@ export function printLaggards(testNames: Set) { ]; logger.print(chalk.grey(parts.filter(x => x).join(' '))); -} \ No newline at end of file +} 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, }, });