@mikarinneoracle/oci-cdk-code-only-preview 0.0.1 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/package.json +1 -1
  2. package/lib/.gen/providers/oci/identity-dynamic-group/index.d.ts +0 -166
  3. package/lib/.gen/providers/oci/identity-dynamic-group/index.js +0 -408
  4. package/lib/bin/deploy-with-build.js +0 -132
  5. package/lib/test/java-function/aws-cdk/bin/app.d.ts +0 -2
  6. package/lib/test/java-function/aws-cdk/bin/app.js +0 -51
  7. package/lib/test/java-function/aws-cdk/lib/function-stack.d.ts +0 -11
  8. package/lib/test/java-function/aws-cdk/lib/function-stack.js +0 -159
  9. package/lib/test/java-function/aws-cdk/lib/test-function-stack.d.ts +0 -5
  10. package/lib/test/java-function/aws-cdk/lib/test-function-stack.js +0 -94
  11. package/lib/test/java-function/oci-cdk/.gen/providers/oci/apigateway-deployment/index.d.ts +0 -5356
  12. package/lib/test/java-function/oci-cdk/.gen/providers/oci/apigateway-deployment/index.js +0 -14972
  13. package/lib/test/java-function/oci-cdk/.gen/providers/oci/apigateway-gateway/index.d.ts +0 -449
  14. package/lib/test/java-function/oci-cdk/.gen/providers/oci/apigateway-gateway/index.js +0 -1149
  15. package/lib/test/java-function/oci-cdk/.gen/providers/oci/artifacts-container-repository/index.d.ts +0 -217
  16. package/lib/test/java-function/oci-cdk/.gen/providers/oci/artifacts-container-repository/index.js +0 -563
  17. package/lib/test/java-function/oci-cdk/.gen/providers/oci/core-internet-gateway/index.d.ts +0 -176
  18. package/lib/test/java-function/oci-cdk/.gen/providers/oci/core-internet-gateway/index.js +0 -431
  19. package/lib/test/java-function/oci-cdk/.gen/providers/oci/core-route-table/index.d.ts +0 -255
  20. package/lib/test/java-function/oci-cdk/.gen/providers/oci/core-route-table/index.js +0 -644
  21. package/lib/test/java-function/oci-cdk/.gen/providers/oci/core-security-list/index.d.ts +0 -752
  22. package/lib/test/java-function/oci-cdk/.gen/providers/oci/core-security-list/index.js +0 -2091
  23. package/lib/test/java-function/oci-cdk/.gen/providers/oci/core-service-gateway/index.d.ts +0 -220
  24. package/lib/test/java-function/oci-cdk/.gen/providers/oci/core-service-gateway/index.js +0 -543
  25. package/lib/test/java-function/oci-cdk/.gen/providers/oci/core-subnet/index.d.ts +0 -251
  26. package/lib/test/java-function/oci-cdk/.gen/providers/oci/core-subnet/index.js +0 -612
  27. package/lib/test/java-function/oci-cdk/.gen/providers/oci/core-vcn/index.d.ts +0 -270
  28. package/lib/test/java-function/oci-cdk/.gen/providers/oci/core-vcn/index.js +0 -672
  29. package/lib/test/java-function/oci-cdk/.gen/providers/oci/data-oci-core-services/index.d.ts +0 -150
  30. package/lib/test/java-function/oci-cdk/.gen/providers/oci/data-oci-core-services/index.js +0 -386
  31. package/lib/test/java-function/oci-cdk/.gen/providers/oci/functions-application/index.d.ts +0 -330
  32. package/lib/test/java-function/oci-cdk/.gen/providers/oci/functions-application/index.js +0 -821
  33. package/lib/test/java-function/oci-cdk/.gen/providers/oci/functions-function/index.d.ts +0 -322
  34. package/lib/test/java-function/oci-cdk/.gen/providers/oci/functions-function/index.js +0 -820
  35. package/lib/test/java-function/oci-cdk/.gen/providers/oci/provider/index.d.ts +0 -190
  36. package/lib/test/java-function/oci-cdk/.gen/providers/oci/provider/index.js +0 -391
  37. package/lib/test/java-function/oci-cdk/.gen/providers/oci/vault-secret/index.d.ts +0 -439
  38. package/lib/test/java-function/oci-cdk/.gen/providers/oci/vault-secret/index.js +0 -1146
  39. package/lib/test/java-function/oci-cdk/bin/app.d.ts +0 -2
  40. package/lib/test/java-function/oci-cdk/bin/app.js +0 -34
  41. package/lib/test/java-function/oci-cdk/config/oci-config.d.ts +0 -68
  42. package/lib/test/java-function/oci-cdk/config/oci-config.js +0 -202
  43. package/lib/test/java-function/oci-cdk/lib/function-stack.d.ts +0 -31
  44. package/lib/test/java-function/oci-cdk/lib/function-stack.js +0 -549
  45. package/lib/test/java-function/oci-cdk/lib/test-function-stack.d.ts +0 -17
  46. package/lib/test/java-function/oci-cdk/lib/test-function-stack.js +0 -99
@@ -1,132 +0,0 @@
1
- #!/usr/bin/env node
2
- /**
3
- * Deploy flow: when dockerContextPath is set, build and push the image from Node (before Terraform)
4
- * so docker output streams normally and doesn't stall in Terraform local-exec.
5
- * Flow: synth -> terraform init -> apply (repo only) -> build+push -> terraform apply (full).
6
- */
7
-
8
- const { spawnSync } = require('child_process');
9
- const path = require('path');
10
-
11
- const root = path.join(__dirname, '../..'); // package root (lib/bin -> lib -> package root is one up from lib)
12
- const stackName = process.env.OCI_STACK_NAME || 'oci-stack';
13
- const stackDir = path.join(root, 'cdktf.out', 'stacks', stackName);
14
-
15
- function run(cmd, args, opts = {}) {
16
- const r = spawnSync(cmd, args, {
17
- stdio: 'inherit',
18
- cwd: opts.cwd || root,
19
- shell: opts.shell !== false,
20
- env: process.env,
21
- ...opts,
22
- });
23
- if (r.status !== 0) process.exit(r.status ?? 1);
24
- return r;
25
- }
26
-
27
- /** Get OCIR docker token via OCI CLI (no TTY/jq required). Returns { token } or { error }. */
28
- function getOcirTokenFromCli(region, ocirRegistry) {
29
- const uri = `https://${ocirRegistry}/20180419/docker/token`;
30
- const r = spawnSync('oci', ['raw-request', '--region', region, '--http-method', 'GET', '--target-uri', uri], {
31
- encoding: 'utf8',
32
- stdio: ['ignore', 'pipe', 'pipe'],
33
- shell: false,
34
- });
35
- if (r.status !== 0 || !r.stdout) {
36
- return { error: (r.stderr || r.error || 'OCI CLI failed').trim() };
37
- }
38
- try {
39
- const json = JSON.parse(r.stdout.trim());
40
- const token = json && json.data && json.data.token;
41
- return typeof token === 'string' ? { token } : { error: 'No token in response' };
42
- } catch (e) {
43
- return { error: e.message || 'Invalid JSON from OCI' };
44
- }
45
- }
46
-
47
- /** Run docker login with token on stdin (works without TTY). */
48
- function dockerLoginWithToken(ocirRegistry, token) {
49
- const r = spawnSync('docker', ['login', '-u', 'BEARER_TOKEN', '--password-stdin', ocirRegistry], {
50
- input: token,
51
- encoding: 'utf8',
52
- stdio: ['pipe', 'inherit', 'inherit'],
53
- shell: false,
54
- });
55
- return r.status === 0;
56
- }
57
-
58
- async function main() {
59
- const deployArgs = process.argv.slice(2); // pass through --auto-approve etc.
60
-
61
- // Load config (compiled TS: lib/config when developing, config/ when published after prepublish copy)
62
- let configModule;
63
- try {
64
- configModule = require(path.join(root, 'lib/config/oci-config.js'));
65
- } catch {
66
- configModule = require(path.join(root, 'config/oci-config.js'));
67
- }
68
- const getOciConfig = configModule.getOciConfig;
69
- const getOciImageUrl = configModule.getOciImageUrl;
70
- const ocirHostKey = configModule.ocirHostKey;
71
-
72
- const config = await getOciConfig();
73
-
74
- if (!config.dockerContextPath || !config.functionName) {
75
- run('npm', ['run', '--silent', 'deploy', '--', ...deployArgs]);
76
- return;
77
- }
78
-
79
- const imageUrl = getOciImageUrl(config);
80
- const ocirRegistry = `${ocirHostKey(config.region)}.ocir.io`;
81
- const contextPath = path.resolve(config.dockerContextPath);
82
- const namespaceP = config.namespace;
83
- const regionP = config.region;
84
- const ocirUser = process.env.OCI_OCIR_USERNAME || 'AUTO_DETECT';
85
-
86
- console.log('\n--- Synth ---');
87
- run('npm', ['run', '--silent', 'synth', '--']);
88
-
89
- console.log('\n--- Terraform init (stack) ---');
90
- run('terraform', ['init'], { cwd: stackDir });
91
-
92
- console.log('\n--- Create OCIR repository (target apply, auto-approved) ---');
93
- run('terraform', ['apply', '-target=oci_artifacts_container_repository.OcirRepository', '-auto-approve'], { cwd: stackDir });
94
-
95
- console.log('\n--- Docker build ---');
96
- run('docker', ['build', '--platform', 'linux/amd64', '-t', imageUrl, '.'], { cwd: contextPath });
97
-
98
- console.log('\n--- OCIR login ---');
99
- if (process.env.OCI_AUTH_TOKEN) {
100
- const ocirUserVal = ocirUser === 'AUTO_DETECT' ? `${namespaceP}/user` : ocirUser;
101
- const r = spawnSync('docker', ['login', '-u', ocirUserVal, '--password-stdin', ocirRegistry], {
102
- input: process.env.OCI_AUTH_TOKEN,
103
- encoding: 'utf8',
104
- stdio: ['pipe', 'inherit', 'inherit'],
105
- shell: false,
106
- });
107
- if (r.status !== 0) process.exit(r.status ?? 1);
108
- } else {
109
- const result = getOcirTokenFromCli(regionP, ocirRegistry);
110
- const token = result.token;
111
- if (!token) {
112
- console.error('OCIR login failed:', result.error || 'could not get token');
113
- console.error('Set OCI_AUTH_TOKEN or run: oci setup config');
114
- process.exit(1);
115
- }
116
- if (!dockerLoginWithToken(ocirRegistry, token)) {
117
- console.error('Docker login failed.');
118
- process.exit(1);
119
- }
120
- }
121
-
122
- console.log('\n--- Docker push ---');
123
- run('docker', ['push', imageUrl]);
124
-
125
- console.log('\n--- Deploy stack (cdktf) ---');
126
- run('npm', ['run', '--silent', 'deploy', '--', ...deployArgs]);
127
- }
128
-
129
- main().catch((err) => {
130
- console.error(err);
131
- process.exit(1);
132
- });
@@ -1,2 +0,0 @@
1
- #!/usr/bin/env node
2
- import 'source-map-support/register';
@@ -1,51 +0,0 @@
1
- #!/usr/bin/env node
2
- "use strict";
3
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
- if (k2 === undefined) k2 = k;
5
- var desc = Object.getOwnPropertyDescriptor(m, k);
6
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
- desc = { enumerable: true, get: function() { return m[k]; } };
8
- }
9
- Object.defineProperty(o, k2, desc);
10
- }) : (function(o, m, k, k2) {
11
- if (k2 === undefined) k2 = k;
12
- o[k2] = m[k];
13
- }));
14
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
15
- Object.defineProperty(o, "default", { enumerable: true, value: v });
16
- }) : function(o, v) {
17
- o["default"] = v;
18
- });
19
- var __importStar = (this && this.__importStar) || (function () {
20
- var ownKeys = function(o) {
21
- ownKeys = Object.getOwnPropertyNames || function (o) {
22
- var ar = [];
23
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
24
- return ar;
25
- };
26
- return ownKeys(o);
27
- };
28
- return function (mod) {
29
- if (mod && mod.__esModule) return mod;
30
- var result = {};
31
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
32
- __setModuleDefault(result, mod);
33
- return result;
34
- };
35
- })();
36
- Object.defineProperty(exports, "__esModule", { value: true });
37
- require("source-map-support/register");
38
- const cdk = __importStar(require("aws-cdk-lib"));
39
- const function_stack_1 = require("../lib/function-stack");
40
- const app = new cdk.App();
41
- new function_stack_1.FunctionStack(app, 'FunctionStack', {
42
- env: {
43
- account: process.env.CDK_DEFAULT_ACCOUNT,
44
- region: process.env.CDK_DEFAULT_REGION || 'us-east-1',
45
- },
46
- description: 'Stack for Java Lambda function',
47
- pgUrl: process.env.PG_URL,
48
- pgSecretArn: process.env.PG_SECRET_ARN,
49
- });
50
- app.synth();
51
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGVzdC9qYXZhLWZ1bmN0aW9uL2F3cy1jZGsvYmluL2FwcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFDQSx1Q0FBcUM7QUFDckMsaURBQW1DO0FBQ25DLDBEQUFzRDtBQUV0RCxNQUFNLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUUxQixJQUFJLDhCQUFhLENBQUMsR0FBRyxFQUFFLGVBQWUsRUFBRTtJQUN0QyxHQUFHLEVBQUU7UUFDSCxPQUFPLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxtQkFBbUI7UUFDeEMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsa0JBQWtCLElBQUksV0FBVztLQUN0RDtJQUNELFdBQVcsRUFBRSxnQ0FBZ0M7SUFDN0MsS0FBSyxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTTtJQUN6QixXQUFXLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxhQUFhO0NBQ3ZDLENBQUMsQ0FBQztBQUVILEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIiMhL3Vzci9iaW4vZW52IG5vZGVcbmltcG9ydCAnc291cmNlLW1hcC1zdXBwb3J0L3JlZ2lzdGVyJztcbmltcG9ydCAqIGFzIGNkayBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgeyBGdW5jdGlvblN0YWNrIH0gZnJvbSAnLi4vbGliL2Z1bmN0aW9uLXN0YWNrJztcblxuY29uc3QgYXBwID0gbmV3IGNkay5BcHAoKTtcblxubmV3IEZ1bmN0aW9uU3RhY2soYXBwLCAnRnVuY3Rpb25TdGFjaycsIHtcbiAgZW52OiB7XG4gICAgYWNjb3VudDogcHJvY2Vzcy5lbnYuQ0RLX0RFRkFVTFRfQUNDT1VOVCxcbiAgICByZWdpb246IHByb2Nlc3MuZW52LkNES19ERUZBVUxUX1JFR0lPTiB8fCAndXMtZWFzdC0xJyxcbiAgfSxcbiAgZGVzY3JpcHRpb246ICdTdGFjayBmb3IgSmF2YSBMYW1iZGEgZnVuY3Rpb24nLFxuICBwZ1VybDogcHJvY2Vzcy5lbnYuUEdfVVJMLFxuICBwZ1NlY3JldEFybjogcHJvY2Vzcy5lbnYuUEdfU0VDUkVUX0FSTixcbn0pO1xuXG5hcHAuc3ludGgoKTtcbiJdfQ==
@@ -1,11 +0,0 @@
1
- import * as cdk from 'aws-cdk-lib';
2
- import { Construct } from 'constructs';
3
- export interface FunctionStackProps extends cdk.StackProps {
4
- /** PostgreSQL connection URL (same format as OCI: postgresql://user:password@host:port/dbname). When set, stack creates a Secrets Manager secret and passes its ARN to Lambda. Set PG_URL at deploy time. */
5
- readonly pgUrl?: string;
6
- /** When PG_URL is not set: ARN of existing Secrets Manager secret (e.g. RDS-generated JSON secret). Set PG_SECRET_ARN at deploy time. RDS is not created by this stack — create RDS manually in the stack VPC and allow the Lambda security group on port 5432. */
7
- readonly pgSecretArn?: string;
8
- }
9
- export declare class FunctionStack extends cdk.Stack {
10
- constructor(scope: Construct, id: string, props?: FunctionStackProps);
11
- }
@@ -1,159 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
35
- Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.FunctionStack = void 0;
37
- const cdk = __importStar(require("aws-cdk-lib"));
38
- const lambda = __importStar(require("aws-cdk-lib/aws-lambda"));
39
- const apigateway = __importStar(require("aws-cdk-lib/aws-apigateway"));
40
- const secretsmanager = __importStar(require("aws-cdk-lib/aws-secretsmanager"));
41
- const ec2 = __importStar(require("aws-cdk-lib/aws-ec2"));
42
- const rds = __importStar(require("aws-cdk-lib/aws-rds"));
43
- const path = __importStar(require("path"));
44
- class FunctionStack extends cdk.Stack {
45
- constructor(scope, id, props) {
46
- super(scope, id, props);
47
- const pgUrl = props?.pgUrl ?? process.env.PG_URL;
48
- const pgSecretArnFromEnv = props?.pgSecretArn ?? process.env.PG_SECRET_ARN;
49
- const environment = {
50
- PLATFORM: 'AWS',
51
- };
52
- // PG connection: create secret from PG_URL (like OCI) or use existing PG_SECRET_ARN
53
- let pgSecretArn;
54
- if (pgUrl?.trim()) {
55
- const pgSecret = new secretsmanager.Secret(this, 'PgUrlSecret', {
56
- secretName: `function-pg-url-${this.stackName}`,
57
- description: 'PostgreSQL connection URL for function (from PG_URL)',
58
- secretStringValue: cdk.SecretValue.unsafePlainText(pgUrl.trim()),
59
- });
60
- pgSecretArn = pgSecret.secretArn;
61
- environment.PG_SECRET_ARN = pgSecretArn;
62
- }
63
- else if (pgSecretArnFromEnv?.trim()) {
64
- pgSecretArn = pgSecretArnFromEnv.trim();
65
- environment.PG_SECRET_ARN = pgSecretArn;
66
- }
67
- // VPC created by default (like OCI stack VCN) — create RDS manually in this VPC and allow Lambda security group on port 5432
68
- const vpc = new ec2.Vpc(this, 'Vpc', {
69
- maxAzs: 2,
70
- natGateways: 1,
71
- });
72
- // Java Lambda function (in VPC private subnets so it can reach RDS and AWS APIs via NAT). Build JAR first (e.g. ./scripts/build-function.sh aws).
73
- const javaFunction = new lambda.Function(this, 'JavaFunction', {
74
- runtime: lambda.Runtime.JAVA_11,
75
- handler: 'com.example.function.aws.AwsFunctionHandler',
76
- code: lambda.Code.fromAsset(path.join(__dirname, '../../function-code/target/test-function-aws-1.0.0.jar')),
77
- memorySize: 512,
78
- timeout: cdk.Duration.seconds(30),
79
- description: 'Java function compatible with AWS Lambda and OCI Functions',
80
- environment,
81
- vpc,
82
- vpcSubnets: { subnetType: ec2.SubnetType.PRIVATE_WITH_EGRESS },
83
- });
84
- const lambdaSg = javaFunction.connections.securityGroups[0];
85
- // Dedicated security group for RDS: allow PostgreSQL from Lambda (avoids circular dependency from self-referential rule)
86
- const rdsSg = new ec2.SecurityGroup(this, 'RdsSecurityGroup', {
87
- vpc,
88
- description: 'Security group for RDS - allow Lambda on port 5432',
89
- allowAllOutbound: true,
90
- });
91
- rdsSg.addIngressRule(ec2.Peer.securityGroupId(lambdaSg.securityGroupId), ec2.Port.tcp(5432), 'Allow PostgreSQL from Lambda');
92
- // DB subnet group for manual RDS: use this when creating RDS in the console/CLI
93
- const dbSubnetGroup = new rds.SubnetGroup(this, 'DbSubnetGroup', {
94
- description: 'Private subnets for RDS (use when creating RDS in this VPC)',
95
- vpc,
96
- vpcSubnets: { subnetType: ec2.SubnetType.PRIVATE_WITH_EGRESS },
97
- });
98
- if (pgSecretArn) {
99
- const secret = secretsmanager.Secret.fromSecretCompleteArn(this, 'PgSecret', pgSecretArn);
100
- secret.grantRead(javaFunction);
101
- }
102
- // API Gateway REST API
103
- const api = new apigateway.RestApi(this, 'FunctionApi', {
104
- restApiName: 'Java Function API',
105
- description: 'API Gateway for Java function',
106
- defaultCorsPreflightOptions: {
107
- allowOrigins: apigateway.Cors.ALL_ORIGINS,
108
- allowMethods: apigateway.Cors.ALL_METHODS,
109
- allowHeaders: ['Content-Type', 'X-Amz-Date', 'Authorization', 'X-Api-Key'],
110
- },
111
- });
112
- // Lambda integration
113
- const lambdaIntegration = new apigateway.LambdaIntegration(javaFunction, {
114
- requestTemplates: { 'application/json': '{ "statusCode": "200" }' },
115
- });
116
- // Single endpoint with query parameter routing
117
- // Uses query parameter ?action=hello|echo|info instead of path-based routes
118
- api.root.addMethod('GET', lambdaIntegration);
119
- api.root.addMethod('POST', lambdaIntegration);
120
- // Outputs
121
- new cdk.CfnOutput(this, 'ApiUrl', {
122
- value: api.url,
123
- description: 'API Gateway endpoint URL',
124
- exportName: 'FunctionApiUrl',
125
- });
126
- new cdk.CfnOutput(this, 'FunctionName', {
127
- value: javaFunction.functionName,
128
- description: 'Lambda function name',
129
- exportName: 'FunctionName',
130
- });
131
- new cdk.CfnOutput(this, 'FunctionArn', {
132
- value: javaFunction.functionArn,
133
- description: 'Lambda function ARN',
134
- exportName: 'FunctionArn',
135
- });
136
- new cdk.CfnOutput(this, 'VpcId', {
137
- value: vpc.vpcId,
138
- description: 'VPC ID — create RDS in this VPC',
139
- exportName: 'FunctionVpcId',
140
- });
141
- new cdk.CfnOutput(this, 'LambdaSecurityGroupId', {
142
- value: lambdaSg.securityGroupId,
143
- description: 'Lambda security group ID',
144
- exportName: 'FunctionLambdaSecurityGroupId',
145
- });
146
- new cdk.CfnOutput(this, 'RdsSecurityGroupId', {
147
- value: rdsSg.securityGroupId,
148
- description: 'Assign this security group to RDS - stack allows inbound 5432 from Lambda',
149
- exportName: 'FunctionRdsSecurityGroupId',
150
- });
151
- new cdk.CfnOutput(this, 'DbSubnetGroupName', {
152
- value: dbSubnetGroup.subnetGroupName,
153
- description: 'Select this DB subnet group when creating RDS in this VPC',
154
- exportName: 'FunctionDbSubnetGroupName',
155
- });
156
- }
157
- }
158
- exports.FunctionStack = FunctionStack;
159
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnVuY3Rpb24tc3RhY2suanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZXN0L2phdmEtZnVuY3Rpb24vYXdzLWNkay9saWIvZnVuY3Rpb24tc3RhY2sudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsaURBQW1DO0FBRW5DLCtEQUFpRDtBQUNqRCx1RUFBeUQ7QUFDekQsK0VBQWlFO0FBQ2pFLHlEQUEyQztBQUMzQyx5REFBMkM7QUFDM0MsMkNBQTZCO0FBUzdCLE1BQWEsYUFBYyxTQUFRLEdBQUcsQ0FBQyxLQUFLO0lBQzFDLFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBMEI7UUFDbEUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFeEIsTUFBTSxLQUFLLEdBQUcsS0FBSyxFQUFFLEtBQUssSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQztRQUNqRCxNQUFNLGtCQUFrQixHQUFHLEtBQUssRUFBRSxXQUFXLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUM7UUFDM0UsTUFBTSxXQUFXLEdBQTJCO1lBQzFDLFFBQVEsRUFBRSxLQUFLO1NBQ2hCLENBQUM7UUFFRixvRkFBb0Y7UUFDcEYsSUFBSSxXQUErQixDQUFDO1FBQ3BDLElBQUksS0FBSyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUM7WUFDbEIsTUFBTSxRQUFRLEdBQUcsSUFBSSxjQUFjLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxhQUFhLEVBQUU7Z0JBQzlELFVBQVUsRUFBRSxtQkFBbUIsSUFBSSxDQUFDLFNBQVMsRUFBRTtnQkFDL0MsV0FBVyxFQUFFLHNEQUFzRDtnQkFDbkUsaUJBQWlCLEVBQUUsR0FBRyxDQUFDLFdBQVcsQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO2FBQ2pFLENBQUMs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QVMsQ0FBQyxJQUFJLEVBQUUsdUJBQXVCLEVBQUU7WUFDL0MsS0FBSyxFQUFFLFFBQVEsQ0FBQyxlQUFlO1lBQy9CLFdBQVcsRUFBRSwwQkFBMEI7WUFDdkMsVUFBVSxFQUFFLCtCQUErQjtTQUM1QyxDQUFDLENBQUM7UUFFSCxJQUFJLEdBQUcsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLG9CQUFvQixFQUFFO1lBQzVDLEtBQUssRUFBRSxLQUFLLENBQUMsZUFBZTtZQUM1QixXQUFXLEVBQUUsMkVBQTJFO1lBQ3hGLFVBQVUsRUFBRSw0QkFBNEI7U0FDekMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxHQUFHLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxtQkFBbUIsRUFBRTtZQUMzQyxLQUFLLEVBQUUsYUFBYSxDQUFDLGVBQWU7WUFDcEMsV0FBVyxFQUFFLDJEQUEyRDtZQUN4RSxVQUFVLEVBQUUsMkJBQTJCO1NBQ3hDLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRjtBQXhJRCxzQ0F3SUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBjZGsgZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgKiBhcyBsYW1iZGEgZnJvbSAnYXdzLWNkay1saWIvYXdzLWxhbWJkYSc7XG5pbXBvcnQgKiBhcyBhcGlnYXRld2F5IGZyb20gJ2F3cy1jZGstbGliL2F3cy1hcGlnYXRld2F5JztcbmltcG9ydCAqIGFzIHNlY3JldHNtYW5hZ2VyIGZyb20gJ2F3cy1jZGstbGliL2F3cy1zZWNyZXRzbWFuYWdlcic7XG5pbXBvcnQgKiBhcyBlYzIgZnJvbSAnYXdzLWNkay1saWIvYXdzLWVjMic7XG5pbXBvcnQgKiBhcyByZHMgZnJvbSAnYXdzLWNkay1saWIvYXdzLXJkcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEZ1bmN0aW9uU3RhY2tQcm9wcyBleHRlbmRzIGNkay5TdGFja1Byb3BzIHtcbiAgLyoqIFBvc3RncmVTUUwgY29ubmVjdGlvbiBVUkwgKHNhbWUgZm9ybWF0IGFzIE9DSTogcG9zdGdyZXNxbDovL3VzZXI6cGFzc3dvcmRAaG9zdDpwb3J0L2RibmFtZSkuIFdoZW4gc2V0LCBzdGFjayBjcmVhdGVzIGEgU2VjcmV0cyBNYW5hZ2VyIHNlY3JldCBhbmQgcGFzc2VzIGl0cyBBUk4gdG8gTGFtYmRhLiBTZXQgUEdfVVJMIGF0IGRlcGxveSB0aW1lLiAqL1xuICByZWFkb25seSBwZ1VybD86IHN0cmluZztcbiAgLyoqIFdoZW4gUEdfVVJMIGlzIG5vdCBzZXQ6IEFSTiBvZiBleGlzdGluZyBTZWNyZXRzIE1hbmFnZXIgc2VjcmV0IChlLmcuIFJEUy1nZW5lcmF0ZWQgSlNPTiBzZWNyZXQpLiBTZXQgUEdfU0VDUkVUX0FSTiBhdCBkZXBsb3kgdGltZS4gUkRTIGlzIG5vdCBjcmVhdGVkIGJ5IHRoaXMgc3RhY2sg4oCUIGNyZWF0ZSBSRFMgbWFudWFsbHkgaW4gdGhlIHN0YWNrIFZQQyBhbmQgYWxsb3cgdGhlIExhbWJkYSBzZWN1cml0eSBncm91cCBvbiBwb3J0IDU0MzIuICovXG4gIHJlYWRvbmx5IHBnU2VjcmV0QXJuPzogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgRnVuY3Rpb25TdGFjayBleHRlbmRzIGNkay5TdGFjayB7XG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzPzogRnVuY3Rpb25TdGFja1Byb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCBwcm9wcyk7XG5cbiAgICBjb25zdCBwZ1VybCA9IHByb3BzPy5wZ1VybCA/PyBwcm9jZXNzLmVudi5QR19VUkw7XG4gICAgY29uc3QgcGdTZWNyZXRBcm5Gcm9tRW52ID0gcHJvcHM/LnBnU2VjcmV0QXJuID8/IHByb2Nlc3MuZW52LlBHX1NFQ1JFVF9BUk47XG4gICAgY29uc3QgZW52aXJvbm1lbnQ6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICBQTEFURk9STTogJ0FXUycsXG4gICAgfTtcblxuICAgIC8vIFBHIGNvbm5lY3Rpb246IGNyZWF0ZSBzZWNyZXQgZnJvbSBQR19VUkwgKGxpa2UgT0NJKSBvciB1c2UgZXhpc3RpbmcgUEdfU0VDUkVUX0FSTlxuICAgIGxldCBwZ1NlY3JldEFybjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGlmIChwZ1VybD8udHJpbSgpKSB7XG4gICAgICBjb25zdCBwZ1NlY3JldCA9IG5ldyBzZWNyZXRzbWFuYWdlci5TZWNyZXQodGhpcywgJ1BnVXJsU2VjcmV0Jywge1xuICAgICAgICBzZWNyZXROYW1lOiBgZnVuY3Rpb24tcGctdXJsLSR7dGhpcy5zdGFja05hbWV9YCxcbiAgICAgICAgZGVzY3JpcHRpb246ICdQb3N0Z3JlU1FMIGNvbm5lY3Rpb24gVVJMIGZvciBmdW5jdGlvbiAoZnJvbSBQR19VUkwpJyxcbiAgICAgICAgc2VjcmV0U3RyaW5nVmFsdWU6IGNkay5TZWNyZXRWYWx1ZS51bnNhZmVQbGFpblRleHQocGdVcmwudHJpbSgpKSxcbiAgICAgIH0pO1xuICAgICAgcGdTZWNyZXRBcm4gPSBwZ1NlY3JldC5zZWNyZXRBcm47XG4gICAgICBlbnZpcm9ubWVudC5QR19TRUNSRVRfQVJOID0gcGdTZWNyZXRBcm47XG4gICAgfSBlbHNlIGlmIChwZ1NlY3JldEFybkZyb21FbnY/LnRyaW0oKSkge1xuICAgICAgcGdTZWNyZXRBcm4gPSBwZ1NlY3JldEFybkZyb21FbnYudHJpbSgpO1xuICAgICAgZW52aXJvbm1lbnQuUEdfU0VDUkVUX0FSTiA9IHBnU2VjcmV0QXJuO1xuICAgIH1cblxuICAgIC8vIFZQQyBjcmVhdGVkIGJ5IGRlZmF1bHQgKGxpa2UgT0NJIHN0YWNrIFZDTikg4oCUIGNyZWF0ZSBSRFMgbWFudWFsbHkgaW4gdGhpcyBWUEMgYW5kIGFsbG93IExhbWJkYSBzZWN1cml0eSBncm91cCBvbiBwb3J0IDU0MzJcbiAgICBjb25zdCB2cGMgPSBuZXcgZWMyLlZwYyh0aGlzLCAnVnBjJywge1xuICAgICAgbWF4QXpzOiAyLFxuICAgICAgbmF0R2F0ZXdheXM6IDEsXG4gICAgfSk7XG5cbiAgICAvLyBKYXZhIExhbWJkYSBmdW5jdGlvbiAoaW4gVlBDIHByaXZhdGUgc3VibmV0cyBzbyBpdCBjYW4gcmVhY2ggUkRTIGFuZCBBV1MgQVBJcyB2aWEgTkFUKS4gQnVpbGQgSkFSIGZpcnN0IChlLmcuIC4vc2NyaXB0cy9idWlsZC1mdW5jdGlvbi5zaCBhd3MpLlxuICAgIGNvbnN0IGphdmFGdW5jdGlvbiA9IG5ldyBsYW1iZGEuRnVuY3Rpb24odGhpcywgJ0phdmFGdW5jdGlvbicsIHtcbiAgICAgIHJ1bnRpbWU6IGxhbWJkYS5SdW50aW1lLkpBVkFfMTEsXG4gICAgICBoYW5kbGVyOiAnY29tLmV4YW1wbGUuZnVuY3Rpb24uYXdzLkF3c0Z1bmN0aW9uSGFuZGxlcicsXG4gICAgICBjb2RlOiBsYW1iZGEuQ29kZS5mcm9tQXNzZXQoXG4gICAgICAgIHBhdGguam9pbihfX2Rpcm5hbWUsICcuLi8uLi9mdW5jdGlvbi1jb2RlL3RhcmdldC90ZXN0LWZ1bmN0aW9uLWF3cy0xLjAuMC5qYXInKVxuICAgICAgKSxcbiAgICAgIG1lbW9yeVNpemU6IDUxMixcbiAgICAgIHRpbWVvdXQ6IGNkay5EdXJhdGlvbi5zZWNvbmRzKDMwKSxcbiAgICAgIGRlc2NyaXB0aW9uOiAnSmF2YSBmdW5jdGlvbiBjb21wYXRpYmxlIHdpdGggQVdTIExhbWJkYSBhbmQgT0NJIEZ1bmN0aW9ucycsXG4gICAgICBlbnZpcm9ubWVudCxcbiAgICAgIHZwYyxcbiAgICAgIHZwY1N1Ym5ldHM6IHsgc3VibmV0VHlwZTogZWMyLlN1Ym5ldFR5cGUuUFJJVkFURV9XSVRIX0VHUkVTUyB9LFxuICAgIH0pO1xuXG4gICAgY29uc3QgbGFtYmRhU2cgPSBqYXZhRnVuY3Rpb24uY29ubmVjdGlvbnMuc2VjdXJpdHlHcm91cHNbMF0gYXMgZWMyLlNlY3VyaXR5R3JvdXA7XG5cbiAgICAvLyBEZWRpY2F0ZWQgc2VjdXJpdHkgZ3JvdXAgZm9yIFJEUzogYWxsb3cgUG9zdGdyZVNRTCBmcm9tIExhbWJkYSAoYXZvaWRzIGNpcmN1bGFyIGRlcGVuZGVuY3kgZnJvbSBzZWxmLXJlZmVyZW50aWFsIHJ1bGUpXG4gICAgY29uc3QgcmRzU2cgPSBuZXcgZWMyLlNlY3VyaXR5R3JvdXAodGhpcywgJ1Jkc1NlY3VyaXR5R3JvdXAnLCB7XG4gICAgICB2cGMsXG4gICAgICBkZXNjcmlwdGlvbjogJ1NlY3VyaXR5IGdyb3VwIGZvciBSRFMgLSBhbGxvdyBMYW1iZGEgb24gcG9ydCA1NDMyJyxcbiAgICAgIGFsbG93QWxsT3V0Ym91bmQ6IHRydWUsXG4gICAgfSk7XG4gICAgcmRzU2cuYWRkSW5ncmVzc1J1bGUoXG4gICAgICBlYzIuUGVlci5zZWN1cml0eUdyb3VwSWQobGFtYmRhU2cuc2VjdXJpdHlHcm91cElkKSxcbiAgICAgIGVjMi5Qb3J0LnRjcCg1NDMyKSxcbiAgICAgICdBbGxvdyBQb3N0Z3JlU1FMIGZyb20gTGFtYmRhJyxcbiAgICApO1xuXG4gICAgLy8gREIgc3VibmV0IGdyb3VwIGZvciBtYW51YWwgUkRTOiB1c2UgdGhpcyB3aGVuIGNyZWF0aW5nIFJEUyBpbiB0aGUgY29uc29sZS9DTElcbiAgICBjb25zdCBkYlN1Ym5ldEdyb3VwID0gbmV3IHJkcy5TdWJuZXRHcm91cCh0aGlzLCAnRGJTdWJuZXRHcm91cCcsIHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnUHJpdmF0ZSBzdWJuZXRzIGZvciBSRFMgKHVzZSB3aGVuIGNyZWF0aW5nIFJEUyBpbiB0aGlzIFZQQyknLFxuICAgICAgdnBjLFxuICAgICAgdnBjU3VibmV0czogeyBzdWJuZXRUeXBlOiBlYzIuU3VibmV0VHlwZS5QUklWQVRFX1dJVEhfRUdSRVNTIH0sXG4gICAgfSk7XG5cbiAgICBpZiAocGdTZWNyZXRBcm4pIHtcbiAgICAgIGNvbnN0IHNlY3JldCA9IHNlY3JldHNtYW5hZ2VyLlNlY3JldC5mcm9tU2VjcmV0Q29tcGxldGVBcm4odGhpcywgJ1BnU2VjcmV0JywgcGdTZWNyZXRBcm4pO1xuICAgICAgc2VjcmV0LmdyYW50UmVhZChqYXZhRnVuY3Rpb24pO1xuICAgIH1cblxuICAgIC8vIEFQSSBHYXRld2F5IFJFU1QgQVBJXG4gICAgY29uc3QgYXBpID0gbmV3IGFwaWdhdGV3YXkuUmVzdEFwaSh0aGlzLCAnRnVuY3Rpb25BcGknLCB7XG4gICAgICByZXN0QXBpTmFtZTogJ0phdmEgRnVuY3Rpb24gQVBJJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnQVBJIEdhdGV3YXkgZm9yIEphdmEgZnVuY3Rpb24nLFxuICAgICAgZGVmYXVsdENvcnNQcmVmbGlnaHRPcHRpb25zOiB7XG4gICAgICAgIGFsbG93T3JpZ2luczogYXBpZ2F0ZXdheS5Db3JzLkFMTF9PUklHSU5TLFxuICAgICAgICBhbGxvd01ldGhvZHM6IGFwaWdhdGV3YXkuQ29ycy5BTExfTUVUSE9EUyxcbiAgICAgICAgYWxsb3dIZWFkZXJzOiBbJ0NvbnRlbnQtVHlwZScsICdYLUFtei1EYXRlJywgJ0F1dGhvcml6YXRpb24nLCAnWC1BcGktS2V5J10sXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgLy8gTGFtYmRhIGludGVncmF0aW9uXG4gICAgY29uc3QgbGFtYmRhSW50ZWdyYXRpb24gPSBuZXcgYXBpZ2F0ZXdheS5MYW1iZGFJbnRlZ3JhdGlvbihqYXZhRnVuY3Rpb24sIHtcbiAgICAgIHJlcXVlc3RUZW1wbGF0ZXM6IHsgJ2FwcGxpY2F0aW9uL2pzb24nOiAneyBcInN0YXR1c0NvZGVcIjogXCIyMDBcIiB9JyB9LFxuICAgIH0pO1xuXG4gICAgLy8gU2luZ2xlIGVuZHBvaW50IHdpdGggcXVlcnkgcGFyYW1ldGVyIHJvdXRpbmdcbiAgICAvLyBVc2VzIHF1ZXJ5IHBhcmFtZXRlciA/YWN0aW9uPWhlbGxvfGVjaG98aW5mbyBpbnN0ZWFkIG9mIHBhdGgtYmFzZWQgcm91dGVzXG4gICAgYXBpLnJvb3QuYWRkTWV0aG9kKCdHRVQnLCBsYW1iZGFJbnRlZ3JhdGlvbik7XG4gICAgYXBpLnJvb3QuYWRkTWV0aG9kKCdQT1NUJywgbGFtYmRhSW50ZWdyYXRpb24pO1xuXG4gICAgLy8gT3V0cHV0c1xuICAgIG5ldyBjZGsuQ2ZuT3V0cHV0KHRoaXMsICdBcGlVcmwnLCB7XG4gICAgICB2YWx1ZTogYXBpLnVybCxcbiAgICAgIGRlc2NyaXB0aW9uOiAnQVBJIEdhdGV3YXkgZW5kcG9pbnQgVVJMJyxcbiAgICAgIGV4cG9ydE5hbWU6ICdGdW5jdGlvbkFwaVVybCcsXG4gICAgfSk7XG5cbiAgICBuZXcgY2RrLkNmbk91dHB1dCh0aGlzLCAnRnVuY3Rpb25OYW1lJywge1xuICAgICAgdmFsdWU6IGphdmFGdW5jdGlvbi5mdW5jdGlvbk5hbWUsXG4gICAgICBkZXNjcmlwdGlvbjogJ0xhbWJkYSBmdW5jdGlvbiBuYW1lJyxcbiAgICAgIGV4cG9ydE5hbWU6ICdGdW5jdGlvbk5hbWUnLFxuICAgIH0pO1xuXG4gICAgbmV3IGNkay5DZm5PdXRwdXQodGhpcywgJ0Z1bmN0aW9uQXJuJywge1xuICAgICAgdmFsdWU6IGphdmFGdW5jdGlvbi5mdW5jdGlvbkFybixcbiAgICAgIGRlc2NyaXB0aW9uOiAnTGFtYmRhIGZ1bmN0aW9uIEFSTicsXG4gICAgICBleHBvcnROYW1lOiAnRnVuY3Rpb25Bcm4nLFxuICAgIH0pO1xuXG4gICAgbmV3IGNkay5DZm5PdXRwdXQodGhpcywgJ1ZwY0lkJywge1xuICAgICAgdmFsdWU6IHZwYy52cGNJZCxcbiAgICAgIGRlc2NyaXB0aW9uOiAnVlBDIElEIOKAlCBjcmVhdGUgUkRTIGluIHRoaXMgVlBDJyxcbiAgICAgIGV4cG9ydE5hbWU6ICdGdW5jdGlvblZwY0lkJyxcbiAgICB9KTtcblxuICAgIG5ldyBjZGsuQ2ZuT3V0cHV0KHRoaXMsICdMYW1iZGFTZWN1cml0eUdyb3VwSWQnLCB7XG4gICAgICB2YWx1ZTogbGFtYmRhU2cuc2VjdXJpdHlHcm91cElkLFxuICAgICAgZGVzY3JpcHRpb246ICdMYW1iZGEgc2VjdXJpdHkgZ3JvdXAgSUQnLFxuICAgICAgZXhwb3J0TmFtZTogJ0Z1bmN0aW9uTGFtYmRhU2VjdXJpdHlHcm91cElkJyxcbiAgICB9KTtcblxuICAgIG5ldyBjZGsuQ2ZuT3V0cHV0KHRoaXMsICdSZHNTZWN1cml0eUdyb3VwSWQnLCB7XG4gICAgICB2YWx1ZTogcmRzU2cuc2VjdXJpdHlHcm91cElkLFxuICAgICAgZGVzY3JpcHRpb246ICdBc3NpZ24gdGhpcyBzZWN1cml0eSBncm91cCB0byBSRFMgLSBzdGFjayBhbGxvd3MgaW5ib3VuZCA1NDMyIGZyb20gTGFtYmRhJyxcbiAgICAgIGV4cG9ydE5hbWU6ICdGdW5jdGlvblJkc1NlY3VyaXR5R3JvdXBJZCcsXG4gICAgfSk7XG5cbiAgICBuZXcgY2RrLkNmbk91dHB1dCh0aGlzLCAnRGJTdWJuZXRHcm91cE5hbWUnLCB7XG4gICAgICB2YWx1ZTogZGJTdWJuZXRHcm91cC5zdWJuZXRHcm91cE5hbWUsXG4gICAgICBkZXNjcmlwdGlvbjogJ1NlbGVjdCB0aGlzIERCIHN1Ym5ldCBncm91cCB3aGVuIGNyZWF0aW5nIFJEUyBpbiB0aGlzIFZQQycsXG4gICAgICBleHBvcnROYW1lOiAnRnVuY3Rpb25EYlN1Ym5ldEdyb3VwTmFtZScsXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
@@ -1,5 +0,0 @@
1
- import * as cdk from 'aws-cdk-lib';
2
- import { Construct } from 'constructs';
3
- export declare class TestFunctionStack extends cdk.Stack {
4
- constructor(scope: Construct, id: string, props?: cdk.StackProps);
5
- }
@@ -1,94 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
35
- Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.TestFunctionStack = void 0;
37
- const cdk = __importStar(require("aws-cdk-lib"));
38
- const lambda = __importStar(require("aws-cdk-lib/aws-lambda"));
39
- const apigateway = __importStar(require("aws-cdk-lib/aws-apigateway"));
40
- const path = __importStar(require("path"));
41
- class TestFunctionStack extends cdk.Stack {
42
- constructor(scope, id, props) {
43
- super(scope, id, props);
44
- // Java Lambda function
45
- // Uses AwsFunctionHandler for platform-specific implementation
46
- const javaFunction = new lambda.Function(this, 'TestJavaFunction', {
47
- runtime: lambda.Runtime.JAVA_11,
48
- handler: 'com.example.function.aws.AwsFunctionHandler',
49
- code: lambda.Code.fromAsset(path.join(__dirname, '../../function-code/target/test-function-aws-1.0.0.jar')),
50
- memorySize: 512,
51
- timeout: cdk.Duration.seconds(30),
52
- description: 'Test Java function compatible with AWS Lambda and OCI Functions',
53
- environment: {
54
- PLATFORM: 'AWS',
55
- },
56
- });
57
- // API Gateway REST API
58
- const api = new apigateway.RestApi(this, 'TestFunctionApi', {
59
- restApiName: 'Test Java Function API',
60
- description: 'API Gateway for test Java function',
61
- defaultCorsPreflightOptions: {
62
- allowOrigins: apigateway.Cors.ALL_ORIGINS,
63
- allowMethods: apigateway.Cors.ALL_METHODS,
64
- allowHeaders: ['Content-Type', 'X-Amz-Date', 'Authorization', 'X-Api-Key'],
65
- },
66
- });
67
- // Lambda integration
68
- const lambdaIntegration = new apigateway.LambdaIntegration(javaFunction, {
69
- requestTemplates: { 'application/json': '{ "statusCode": "200" }' },
70
- });
71
- // Single endpoint with query parameter routing
72
- // Uses query parameter ?action=hello|echo|info instead of path-based routes
73
- api.root.addMethod('GET', lambdaIntegration);
74
- api.root.addMethod('POST', lambdaIntegration);
75
- // Outputs
76
- new cdk.CfnOutput(this, 'ApiUrl', {
77
- value: api.url,
78
- description: 'API Gateway endpoint URL',
79
- exportName: 'TestFunctionApiUrl',
80
- });
81
- new cdk.CfnOutput(this, 'FunctionName', {
82
- value: javaFunction.functionName,
83
- description: 'Lambda function name',
84
- exportName: 'TestFunctionName',
85
- });
86
- new cdk.CfnOutput(this, 'FunctionArn', {
87
- value: javaFunction.functionArn,
88
- description: 'Lambda function ARN',
89
- exportName: 'TestFunctionArn',
90
- });
91
- }
92
- }
93
- exports.TestFunctionStack = TestFunctionStack;
94
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC1mdW5jdGlvbi1zdGFjay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Rlc3QvamF2YS1mdW5jdGlvbi9hd3MtY2RrL2xpYi90ZXN0LWZ1bmN0aW9uLXN0YWNrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLGlEQUFtQztBQUVuQywrREFBaUQ7QUFDakQsdUVBQXlEO0FBQ3pELDJDQUE2QjtBQUU3QixNQUFhLGlCQUFrQixTQUFRLEdBQUcsQ0FBQyxLQUFLO0lBQzlDLFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBc0I7UUFDOUQsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFeEIsdUJBQXVCO1FBQ3ZCLCtEQUErRDtRQUMvRCxNQUFNLFlBQVksR0FBRyxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLGtCQUFrQixFQUFFO1lBQ2pFLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU87WUFDL0IsT0FBTyxFQUFFLDZDQUE2QztZQUN0RCxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQ3pCLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLHdEQUF3RCxDQUFDLENBQy9FO1lBQ0QsVUFBVSxFQUFFLEdBQUc7WUFDZixPQUFPLEVBQUUsR0FBRyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ2pDLFdBQVcsRUFBRSxpRUFBaUU7WUFDOUUsV0FBVyxFQUFFO2dCQUNYLFFBQVEsRUFBRSxLQUFLO2FBQ2hCO1NBQ0YsQ0FBQyxDQUFDO1FBRUgsdUJBQXVCO1FBQ3ZCLE1BQU0sR0FBRyxHQUFHLElBQUksVUFBVSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsaUJBQWlCLEVBQUU7WUFDMUQsV0FBVyxFQUFFLHdCQUF3QjtZQUNyQyxXQUFXLEVBQUUsb0NBQW9DO1lBQ2pELDJCQUEyQixFQUFFO2dCQUMzQixZQUFZLEVBQUUsVUFBVSxDQUFDLElBQUksQ0FBQyxXQUFXO2dCQUN6QyxZQUFZLEVBQUUsVUFBVSxDQUFDLElBQUksQ0FBQyxXQUFXO2dCQUN6QyxZQUFZLEVBQUUsQ0FBQyxjQUFjLEVBQUUsWUFBWSxFQUFFLGVBQWUsRUFBRSxXQUFXLENBQUM7YUFDM0U7U0FDRixDQUFDLENBQUM7UUFFSCxxQkFBcUI7UUFDckIsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLEVBQUU7WUFDdkUsZ0JBQWdCLEVBQUUsRUFBRSxrQkFBa0IsRUFBRSx5QkFBeUIsRUFBRTtTQUNwRSxDQUFDLENBQUM7UUFFSCwrQ0FBK0M7UUFDL0MsNEVBQTRFO1FBQzVFLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO1FBQzdDLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO1FBRTlDLFVBQVU7UUFDVixJQUFJLEdBQUcsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRTtZQUNoQyxLQUFLLEVBQUUsR0FBRyxDQUFDLEdBQUc7WUFDZCxXQUFXLEVBQUUsMEJBQTBCO1lBQ3ZDLFVBQVUsRUFBRSxvQkFBb0I7U0FDakMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxHQUFHLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxjQUFjLEVBQUU7WUFDdEMsS0FBSyxFQUFFLFlBQVksQ0FBQyxZQUFZO1lBQ2hDLFdBQVcsRUFBRSxzQkFBc0I7WUFDbkMsVUFBVSxFQUFFLGtCQUFrQjtTQUMvQixDQUFDLENBQUM7UUFFSCxJQUFJLEdBQUcsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLGFBQWEsRUFBRTtZQUNyQyxLQUFLLEVBQUUsWUFBWSxDQUFDLFdBQVc7WUFDL0IsV0FBVyxFQUFFLHFCQUFxQjtZQUNsQyxVQUFVLEVBQUUsaUJBQWlCO1NBQzlCLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRjtBQTVERCw4Q0E0REMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBjZGsgZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgKiBhcyBsYW1iZGEgZnJvbSAnYXdzLWNkay1saWIvYXdzLWxhbWJkYSc7XG5pbXBvcnQgKiBhcyBhcGlnYXRld2F5IGZyb20gJ2F3cy1jZGstbGliL2F3cy1hcGlnYXRld2F5JztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5cbmV4cG9ydCBjbGFzcyBUZXN0RnVuY3Rpb25TdGFjayBleHRlbmRzIGNkay5TdGFjayB7XG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzPzogY2RrLlN0YWNrUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHByb3BzKTtcblxuICAgIC8vIEphdmEgTGFtYmRhIGZ1bmN0aW9uXG4gICAgLy8gVXNlcyBBd3NGdW5jdGlvbkhhbmRsZXIgZm9yIHBsYXRmb3JtLXNwZWNpZmljIGltcGxlbWVudGF0aW9uXG4gICAgY29uc3QgamF2YUZ1bmN0aW9uID0gbmV3IGxhbWJkYS5GdW5jdGlvbih0aGlzLCAnVGVzdEphdmFGdW5jdGlvbicsIHtcbiAgICAgIHJ1bnRpbWU6IGxhbWJkYS5SdW50aW1lLkpBVkFfMTEsXG4gICAgICBoYW5kbGVyOiAnY29tLmV4YW1wbGUuZnVuY3Rpb24uYXdzLkF3c0Z1bmN0aW9uSGFuZGxlcicsXG4gICAgICBjb2RlOiBsYW1iZGEuQ29kZS5mcm9tQXNzZXQoXG4gICAgICAgIHBhdGguam9pbihfX2Rpcm5hbWUsICcuLi8uLi9mdW5jdGlvbi1jb2RlL3RhcmdldC90ZXN0LWZ1bmN0aW9uLWF3cy0xLjAuMC5qYXInKVxuICAgICAgKSxcbiAgICAgIG1lbW9yeVNpemU6IDUxMixcbiAgICAgIHRpbWVvdXQ6IGNkay5EdXJhdGlvbi5zZWNvbmRzKDMwKSxcbiAgICAgIGRlc2NyaXB0aW9uOiAnVGVzdCBKYXZhIGZ1bmN0aW9uIGNvbXBhdGlibGUgd2l0aCBBV1MgTGFtYmRhIGFuZCBPQ0kgRnVuY3Rpb25zJyxcbiAgICAgIGVudmlyb25tZW50OiB7XG4gICAgICAgIFBMQVRGT1JNOiAnQVdTJyxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyBBUEkgR2F0ZXdheSBSRVNUIEFQSVxuICAgIGNvbnN0IGFwaSA9IG5ldyBhcGlnYXRld2F5LlJlc3RBcGkodGhpcywgJ1Rlc3RGdW5jdGlvbkFwaScsIHtcbiAgICAgIHJlc3RBcGlOYW1lOiAnVGVzdCBKYXZhIEZ1bmN0aW9uIEFQSScsXG4gICAgICBkZXNjcmlwdGlvbjogJ0FQSSBHYXRld2F5IGZvciB0ZXN0IEphdmEgZnVuY3Rpb24nLFxuICAgICAgZGVmYXVsdENvcnNQcmVmbGlnaHRPcHRpb25zOiB7XG4gICAgICAgIGFsbG93T3JpZ2luczogYXBpZ2F0ZXdheS5Db3JzLkFMTF9PUklHSU5TLFxuICAgICAgICBhbGxvd01ldGhvZHM6IGFwaWdhdGV3YXkuQ29ycy5BTExfTUVUSE9EUyxcbiAgICAgICAgYWxsb3dIZWFkZXJzOiBbJ0NvbnRlbnQtVHlwZScsICdYLUFtei1EYXRlJywgJ0F1dGhvcml6YXRpb24nLCAnWC1BcGktS2V5J10sXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgLy8gTGFtYmRhIGludGVncmF0aW9uXG4gICAgY29uc3QgbGFtYmRhSW50ZWdyYXRpb24gPSBuZXcgYXBpZ2F0ZXdheS5MYW1iZGFJbnRlZ3JhdGlvbihqYXZhRnVuY3Rpb24sIHtcbiAgICAgIHJlcXVlc3RUZW1wbGF0ZXM6IHsgJ2FwcGxpY2F0aW9uL2pzb24nOiAneyBcInN0YXR1c0NvZGVcIjogXCIyMDBcIiB9JyB9LFxuICAgIH0pO1xuXG4gICAgLy8gU2luZ2xlIGVuZHBvaW50IHdpdGggcXVlcnkgcGFyYW1ldGVyIHJvdXRpbmdcbiAgICAvLyBVc2VzIHF1ZXJ5IHBhcmFtZXRlciA/YWN0aW9uPWhlbGxvfGVjaG98aW5mbyBpbnN0ZWFkIG9mIHBhdGgtYmFzZWQgcm91dGVzXG4gICAgYXBpLnJvb3QuYWRkTWV0aG9kKCdHRVQnLCBsYW1iZGFJbnRlZ3JhdGlvbik7XG4gICAgYXBpLnJvb3QuYWRkTWV0aG9kKCdQT1NUJywgbGFtYmRhSW50ZWdyYXRpb24pO1xuXG4gICAgLy8gT3V0cHV0c1xuICAgIG5ldyBjZGsuQ2ZuT3V0cHV0KHRoaXMsICdBcGlVcmwnLCB7XG4gICAgICB2YWx1ZTogYXBpLnVybCxcbiAgICAgIGRlc2NyaXB0aW9uOiAnQVBJIEdhdGV3YXkgZW5kcG9pbnQgVVJMJyxcbiAgICAgIGV4cG9ydE5hbWU6ICdUZXN0RnVuY3Rpb25BcGlVcmwnLFxuICAgIH0pO1xuXG4gICAgbmV3IGNkay5DZm5PdXRwdXQodGhpcywgJ0Z1bmN0aW9uTmFtZScsIHtcbiAgICAgIHZhbHVlOiBqYXZhRnVuY3Rpb24uZnVuY3Rpb25OYW1lLFxuICAgICAgZGVzY3JpcHRpb246ICdMYW1iZGEgZnVuY3Rpb24gbmFtZScsXG4gICAgICBleHBvcnROYW1lOiAnVGVzdEZ1bmN0aW9uTmFtZScsXG4gICAgfSk7XG5cbiAgICBuZXcgY2RrLkNmbk91dHB1dCh0aGlzLCAnRnVuY3Rpb25Bcm4nLCB7XG4gICAgICB2YWx1ZTogamF2YUZ1bmN0aW9uLmZ1bmN0aW9uQXJuLFxuICAgICAgZGVzY3JpcHRpb246ICdMYW1iZGEgZnVuY3Rpb24gQVJOJyxcbiAgICAgIGV4cG9ydE5hbWU6ICdUZXN0RnVuY3Rpb25Bcm4nLFxuICAgIH0pO1xuICB9XG59XG4iXX0=